質問: 現在、「気づけばプロ並み PHP改訂版」(著 谷藤賢一)を使い、 ショッピングサイトの模擬サイトを作成中です。 現在、チャプター3章において、 商品をデータベースに追加しようとしていますが、 try部分を抜け、catch部分にいってしまい、 データベースにデータが蓄積されません。 ちなみに、チャプター2でも同様に名前等をデータベースに蓄積することができましたので、 mysqlへのアクセスはできていて、 sqlに間違いがあるのかと考えています。 サンプルソースをコピペして使ってみても、うまくいかない状況です。 質問に対して、不足している情報がありましたら、 ご指摘いただけましたら幸いです。 よろしくお願いします。 ### 発生している問題・エラーメッセージ ただいま障害により大変ご迷惑をお掛けしております。 ### 該当のソースコード ろくまる農園 setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql='INSERT INTO mst_product(name,price) VALUES (?,?)'; $stmt=$dbh->prepare($sql); $data[]=$pro_name; $data[]=$pro_price; $stmt->execute($data); $dbh=null; print $pro_name; print 'を追加しました。'; } catch(Exception$e) { print'ただいま障害により大変ご迷惑をお掛けしております。'; exit(); } ?> 戻る
回答: ボリューミーですみません。 ``` catch(Exception$e) { print'ただいま障害により大変ご迷惑をお掛けしております。'; exit(); } ``` の箇所を一旦 ``` catch(Exception $e) { echo $e->getMessage(); exit(); } ``` などとすれば、例外で捕まえた状況をhtml出力に込められるはず。 それと、パソコンの中で動作確認をしていて、 webサーバーがXAMPPのApacheであれば C:\xampp\apache\logs にあるであろう、error_logに手がかりがありそう。 それと、本に書いてないかもしれないけど、 webサーバーがXAMPPのApacheであれば C:\xampp\php にあるphp.iniにて、 > > display_errors = On > > error_reporting = E_ALL > > > を書き加えるとエラー発生時にwebブラウザ上にエラーメッセージが表示されるようになるので おすすめ。 PHPのエラー表示設定について - Qiita にはphpコード内でini_set()にて指定する方法も紹介されているけど、 phpコードの文法エラーがあるとき困るので、なるべくphp.iniや.htaccessに記述する方法をお試しください。 テーブルmst_productは存在するか、 カラム名name,priceは存在するか、 カラム名nameは文字列型だと察すると格納可能なサイズを超えていないか、 カラム名priceは数値型だと察するに数値として扱えない記号を含んでいないか、 省略しているカラム名があるならそれらにはautoincrement指定やdefault指定があるか、 などの確認もどうぞ。 で、老婆心ながら。 写経したコードがベストプラクティスだとは言い切れない。 ``` $pro_name=htmlspecialchars($pro_name); $pro_price=htmlspecialchars($pro_price); ``` htmlspecialcharsって、 html出力用に加工するものであって、 データベースに格納するデータに使うべきではないのです。 例えば&→&amp;とか”→&quot;とか(正確にはすべて半角記号です)に置き換えてしまうので、 データベースでSELECT文を実行するときに「&」を含むつもりで検索すると「"」も引っかかってきます。 「何故htmlspecialcharsを通すのか?」を一言でどうぞ - Qiita を読んで理解していただけたなら、 PHP で h() を書くなら一緒に echo しよう。 - こせきの技術日記 を読んでこちらのやり方で使ったほうが良いかと提案します。