前提・実現したいこと
書籍やネットを参考にしながらフォームの練習をしています。
テーブルへ登録は出来ているのですが、簡単なバリデーションが効いていません。
VS codeでデバッグしても問題は発見されませんでした。
if (isset($_POST)が不要なのか、変数の初期化をする必要はないのか、
色々と調べつつ試したのですが壁に突き当たってしまいました。
一体、私はどこで誤りを犯しているのでしょうか?
どなたか是非教えて下さい。
どうぞよろしくお願いいたします。
発生している問題・エラーメッセージ
エラーメッセージ
ページを開くと以下のエラーが出ますが、バリデーションのメッセージは出ません。
エラー:SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id' cannot be null
全て空欄で送信ボタンを押すと、バリデーションのメッセージは出ません。
エラー:SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect integer value: '' for column db名
.table名
.id
at row 1
該当のソースコード
php
1<?php 2if($_POST['submit']) { 3header("Location: {$_SERVER['PHP_SELF']}"); 4exit; 5} 6?> 7<!DOCTYPE html> 8<html lang="ja"> 9 <head> 10 <title>フォームの練習</title> 11 </head> 12 <body> 13 <h1>登録</h1> 14 <form name="form" method="post" action=""> 15 ID:<br> 16 <input type="text" name="id" placeholder="IDを入力して下さい"> 17 <br> 18 氏名:<br> 19 <input type="text" name="name" placeholder="名前を入力して下さい"> 20 <br> 21 メールアドレス:<br> 22 <input type="text" name="email" placeholder="sample@sample.com"> 23 <br> 24 <input type="submit" value="送 信"> 25 </form> 26 27 <?php 28 $db_user = ""; // ユーザー名 29 $db_pass = ""; // パスワード 30 $db_host = ""; // ホスト名 31 $db_name = ""; // データベース名 32 $dsn = "mysql:host=$db_host;dbname=$db_name;charset=utf8"; 33 try { 34 $pdo = new PDO($dsn, $db_user, $db_pass); 35 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 36 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 37 print "接続しました... <br>"; 38 } catch(PDOException $e) { 39 die('エラー :' . $e->getMessage()); 40 } 41 42 //バリデーション 43 $id = ''; 44 $name = ''; 45 $email = ''; 46 47 $errors = []; 48 49 if (isset($_POST)) { 50 if (empty($_POST['id'])) { 51 $errors[] = 'IDは必須項目です。'; 52 } elseif (!preg_match('/\A[0-9]{1,4}+\z/',$_POST['id'])) throw new Exception('半角英数字で入力して下さい。'); 53 54 if (empty($_POST['name'])) { 55 $errors[] = '氏名は必須項目です。'; 56 } 57 58 if (empty($_POST['email'])) { 59 $errors[] = 'Eメールは必須項目です。'; 60 } elseif (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 61 $errors[] = '正しいEメールアドレスを指定してください。'; 62 } 63 } 64 65 //登録 66 try { 67 $pdo->beginTransaction(); 68 $sql = "INSERT INTO ***** (id, name, email) VALUES ( :id, :name, :email )"; 69 $stmh = $pdo->prepare($sql); 70 71 $stmh->bindValue(':id', $_POST['id'], PDO::PARAM_INT ); 72 $stmh->bindValue(':name', $_POST['name'], PDO::PARAM_STR ); 73 $stmh->bindValue(':email', $_POST['email'], PDO::PARAM_STR ); 74 $stmh->execute(); 75 $pdo->commit(); 76 print "データを" . $stmh->rowCount() . "件登録しました。<br>"; 77 } catch (PDOException $e) { 78 $pdo->rollBack(); 79 print "エラー:" . $e->getMessage(); 80 } 81 ?> 82 </body> 83</html> 84
試したこと
色々と調べて、バリデーション部分のコードを書き替えてみました。
VS Codeでデバッグをしました。
POSTの変数の初期化ができないか調べて試しました。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー