前提・実現したいこと
「【PHP】コメントフォームで、データの送信ができず、確認画面から完了画面へと飛べない」の続きです。
「コメント欄」、具体的には「コメントを書き、書いたデータをデータベースに保管し、メールで送信できるシステム」を追加しようと考えています。
とはいえ、今は「書いたデータをデータベースに保管する」「サイトとして問題なく作動する」ことが目的なのでメール送信のコードはまだ書いていない状態です。
MAMPでの入力ですが、ゆくゆくはレンタルサーバーを通して本格的にアップロードもする予定でいます。
なお、実装には以下の書籍及びサイトを参考にさせていただきました。
よくわかるPHPの教科書 【PHP7対応版】 chapter6
【PHP】お問い合わせフォームの作成【コピペOK】
PHPで自動返信メール機能付きのコンタクトフォームを作成する(入力画面)
発生している問題
「index.php」で入力を受け付け、「check.php」でindex.phpから送られてきたセッションを表示。データベース接続を「dbConnect.php」で行っております。
「index.php」で未入力の値がある場合「check.php」のif文でエラーメッセージを表示させた上でindex.phpに飛ばされる仕組みです。
データベースへの送信が終わったら「Receive.php」へ飛びます。
メール機能があればReceive.phpでメールの送信を行う予定です。
付け加え忘れていた「method=POST」を加えてから、一度だけ転送が成功しました。問題はそこからです。
「index.php」から「check.php」までは進めるのですが、index.phpから送られてきた値が表示されなくなってしまったのです。
「値自体は受け取れているが、表示されていないだけ」と思い、値の表示がない状態でそこから無理やり送信してみたのですが「Integrity constraint violation: 1048 Column 'name' cannot be null」とあったため「値が受け取れていない」のではないかと考えます。
もちろん、「NULL」としても送れるように設定する意図はありません。
PHP
1Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null in /Applications/MAMP/htdocs/Sin-portfolioSite/index/check.php:21
該当のソースコード
index.php
PHP
1<?php 2 ini_set('display_errors',1); 3 error_reporting(E_ALL & ~E_NOTICE); 4 session_start(); 5 require('../dbConnect.php'); 6 function h($value){ 7 return htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); 8 } 9 if(!empty($_POST)){ 10 if($_POST['name']==''){ 11 $error['name']='blank'; 12 } 13 if($_POST['mail']==''){ 14 $error['mail']='blank'; 15 } 16 if($_POST['message']==''){ 17 $error['message']='blank'; 18 } 19 if(empty($error)){ 20 $_SESSION['join']=$_POST; 21 header('Location: check.php'); 22 exit(); 23 } 24 } 25 ?> 26 ……… 27(省略) 28……… 29 <section id="form" class="contactForm"> 30 <div class="container"> 31 <div class="h2wrap JQ Q2"> 32 <h2>お問い合わせ</h2> 33 <p>contact</p> 34 </div> 35 <div class="C_FormWrap JQ Q2"> 36 <form action="" class="C_Form clearfix" method="post"> 37 <label for="name"> 38 <input type="text" id="name" name="name" value="<?php echo h($_SESSION['join']['name']) ?>" placeholder="名前"> 39 </label> 40 <?php if(isset($error['name']) && $error['name'] == 'blank'): ?> 41 <p class="error" style="color: red; text-align: left; margin-top: 5px;">*名前を入力してください。</p> 42 <?php endif; ?><!-- .error --> 43 44 <label for="mail"> 45 <input type="text" id="mail" name="mail" value="<?php echo h($_SESSION['join']['mail']) ?>" placeholder="メールアドレス"> 46 </label> 47 <?php if(isset($error['mail']) && $error['mail'] == 'blank'): ?> 48 <p class="error" style="color: red; text-align: left; margin-top: 5px;">*メールアドレスを入力してください。</p> 49 <?php endif; ?><!-- .error --> 50 51 <label for="mes"> 52 <textarea name="message" id="mes" cols="30" rows="7" placeholder="コメントは現在休止中です"><?php echo h($_SESSION['join']['message']) ?></textarea> 53 </label> 54 <?php if(isset($error['message']) && $error['message'] == 'blank'): ?> 55 <p class="error" style="color: red; text-align: left; margin-top: 5px;">*メッセージを入力してください。</p> 56 <?php endif; ?><!-- .error --> 57 58 <label for="retry"><button type="reset" id="retry" name="retry">やり直す</button></label> 59 <label for="subm"><input type="submit" id="subm" name="submit" value="送信"></label> 60 </form> 61 </div> 62 </div> 63 </section> 64 65 66……… 67(省略) 68……… 69
check.php
PHP
1<?php 2 ini_set('display_errors',1); 3 error_reporting(E_ALL & ~E_NOTICE); 4 session_start(); 5 require('../dbConnect.php'); 6 if(!isset($_POST)){ 7 header('Location:index.php'); 8 exit(); 9 } 10 $_SESSION = $_POST; 11 if(!empty($_POST)){ 12 $statement=$db->prepare('INSERT INTO comments SET 13 name = ?, 14 mail = ?, 15 message = ?, 16 created = NOW() 17 '); 18 echo $ret=$statement->execute(array( 19 $_SESSION['join']['name'], 20 $_SESSION['join']['mail'], 21 $_SESSION['join']['message'] 22 )); 23 unset($_SESSION['join']); 24 } 25 26 function h($value){ 27 return htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); 28 } 29 30 ?> 31<!DOCTYPE html> 32<html lang="ja"> 33<head> 34……… 35(省略) 36……… 37</head> 38<body> 39 40 <section id="form" class="contactForm clearfix"> 41 <div class="container"> 42 <div class="h2wrap JQ Q2"> 43 <h2>内容確認</h2> 44 <p>Confirmation of contact</p> 45 </div> 46 <div class="C_FormWrap JQ Q2 clearfix"> 47 <form action="" class="C_Form clearfix" method="post"> 48 <p class="post">名前:<?php echo h($_SESSION['join']['name']); ?></p> 49 <p class="post">メールアドレス:<?php echo h($_SESSION['join']['mail']); ?></p> 50 <p class="post">コメント:<?php echo h($_SESSION['join']['message']); ?></p> 51 <label for=""><a class="retry" href="index.php">やり直す</a></label> 52 <label for="subm"><input type="submit" id="subm" name="submit" value="送信"></label> 53 </form> 54 </div> 55 </div> 56 </section> 57 58 <!-- div.copyright>div.container>p.copyright --> 59 <section class="copyright clearfix"> 60 61 <div class="container"> 62 <p class="copyright">images: freepik</p> 63 <p class="copyright">©kaoru-hanada 2019</p> 64 </div> 65 </section> 66 67<script src="../jQ/swiper.js"></script> 68<script src="../jQ/kaoruPf+Q.js"></script> 69</body> 70</html> 71 72
Receive.php
PHP
1……… 2(省略) 3……… 4<?php 5 ini_set('display_errors',1); 6 error_reporting(E_ALL & ~E_NOTICE); 7 session_start(); 8 require('../dbConnect.php'); 9 if(!$_SESSION){ 10 header('Location: index.php'); 11 } 12……… 13(省略) 14……… 15<!DOCTYPE html> 16<html lang="ja"> 17<head> 18 <meta charset="UTF-8"> 19 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 20 <link rel="stylesheet" type="text/css" href="../styles/check.css"> 21 <link rel="stylesheet" type="text/css" href="../styles/check@media.css"> 22 <link rel="stylesheet" type="text/css" href="../styles/reset.css"> 23 <link rel="stylesheet" type="text/css" href="../styles/swiper.css"> 24 <link rel="stylesheet" type="text/css" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous"> 25 <script src="../jQ/jquery-3.3.1.min.js"></script> 26 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 27 <title>花田香ポートフォリオサイト</title> 28</head> 29<body> 30 31 32 <!-- div.contactForm>div.container>(div.h2wrap>(h2+p))+div.C_FormWrap>(form.C_Form>(label[for=mes]>textarea#mes[name=message])+(label[for=subm]>input#subm[name=submit type=submit value=送信])) --> 33 <section id="form" class="contactForm clearfix"> 34 <div class="container"> 35 <div class="h2wrap JQ Q2"> 36 <h2>送信完了</h2> 37 <p>contact compleated</p> 38 </div> 39 <div class="C_FormWrap JQ Q2 clearfix"> 40 <form action="" class="C_Form C_Comp clearfix"> 41 <p>お問い合わせありがとうございました。</p> 42 <a href="index.php" class="quit">戻る</a> 43 </form> 44 </div> 45 </div> 46 </section> 47 48 <!-- div.copyright>div.container>p.copyright --> 49 <section class="copyright clearfix"> 50 51 <div class="container"> 52 <p class="copyright">images: freepik</p> 53 <p class="copyright">©kaoru-hanada 2019</p> 54 </div> 55 </section> 56 57<script src="../jQ/swiper.js"></script> 58<script src="../jQ/kaoruPf+Q.js"></script> 59</body> 60</html> 61
dbConnect.php
PHP
1<?php 2 3 try{ 4 $db = new PDO('mysql:dbname=HK_PF_commentForm; host=localhost; charset=utf8','root','root'); 5 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION, PDO::ERRMODE_WARNING); 6 } catch(PDOException $e) { 7 echo 'DB接続エラー: '.$e->getMessage(); 8 } 9 ?> 10
試したこと
エラーコードを見ても原因がわからなかったため、googleで「post 空になる」と検索してみました。
その結果、swiftと併用したコードの解説ばかりで目的の情報は見つからない状態です。
補足情報(FW/ツールのバージョンなど)
OS:mac
ブラウザ:chrome(最新のバージョン)
テキストエディタ:atom(ver:1.32.2)
サーバー:MAMP(free)5.2
以下、MAMP内の情報
PHP:7,1.12
mySQL:5.7.23
回答1件
あなたの回答
tips
プレビュー