こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHPでMySQLデータを呼び出し、whileループの中で別テーブルのデータをループするには

MySQLからuserというテーブルのデータを呼び出し、表示すると同時にフォームとしてデータの変更もできるプログラムを作成しています。
その項目の中に別のusergrというテーブルのデータをリストボックスで表示させたいのですが、うまくいきません。
現状では下記のスクリプトでuserの1番のデータだけが表示されている状態です。(リストボックスも問題なく表示はされていますが…)
まわりに聞ける人もいず、本などを見よう見まねで作成したため、根本的に誤ってるところがあるかと思いますが、どうかアドバイス頂けませんでしょうか。
$sql = "SELECT * FROM user";
$mysql->query($sql);
while($row = $mysql->fetch()){
$no = $row["no"];
$name = $row["name"];
$division = $row["division"];
$email = $row["email"];
$tel = $row["tel"];
$group = $row["group"];
echo <<<EOT
<td align="center">$no</td>
<td align="center"><input type="text" name="name[$no]" value="$name" size="10"></td>
<td align="center"><input type="text" name="division[$no]" value="$division" size="20"></td>
<td align="center"><input type="text" name="email[$no]" value="$email" size="30"></td>
<td align="center"><input type="text" name="tel[$no]" value="$tel" size="10"></td>
<td align="center">
<select name="group[$no]">
EOT;
$sql = "SELECT * FROM usergr LEFT JOIN user ON usergr.grno=user.group";
$mysql->query($sql);
while($row = $mysql->fetch()){
$group = $row["group"];
$grno = $row["grno"];
$grname = $row["grname"];
if($row["grno"]==$group){
echo "<option value=\"{$row['grno']}\" selected=\"selected\">{$row['grname']}</option>";
} else {
echo "<option value=\"{$row['grno']}\">{$row['grname']}</option>";
}
}
echo <<<EOT
</select>
</td>
<td align="center"><input type="submit" name="submit_upd[$no]" value="変更">
<input type="submit" name="submit_del[$no]" value="削除"></td>
</tr>
EOT;
}

投稿日時 - 2008-04-24 15:54:57

QNo.3972723

すぐに回答ほしいです

質問者が選んだベストアンサー

$mysql->query($sql);
ってことは、MySQLを操作するクラスがあるって事でしょうか?
(クラスの実装がわからないので、できればクラスのソースコード、またはクラス仕様をもらえたら幸いです。)

その場合、whileループ内の $mysql->query($sql)とやっている部分は、別のインスタンスで実行してやる必要があります。

1個目だけ表示される理由は、同じインスタンスを利用して その内部のプロパティを書き換えてしまっているからです。
(書き換えてしまっている部分をソース内に記述しておきました。)

たとえば次のような感じになります↓

// この辺りで $mysqlがインスタンス化されているはず。
// たとえば次のように...
// $mysql = new CMySQL();

// テーブル本体を作るためのインスタンス
$mysql = new CMySQL();

$sql = "SELECT * FROM user";
$mysql->query($sql);

// リストボックスを作るためのインスタンス
$mysql2 = new CMySQL();

$sql = "SELECT * FROM usergr LEFT JOIN user ON usergr.grno=user.group";
$mysql2->query($sql);

while($row = $mysql->fetch()){
  $no = $row["no"];
  $name = $row["name"];
  $division = $row["division"];
  $email = $row["email"];
  $tel = $row["tel"];
  $group = $row["group"];

echo <<<EOT
  <td align="center">$no</td>
  <td align="center"><input type="text" name="name[$no]" value="$name" size="10"></td>
  <td align="center"><input type="text" name="division[$no]" value="$division" size="20"></td>
  <td align="center"><input type="text" name="email[$no]" value="$email" size="30"></td>
  <td align="center"><input type="text" name="tel[$no]" value="$tel" size="10"></td>
  <td align="center">
  <select name="group[$no]">
EOT;

/* ---------------- 上で記述したため不要
$sql = "SELECT * FROM usergr LEFT JOIN user ON usergr.grno=user.group";
↓ これが書き換えてしまっています。
$mysql->query($sql);
---------------- */

while($row = $mysql2->fetch()){

  $group = $row["group"];
  $grno = $row["grno"];
  $grname = $row["grname"];

  if($row["grno"]==$group){
    echo "<option value=\"{$row['grno']}\" selected=\"selected\">{$row['grname']}</option>";
  } else {
    echo "<option value=\"{$row['grno']}\">{$row['grname']}</option>";
  }
}

echo <<<EOT
  </select>
  </td>
  <td align="center"><input type="submit" name="submit_upd[$no]" value="変更">
  <input type="submit" name="submit_del[$no]" value="削除"></td>
  </tr>
EOT;

}

わかりにくい点があれば、何なりと~

投稿日時 - 2008-04-24 16:46:18

補足

ありがとうございます!
別ファイルに、クラスの記述がありました。

class MySQL {
  // DB接続(略)
// SQLクエリの処理
function query($sql){
$this->m_Rows = mysql_query($sql, $this->m_con);
if(!$this->m_Rows) {
die("MySQLでエラーが発生しました <br><b>{$sql}</b><br>" .mysql_errno().":".mysql_error());
}
return $this->m_Rows;
}
// 検索結果をfetch
function fetch() {
return mysql_fetch_array($this->m_Rows);
}

// 変更された行の数を得る
//直近の操作で変更された行数の取得
function affected_rows() {
return mysql_affected_rows();
}

// 列数
//結果の列数(フィールド数)の取得
function cols() {
return mysql_num_fields($this->m_Rows);
}
// 行数
//結果の行数を取得
function rows() {
return mysql_num_rows($this->m_Rows);
}
// 検索結果の開放
function free() {
mysql_free_result($this->m_Rows);
}
// MySQLをクローズ
function close() {
mysql_close($this->m_con);
}
// エラーメッセージ
//直近に実行されたMySQL操作のエラーメッセージを返す
function errors() {
return mysql_errno().":".mysql_error();
}
// エラーナンバー
//直近に実行されたMySQLの操作エラー番号を返す
function errorno() {
return mysql_errono();
}
}

投稿日時 - 2008-04-24 17:09:56

お礼

回答ありがとうございます!!
恥ずかしながら本を丸写ししていたため
$mysql->query($sql);が一般的な処理なのだと思ってました…
リストボックス用に新たにクラス?を作成しないといけないんですね。
現在は補足欄のようになっていますが
教えて頂いた「リストボックスを作るためのインスタンス」を追加すれば大丈夫でしょうか?
さっそく試してみます。

投稿日時 - 2008-04-24 17:19:18

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問