- PR -

select文で、データ修正時にMySQLに正しく反映されない

1
投稿者投稿内容
Hohoho
会議室デビュー日: 2004/04/27
投稿数: 8
投稿日時: 2004-05-19 13:49
こんにちは。
LinuxサーバーにてMySQLとPHPを使ったHTMLによるシステムを構築中です。
HTMLのフォームのリスト(▼で選ぶタイプ;select)でリストメニュー一覧からセレクトしたデータを送信して、MySQL table1に反映させています。選択するリストのデータも、別のMySQL Table2から引っ張ってきています。
データの登録は上手くいったのですが、データの修正時にエラーになります。

1.正常に登録されたデータを修正のためにHTML画面でPHPからselectコマンドで読み込む。このときフォーム上では、正しいデータ(仮にこれをa01とする)がtable1より読み込まれ表示される。▼の一行目にはa01が入っており、▼を押してみると、その下には選択リストの項目(table2からselectコマンドで読込)が正常に並んでいる。したがって、a01はtable1と table2の両方があり重複表示される。<−これは例えばユーザがa01をb01に変更したい場合の選択肢で、ここでa01やb01をtable2から表示されているものを選んで修正ボタン(MySQL updateコマンドをtable2に対して発行)を押すと正常にtable1に修正が実行される。

問題は下記です。

2.表示項目を何も触らずに修正(上記1と全く同じMySQL updateコマンドをtable2に対して発行)ボタンを押す。

3.MySQLで確認すると、a01の代わりに“row4[category]”というHTML 言語のselect文中の項目名がはいってしまいます。

4.ちなみに、修正字に▼から再度a01(table2からの選択の扱い)を選択して修正した場合は、正しいデータがMySQLに反映されます。しかしこの場合a01は修正したくないわけで、わざわざ▼を押し多くの選択肢の中からa01を選び直すのは、システムとしておかしいですよね。。。


★下にHTML中のPHP select文を添付します。

<select name="maker_name">
<?PHP
if ($row4[maker_name] != "") {
print("<option value='row4[maker_name]'>$row4[maker_name]</option>\n");
} else {
print("<option value='invalid'>--新規登録--</option>\n");
}

$sql = "select maker_name from goods_makers";
$result41 = mysql_query($sql, $con);
$row41 = mysql_num_rows($result41);

$count41 = 1;
for ($i=0;$i<$row41;$i++) { //Creating PopUp LIST from DATA
$tmp41_maker_name[$count41] = mysql_result($result41,$i,0);
print("<option value='$tmp41_maker_name[$count41]'>$tmp41_maker_name[$count41]</option>\n");
$count41++;
}
?>
</select>


★下記が、HTML中のPHPから発行しているMySQLのupdate部です。★

if ($update) { //修正ボタン実行時
$sql = "select * from goods where product_no = '$product_no'";
$result4 = mysql_query($sql, $con);
$row4 = mysql_fetch_array($result4);

if ($row4[product_no] == $product_no) {
$sql = "update goods set
maker_name='$maker_name',

where product_no = '$product_no'";

$result4 = mysql_query($sql, $con);
}
}



以上、よろしくお願いいたします。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-05-19 14:15
4行目(?)で

print("<option value='row4[maker_name]'>$row4[maker_name]</option>\n");

同じような内容で 16行目の場合

print("<option value='$tmp41_maker_name[$count41]'>$tmp41_maker_name[$count41]</option>\n");

$ がついてますが、意図的に4行目の $ を外したのなら、恐らく変数とは見做されず
"row4[make_name]" と表示されるのが「通常処理」ですし、 $ が付いてない事が
「不本意な」状態ならば $ をくっつけて試してみるのも良いかと。

それから、 update文のところで、

if ($row4[product_no] == $product_no) {

この、$row4[product_no] にはselect による結果セットの項目の値が入るかと
思いますが、 ダブルクォートやシングルクォートで囲わなくてもよろしかった
ですかね?

後、私の経験上 $row4['maker_name'] の類は、直接比較したりせずに、一度
バッファに値だけコピーして、コピーされた側の純然たるPHP変数使うとトラブルが
少なくなるような気もしますが。
Hohoho
会議室デビュー日: 2004/04/27
投稿数: 8
投稿日時: 2004-05-20 21:00
コブラさんへ

$でうまくいきました〜!!!
ずーっと悩んでいました、これで又前進できます♪
本当にありがとうございました。

MySQLとPHPを使うときに参考になる技を紹介・解説しているサイトなどをもしもご存知でしたら教えてください。m(_ _)m

コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-05-21 23:05
http://www.bitscope.co.jp/tep/MySQL/quickMySQL.html
ここ、詳しいでしょ?

http://www.spencernetwork.org/link.html
片っ端からリンク辿る(笑)
1

スキルアップ/キャリアアップ(JOB@IT)