- ベストアンサー
初心者ですがupdateがうまくいかずに困っています
PHPとMysqlで顧客管理ソフトを作っていますが、updateが「会社登録内容の更新を完了しました。」と出るのですが、見てみると変更されていません。どなたか原因を教えて頂けないでしょうか。 require_once("config.php"); //MySQLに接続 if (! $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD)) { exit("MySQLに接続できませんでした!"); } mysql_query("set names sjis"); //データベースを選択・ $selectdb = mysql_select_db($DBNAME,$con); //idに一致するレコード数を取得します。 $sql = "select count(*) as cnt from kaisya where id = $id "; $rst = mysql_query($sql, $con); $col = mysql_fetch_array($rst); $reccnt = $col["cnt"]; mysql_free_result($rst); if ($reccnt > 0){ $sql ="update kaisya set syamei = '" . $syamei ."', yomi = '" . $yomi ."', gyousyu = '" . $gyousyu ."', zip = '" . $zip ."', fuken = '" . $fuken ."', sityou = '" . $sityou ."', tatemono = '" . $tatemono ."', tel = '" . $tel ."', fax = '" . $fax ."', tantou = '" . $tantou ."', yomi1 = '" . $yomi1 ."', yakusyoku = '" . $yakusyoku ."', keitai = '" . $keitai ."', mail = '" . $mail ."', tantou1 = '" . $tantou1 ."', memo = '" . $memo . "' where id = ' $id '" ; $rst = mysql_query($sql, $con); if ($rst) { //成功したとき $body = "<B>会社登録内容の更新を完了しました。</B>"; } else { //失敗したとき $body = mysql_error(); } print "$body<BR><BR><BR><A href='kensaku.php'>検索一覧へ戻る</A>"; } else { //一致するレコードがないとき // $body =mysql_error(); print "<B>間違っています!</B><BR><BR><INPUT type='button' value=' 戻る ' onClick='history.back()'>"; } //MySQLとの接続を閉じます $con = mysql_close($con);
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#2です うーん、全件更新されるということは、やはりWHERE句ですねぇ・・・ 一回、mysql_query関数で発行する前に、 echo $sql."<br>"; で実際に発行されているクエリを確認してください。 (本当は最初にするべきですが・・・) その後MySQLクライアント上で、表示されたSQLを発行してみたり、 逆にどの辺りを変えればきちんと動くのかを確認したほうが良いですね。 きちんと確認できてからPHPのソースの変更点を絞ったほうが良さそうです。 何か変化があったら補足等にお願いします。
その他の回答 (5)
- 39jin
- ベストアンサー率34% (125/359)
update文一つの書き方で何種類かあるものだなとみていました 自分の参考書の書き方を試してみますか・・ 自分のプログラムは生きています $sql ="UPDATE kaisya SET syamei = \"$syamei\", yomi = \"$yomi\", gyousyu = \"$gyousyu\", zip = \"$zip\", fuken = \"$fuken\", sityou = \"$sityou\", tatemono = \"$tatemono\", tel = \"$tel\", fax = \"$fax\", tantou = \"$tantou\", yomi1 = \"$yomi1\", yakusyoku = \"$yakusyoku\", keitai = \"$keitai\", mail = \"$mail\", tantou1 = \"$tantou1\", memo = \"$memo\" WHERE id = $id"; 難しいことは解りません参考までです
お礼
長くお付き合い有難うございました。エラー時のsql文の発行とか色々勉強になりました。 本当に有難うございました。
補足
上記で試しましたが、やはり全レコードが変更になりダメでしたが、選択時のURLを見るとhttp://×.×.×.×/job/edit.php?id=11となり、変更後の受け渡し時に、http://×.×.×.×/job/upd.php?id=idとなるので、id事態をreadonly状態でupd.phpファイルに受け渡してやると変更が出来ました。 チョットかっこ悪いですが、これで行きます。 長い間お付き合いしていただき、本当に有難うございました。どうにか動いてくれました。 結局どこが悪いのかわからないままですが、39jinさんには本当に感謝いたします。いろいろ勉強になりました。
- aoi2008
- ベストアンサー率42% (6/14)
#2です 発行するクエリを $sql ="UPDATE kaisya SET syamei='{$syamei}', yomi='{$yomi}', gyousyu='{$gyousyu}', zip='{$zip}', fuken='{$fuken}', sityou='{$sityou}', tatemono='{$tatemono}', tel='{$tel}', fax='{$fax}', tantou='{$tantou}', yomi1='{$yomi1}', yakusyoku='{$yakusyoku}', keitai='{$keitai}', mail='{$mail}', tantou1='{$tantou1}', memo='{$memo}' WHERE id={$id}" ; でうまくいきませんか? ※id列はINT型ですよね
補足
たびたびありがとうございます。これで試したところ変更されたのですが、全レコードが同じように変更になりました。因みにidはINT型です。
- aoi2008
- ベストアンサー率42% (6/14)
#2です echo mysql_affected_rows()."<br>"; が0だった、ということは UPDATE文を発行した結果、0件変更されたということです。 mysql_query関数はたとえ0件変更だとしても、「0件変更に成功した」ということでtrueが返ってきます。 (だから、変更できてないのに"会社登録内容の更新を完了しました。"と表示される) なので、今回の件に関してはWHERE句の条件指定が正しくないのが原因だと思われます。 見直してみてください
補足
ゴメンナサイ。クオンテーションを付けたり外したり色々試しましたが $sql = "select count(*) as cnt from kaisya where id = $id ";の$id部分に'$id'としたところで一致するレコードがなく、「間違っています!」と出たぐらいです。 mysqlを再インストールしましたが、やはりダメでした。
- aoi2008
- ベストアンサー率42% (6/14)
UPDATE文をmysql_query関数で投げた後に if($rst){ //成功したとき } という処理を行っていますが、この $rst = mysql_query($sql, $con); と if ($rst) { の間に echo mysql_affected_rows()."<br>"; をはさんで、結果を見てみてください。 もしこれが0か-1だった場合はSQL文の組み方が違う(多分WHERE句の指定)、 1以上であれば#1さんがおっしゃっているようにトランザクション関連だと思われます。 その場合は処理の最後に(DBを閉じる前に) mysql_query("COMMIT"); をすれば良いと思いますが・・・、手元に環境が無いので試してみてください
補足
echo・・・を試すと「0」の数字が出ました。その後、mysql_query・・・を試しましたが、変更できていませんでした。
- nfushi
- ベストアンサー率31% (39/122)
自動COMMITがOFFになっているとか?
補足
早速ありがとうございます。初心者なもんで具体的にどのようにすればいいんでしょうか。
お礼
長くお付き合いしていただき有難うございました。aoi2008サンのお陰で、エラーの見つけ方とか色々勉強になりました。有難うございました。
補足
たびたび感謝いたします。 クエリを確認しますと、select count(*) as cnt from kaisya where id=id と出たのでクライアント上でSQLを発行した結果が表になり、cnt(見出し)8(結果)と出ました。(8はレコードの数です) id=idのところをid=$idとしたところ、ERROR 1054(42S22):Unknown column'$id' in 'where clause'と出ました。 id=11としたところでは(11はid NO,)、cnt(見出し)1(結果)と出ました。 id(auto_increment)を認識していないんでしょうか?