前提・実現したいこと
表題の著書を使いphpとデータベースと連携しようとしていたらエラーコードが出ました。
開発環境はMAMPでphp7.4.12です。エディターはvscodeです。
発生している問題・エラーメッセージ
Array ( [0] => 42000 [1] => 1064 [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' VALUES (?, ?, ?, ?)' at line 1 ) Fatal error: Uncaught Error: Call to a member function bindValue() on bool in /Applications/MAMP/htdocs/home/form2.php on line 23 データベースのsqlではこの様なエラーメッセージが出力されました。
該当のソースコード
<?php session_start(); if(isset($_POST['token'], $_SESSION['token']) && ($_POST['token'] === $_SESSION['token'])) { unset($_SESSION['token']); $name = $_SESSION['name']; $email = $_SESSION['email']; $subject = $_SESSION['subject']; $body = $_SESSION['body']; $dsn = 'mysql:dbname=contact_form;host=localhost'; $user = 'root'; $password = 'root'; $dbh = new PDO($dsn, $user, $password); $dbh->query('SET NAMES utf8'); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $sql = 'INSERT INTO inquiries (name, email, subject, body) VALUES (?, ?, ?, ?)'; $stmt = $dbh->prepare($sql); print_r($dbh->errorInfo()); $stmt->bindValue(1, $name, PDO::PARAM_STR); **ここが23行目です** $stmt->bindValue(2, $email, PDO::PARAM_STR); $stmt->bindValue(3, $subject, PDO::PARAM_STR); $stmt->bindValue(4, $body, PDO::PARAM_STR); $stmt->execute(); $dbh = null; } else { header('Location: http://localhost/home/index.php'); exit(); } ?>
試したこと
php学習は本書が初めてなので初めから読み直したり、わからない関数を手当たり次第に調べ、スペルミスがないかなどを確認しました。
エラーコードを出力できるように設定してから、どうやらなんらかの原因で変数の値(name, email, subject, body)がbindValueにバインドされず、sqlが実行されているということがわかりました。
とはいえ、何をどうしたらいいのかもわからず・・・
プログラムのソースコードを本書とスペルミスがないかを再三確認しましたが、ミスは無いように見受けられました。
補足情報(FW/ツールのバージョンなど)
vscodeで"nameとsubjectの色"と"emailとbody
の色"が違います。
name,subejectは青色にemail,bodyはオレンジ色なので、nameとsubjectは変数として認識されている、ということなんだと思います・・・
vscodeはデフォルトのダークモードにしてあります。
$sql = 'INSERT INTO inquiries (name, email, subject, body) VALUES (?, ?, ?, ?)';
回答1件
あなたの回答
tips
プレビュー