実現したいこと
現在PHPでデータベースにデータを登録しようとしていますが、登録されません。
他サイトのデータベースとテーブル作成を見ながら、
自分の登録したいカラムに変更しましたが、データベースに反映されません。
他サイトのコードを試し、phpmyadminに情報登録はされてたのでデータベース情報の記載は
間違えていないと思います。
どうしたらデータベースに登録できるかご教示お願い致します。
データベース
ソースコード
php
<?php // タイムゾーン設定 date_default_timezone_set('Asia/Tokyo'); // 使用する変数を初期化 $name = null; $kana = null; $tel= null; $email = null; $body = null; $message_array = array(); $pdo = null; $stmt = null; $res = null; $option = null; // データベースに接続 try { $option = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_MULTI_STATEMENTS => false ); $pdo = new PDO('mysql:charset=UTF8;dbname=casteria;host=127.0.0.1;port=8111', 'root', '', $option); } catch(PDOException $e) { // 接続エラーのときエラー内容を取得する $error_message[] = $e->getMessage(); } session_start(); if( !empty($_POST['btn_submit']) ) { // エラー内容 $errors = []; if (isset($_POST)) { // 氏名 if (empty($_POST['name'])) { $errors['name'] = '氏名は必須項目です。'; } // フリガナ if (empty($_POST['kana'])) { $errors['kana'] = 'フリガナは必須項目です。'; } // 電話番号 if (preg_match('/^[0-9]+$/', $_POST['tel']) === 0) { $errors['tel'] = '正しい電話番号を入力してください。'; } // メールアドレス if (empty($_POST['email'])) { $errors['email'] = 'メールアドレスは必須項目です。'; } elseif (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { $errors['email'] = '正しいEメールアドレスを指定してください。'; } // お問い合わせ内容 if (empty($_POST['body'])) { $errors['body'] = 'お問い合わせ内容は必須項目です。'; } } if( empty($error_message) ) { // トランザクション開始 $pdo->beginTransaction(); try { // SQL作成 $stmt = $pdo->prepare("INSERT INTO contacts (name, kana, tel, email, body) VALUES (:name, :kana, :tel, :email, :body)"); // 値をセット $stmt->bindValue(':name', $name, PDO::PARAM_STR); $stmt->bindValue(':kana', $kana, PDO::PARAM_STR); $stmt->bindValue(':tel', $tel, PDO::PARAM_STR); $stmt->bindValue(':email', $email, PDO::PARAM_STR); $stmt->bindValue(':body', $body, PDO::PARAM_STR); // SQLクエリの実行 $res = $stmt->execute(); // コミット $res = $pdo->commit(); } catch(Exception $e) { // エラーが発生した時はロールバック $pdo->rollBack(); } // プリペアドステートメントを削除 $stmt = null; } } if( empty($error_message) ) { // メッセージのデータを取得する $sql = "SELECT name,kana,tel,email,body FROM contacts ORDER BY created_at DESC"; $message_array = $pdo->query($sql); } // データベースの接続を閉じる $pdo = null; ?> <!-- ----------------------------------------------------------------------------------------------------- --> <!DOCTYPE html> <html lang="ja"> <head> <title>お問い合わせフォーム</title> <link rel="stylesheet" href="css/text"> </head> <body> <style> body { padding: 20px; text-align: center; } h1 { margin-bottom: 20px; padding: 20px 0; color: #209eff; font-size: 122%; border-top: 1px solid #999; border-bottom: 1px solid #999; } input[type="text"] { padding: 5px 30px; margin: 10px; font-size: 86%; border: none; border-radius: 3px; background: #ddf0ff; } input[name="btn_confirm"], input[name="btn_submit"], input[name="btn_back"] { margin-top: 10px; padding: 5px 20px; font-size: 100%; color: #fff; cursor: pointer; border: none; border-radius: 3px; box-shadow: 0 3px 0 #2887d1; background: #4eaaf1; } input[name="btn_back"] { margin-right: 20px; box-shadow: 0 3px 0 #777; background: #999; } textarea[name="body"] { width: 350px; height: 150px; margin: 10px; font-size: 100%; border: none; border-radius: 3px; background: #ddf0ff; } .error_list { padding: 10px 30px; color: #ff2e5a; font-size: 86%; border: 1px solid #ff2e5a; border-radius: 5px; width: 400px; display: inline-block; } .element_wrap { margin-bottom: 10px; padding: 10px 0; border-bottom: 1px solid #ccc; display: contents; width: 400px; } label { margin: 10px; display: inline-block; margin-bottom: 10px; font-weight: bold; width: 150px; } .element_wrap_p { margin-bottom: 10px; border-bottom: 1px solid #ccc; } /*お問い合わせ内容詳細*/ table{ margin: 50px; width: 60%; text-align: center; display: inline-table; border-collapse: collapse; border-spacing: 0; } th,table td{ padding: 10px 0; text-align: center; } table tr:nth-child(odd){ background-color: #eee } input[name="edit"] { margin-top: 10px; padding: 5px 20px; font-size: 100%; text-align: center; color: #fff; cursor: pointer; border: none; border-radius: 3px; box-shadow: 0 3px 0 #01a001; background: #02be02; } input[name="delete"] { margin-top: 10px; padding: 5px 20px; font-size: 100%; text-align: center; color: #fff; cursor: pointer; border: none; border-radius: 3px; box-shadow: 0 3px 0 #a70202; background: #e70404; } </style> <!-- --------------------------------------------------------------------------------------------- --> <h1> 入力画面</h1> <p>* は必須項目です</p> <?php if(!empty($errors) ): ?> <ul class="error_list"> <?php foreach( $errors as $value ): ?> <li><?php echo $value; ?></li> <?php endforeach; ?> </ul> <?php endif; ?> <form action= "" method="post"> <div class="row"> <!-- 氏名 --> <div class="element_wrap"> <label for="name">*氏名</label> <input type="text" name="name" id="name" placeholder="例)入力太郎" value="<?php if( !empty($_POST['name']) ){ echo $_POST['name']; } ?>"><br> </div> <!-- フリガナ --> <div class="element_wrap"> <label for="kana">*フリガナ</label> <input type="text" name="kana" id="kana" placeholder="例)ニュウリョクタロウ" value="<?php if( !empty($_POST['kana']) ){ echo $_POST['kana']; } ?>"><br> </div> <!-- 電話番号 --> <div class="element_wrap"> <label for="tel">電話番号</label> <input type="text" name="tel" id="tel" placeholder="例)08011112222" value="<?php if( !empty($_POST['tel']) ){ echo $_POST['tel']; } ?>"><br> </div> <!-- メールアドレス --> <div class="element_wrap"> <label for="email">*メールアドレス</label> <input type="text" name="email" id="email" placeholder="例)nyuuryoku11@mail.com" value="<?php if( !empty($_POST['email']) ){ echo $_POST['email']; } ?>"><br> </div> <!-- お問い合わせ内容 --> <div class="element_wrap"> <label for="body">*お問い合わせ内容</label><br> <textarea rows="10" name="body" id="body" ><?php if (!empty($_POST['body'])){ echo nl2br($_POST['body']); } ?></textarea><br> </div> <input name = "btn_submit" type="submit" value="入力内容を確認する"> </div> </form> <!-- -------------------------------------(入力画面)お問い合わせ内容詳細------------------------------------- --> <form method="post"> <table> <th>氏名</th> <th>フリガナ</th> <th>電話番号</th> <th>メールアドレス</th> <th>お問い合わせ内容</th> <th></th> <th></th> <tr> <?php if( !empty($message_array) ){ ?> <?php foreach( $message_array as $value ){ ?> <td><p><?php echo $value['name']; ?></p></td> <td><p><?php echo $value['kana']; ?></p></td> <td><p><?php echo $value['tel']; ?></p></td> <td><p><?php echo $value['email']; ?></p></td> <td><p><?php echo $value['body']; ?></p></td> <td><input type="submit" name= "edit" value="編集"></td> <td><input type="submit" name= "delete" value="削除"></td> <?php } ?> <?php } ?> </tr> </table> </form> </body> </html>
ロールバックだけではなく、exception内容を出力してエラー詳細を確認してください
exception $eのエラーが以下になります。
PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null in C:\xampp\xampp\htdocs\geekation_php_advanced-main-PHP-\PHP応用_演習\Views\contact2.php:82 Stack trace: #0 C:\xampp\xampp\htdocs\geekation_php_advanced-main-PHP-\PHP応用_演習\Views\contact2.php(82): PDOStatement->execute() #1 C:\xampp\xampp\htdocs\geekation_php_advanced-main-PHP-\PHP応用_演習\public\index.php(8): require_once('C:\\xampp\\xampp\\...') #2 {main}

$name = null; のあと、誰も値を詰めていないのでは? $_POSTに含まれるフォーム受信データを検証はしていても、変数の詰め替えまではしていないようで。
php-gresさん、ご返信ありがとうございます。
ご指摘の内容を記載したら、見事にデータが反映され、データが表示されました。
ありがとうございます。
単に変数に格納してなかっただけでした。
まだ回答がついていません
会員登録して回答してみよう