- 締切済み
UPDATEできない
PHP初心者です。 先日より、PHPプログラムを勉強しており、「参照」、「追加」、「修正」、「削除」の一連の流れを理解しました。 スタッフ登録をするという仮定で、上記流れをPHPでできるようになり、データベースの更新もできるようになりました。 登録 → 表示 や、一覧を表示して、ラジオボタンで選んだスタッフの情報修正などです。 現在、上記流れの延長として、商品の登録から、修正、削除に挑戦していますが、情報修正時、ページはスタッフ登録と同じように最後までエラー無く進みますが、データベースが更新されません。 何故初心者の為、解決策の探し方すら判らない為困っています。 どなたかお解りになる方、恐れ入りますがご教授頂ければ幸いです。 データを修正するソースです <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>どっとこむ</title> </head> <body> <?php try { $pro_code = $_POST['code']; $pro_name = $_POST['name']; $pro_price = $_POST['price']; $pro_code = htmlspecialchars($pro_code); $pro_name = htmlspecialchars($pro_name); $pro_pass = htmlspecialchars($pro_price); $dsn = 'mysql:dbname=xxxx;host=xxxxx'; $user = 'userid'; $password = 'password'; $dbh = new PDO($dsn,$user, $password); $dbh->query('SET NAMES utf8'); $sql = 'UPDATE mst_productSET name=?,price=? WHERE code=?'; $stmt = $dbh->prepare($sql); $data[]=$pro_name; $data[]=$pro_price; $data[] = $pro_code; $stmt->execute($data); $dbh = null; print 'を追加しました。<br />'; } catch (Exception $e) { print'ただいま障害により大変ご迷惑をお掛けしております。'; exit(); } ?> <a href="pro_list.php">戻る</a> </body> </html> 上記表示される前のページ(修正する情報を入力するページ)から、上記ページまではデータが渡っている状態です。 <?php print $pro_name; ?> のようにすると、渡された文字列が表示されます。 わかり難い説明で恐縮です。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- agunuz
- ベストアンサー率65% (288/438)
ツッコミどころ満載ですが、それについてはすでに指摘がありますね 根本的な問題として、 >$sql = 'UPDATE mst_productSET name=?,price=? WHERE code=?'; $sql = 'UPDATE mst_product SET name=?,price=? WHERE code=?'; でないとマズイのでは?
訂正 PDO::ATTR_USE_BUFFERED_QUERY => true ↓ PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
下の記事をよくお読みください。 PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 念のためダメ出しを書いておきます。 > $pro_code = $_POST['code']; > $pro_name = $_POST['name']; > $pro_price = $_POST['price']; スクリプトに直接アクセスされた場合に備え、issetによるチェックを最低限行ってください。未定義であった場合はRuntimeExceptionなどの例外をスローさせましょう。issetに加えてis_stringで文字列であるか(!is_arrayで配列でないか)チェックする処理もはさむとベターです。 > $pro_code = htmlspecialchars($pro_code); > $pro_name = htmlspecialchars($pro_name); > $pro_pass = htmlspecialchars($pro_price); データベースに挿入する文字列に対してHTML特殊文字をエスケープする処理は行わないでください。データベース用のエスケープ処理はPDOのプリペアドステートメントが担う役割なので、あなたは何も考える必要はありません。HTML特殊文字をエスケープする処理は実際にechoする直前に行ってください。 > $dsn = 'mysql:dbname=xxxx;host=xxxxx'; charset指定も行ってください。 > $dbh = new PDO($dsn,$user, $password); 第4引数の連想配列オプションで最低限 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION は渡してください。今回のようにUPDATEに失敗したときなどにも例外がスローされるようになります。加えて、MySQLの自動的な型変換、例えばDATEカラムに「あいうえお」という文字列が「0000-00-00」に変換されて無理矢理挿入されるのを避け、例外を発生させて処理を中断したい場合は PDO::MYSQL_ATTR_INIT_COMMAND => "SET SESSION sql_mode='TRADITIONAL'" も入れてください。今回は関係ありませんが、追加で PDO::ATTR_USE_BUFFERED_QUERY => true PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC を入れておくとSELECTを扱う際に使い勝手がよくなります。 > $dbh->query('SET NAMES utf8'); $dsnで指定し、SET NAMESは使わないでください。 > $data[] = $pro_name; > $data[] = $pro_price; > $data[] = $pro_code; > $stmt->execute($data); $pro_priceと$pro_codeは文字列じゃなくて整数のカラムですよね?もしそうであればこのままだとMySQL側で発生する文字列型から整数型への変換でパフォーマンスが低下してしまうので、 $stmt->bindValue(1, $pro_name, PDO::PARAM_STR); $stmt->bindValue(2, $pro_price, PDO::PARAM_INT); $stmt->bindValue(3, $pro_code, PDO::PARAM_INT); $stmt->excecute(); の方がベターです。executeを使っても全く問題ないのは、渡すパラメータが全て「文字列」カラムに対応するときだけです。 > $dbh = null; これは(好みですが)書かなくてもいいです。後ろに続く処理が文字列を少量出力するだけなので、ここでデータベースと切断しても、最後にデータベースと切断しても全く差がありません。
- rootPC
- ベストアンサー率53% (8/15)
php,mysqlは使ったことが無いので間違っているかもしれないけど、comiitはいらないのかな?
お礼
貴重なお時間をありがとうございます。 ご教授頂いたURL先、アドバイス頂いた内容を読み返しましたが、いまいち当方では理解できない内容でした。 折角ご回答頂いたのに申し訳ありません。 ただ、なんとなく現状のプログラムでは、問題があることはわかりました(^^; ありがとうございます。