
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;
}
No.1ベストアンサー
- 回答日時:
$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;
}
わかりにくい点があれば、何なりと~
この回答への補足
ありがとうございます!
別ファイルに、クラスの記述がありました。
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();
}
}
回答ありがとうございます!!
恥ずかしながら本を丸写ししていたため
$mysql->query($sql);が一般的な処理なのだと思ってました…
リストボックス用に新たにクラス?を作成しないといけないんですね。
現在は補足欄のようになっていますが
教えて頂いた「リストボックスを作るためのインスタンス」を追加すれば大丈夫でしょうか?
さっそく試してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHP 10件表示 "前へ" "次へ"
-
検索結果をgoogleのように数件...
-
phpのParse errorについて
-
mysql_fetch_assoc()の非推奨
-
mysql_fetch_objectの書き方を...
-
DBで検索結果に該当するデータ...
-
dbに登録したデータをphpのプル...
-
エクセルをMysqlに格納
-
jspでMysql検索で困っています。
-
カラムにデータがあるかないか...
-
JSPで、sessionのタイムアウト...
-
stringaddslashes 半角¥が消える
-
Yomi-search(PHP)を設置する...
-
PHPのUndefined index や varia...
-
phpにて出欠登録管理を作成して...
-
検索表示について
-
mysql_query等でレコード数を変...
-
SQL文の連結が、うまくいきません
-
縦に長い<table>でなく横に長い...
-
SQL文2つ実行
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アラートでyes noを作りたいです。
-
PHPで[]の使い方について
-
dbに登録したデータをphpのプル...
-
python pandas 行ごとに列名(...
-
DBで検索結果に該当するデータ...
-
大変困っております。PHP ...
-
sqlで受け取った緯度経度から地...
-
SELECT結果から動的にコンボボ...
-
sortable ギブアップです…助け...
-
チェックボックスでチェックし...
-
php ログインフォーム作成
-
MySQLに保存した画像を表示したい
-
DBで指定した値しか存在しない...
-
checkboxで複数選択して,OR...
-
文字化けが解決できません。お...
-
mysqlから取得した配列をカンマ...
-
1ヶ月以内に誕生日を迎える社員...
-
配列としてMysqlから値を取得す...
-
phpでmysqlを使ってデータベー...
-
チェックボックスによる複数の...
おすすめ情報