質問: 'From: xxx@xxx.co.jp'; mb_language('Japanese'); mb_internal_encoding("UTF-8"); mb_send_mail($postCOMMENT,$mail_sub,$mail_body,$mail_head); $sql='INSERT INTO anketo(nickname,email,comment) VALUES("'.$postNN.'","'.$postEMAIL.'","'.$postCOMMENT.'")'; $stmt=$dbh->prepare($sql); $stmt->execute(); $dbh=null; ?> ``` 次に、ファイルの構成です。 このファイル内で、それぞれ「check_2.php」が「index.html」、「ifset.php」が「check.php」にあたります。「thanks.php」は本書と同じです。 ``` input -----------$ ls check_2.php ifset.php input.php thanks.php ``` phpMyAdmin ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/789a19504ec5be2a1c82a7f9fd6ec9a9.png) データベース名は「phpkiso」、テーブル名は「anketo」です。 ### 試したこと 基本的に本書の通りにコードは入力したので、スペルやクォーテーションのチェックを行いました。 ただし、クォーテーションは変えてしまうとサンクスページ自体表示できなくなってしまいます。 google検索も試しましたが、本書でつまずいた内容が乗っていることは少なく、目当ての情報も見つかりませんでした。 ### 最終目標 冒頭でもあげた通り、解答を入力してサンクスページまで進んだ後、サンクスページにまで来たデータを「code」2番目のデータとしてテーブルに追加されるようにすることです。 要は、「アンケート回答者がフォームから送ってきた解答をphpMyAdminで管理できるようにする」ことが最終目標です。 ### 補足情報(FW/ツールのバージョンなど) OS:mac ブラウザ:chrome(最新のバージョン) テキストエディタ:atom(ver:1.32.2) サーバー:MAMP(free)5.2 以下、MAMP内の情報 PHP:7,1.12 mySQL:5.7.23
回答: この内容だけだと再現確認が難しいですし、問題の切り分けも出来ません。 DBに関する処理を行うときは、言ってしまえば外部の仕組みを使うわけですから、 try-catchを利用して異常を検知するようにしてください。 基本的に、ですがPHPの構文としてまずいことがない限り外部の仕組みのエラーは error_reportingの設定では感知できないことが殆どです。 ``` PHP基礎 '; echo 'ご意見ありがとうございました!'; echo ''; echo '頂いたご意見『'; echo $postCOMMENT; echo '』'; echo ''; echo $postEMAIL.'にメールをお送りしたのでご確認ください。'; $mail_sub = 'アンケートを受け付けました。'; $mail_body = $postNN."様へ/nアンケートご協力ありがとうございました。"; $mail_body = html_entity_decode($mail_body,ENT_QUOTES,"UTF-8"); $mail_head = 'From: xxx@xxx.co.jp'; mb_language('Japanese'); mb_internal_encoding("UTF-8"); mb_send_mail($postCOMMENT,$mail_sub,$mail_body,$mail_head); $sql='INSERT INTO anketo(nickname,email,comment) VALUES("'.$postNN.'","'.$postEMAIL.'","'.$postCOMMENT.'")'; $stmt=$dbh->prepare($sql); $stmt->execute(); $dbh=null; }catch(PDOException $e){ var_dump($e); } ``` >teratail:PHP、PDOの例外処理について ただ、この処理内容は他にもよくないところが幾つもあります。 「必ず成功する前提」のプログラムはかなり危険です。何かで失敗することを前提で、その対策を適宜してください。 1. mb_send_mail()より前に「メールを送りました」と文言を出している メール送信成功するかどうか分かりませんよね。せめて返り値(bool)を確認してから画面表示しましょう。 2. ↑と同様、DB登録も成功するかどうか分かりません。正否確認をしてから画面表示しましょう。 3. pdo利用しているのに一切エスケープせずにそのままSQL文に突っ込んでいる。 SQLインジェクションの概念を学んでください。 PDOでしたらbindValueなどを活用しましょう。 蛇足: ご提示の書籍、調べたところ2011年発売ですよね? 今PHP7.1.12でされているのでしたらPHPのバージョン合わないと思いますし、当時でているPHPのバージョンは基本的に軒並みサポート終了しているはずなので、入門とはいえ、あまりそのままで進めないほうがいいように思います。