やっと解決できたので備忘録として。
PHPでMySQLへデータを挿入するINSERT文を使ってて
うまく実行されませんでした。が結論から言うと
ものすごくしょーもないことが原因でした…。
結構時間を取られたのですが、
原因の特定方法は同じようなエラーで困っている方に参考になるかもしれません。
INSERT文で実行しても反映されない
まず何をしようとしていたかというと
新規アカウント登録画面を作り、入力された内容をデータベースへ登録させる
というプログラムを書いていました。
以下が問題のコード(一部抜粋)です。
include(“database.php”);
$stmt=$db->prepare(
“INSERT INTO account_info(email, name, password)
VALUES(:email, :name, :password) ”
);
$stmt->bindParam(‘:email’, $email, PDO:: PARAM_STR);
$stmt->bindParam(‘:name’, $name, PDO:: PARAM_STR);
$stmt->bindParam(‘:password’, $password, PDO:: PARAM_STR);
$stmt->execute();
include文のところはnew PDOでデータベースへアクセスする部分です。
INSERT文でaccount_infoテーブルに
フォームから入力されたE-mail、名前、パスワードを挿入しようとしたのですが、
実行してみてもテーブルに何も追加されないという症状になりました。
INSERTされない原因は何だったのか
結論だけ述べます。
$nameの変数名を間違えていました。
実際の入力フォームの名前が入る変数名が
$nameでなく$account_nameだったのです。
うーんほんとにしょーもない原因ですね…。
ただ他のコードでも変数の名前を間違えていたことがあったので、
意外と同じような失敗経験がある方は多いのではないでしょうか。
原因を特定するために
コードを眺めるだけでは間違っている箇所の特定は難しいです。
今回試したことその①
$stmt->execute();のところで簡単なif文で判定を作ってみました。
$check=$stmt->execute();
if($check){
print’成功!’;
}else{
print’失敗!’;
}
とすることで最終的にデータベースへの挿入が実行されたかどうかを確かめます。
ブラウザ上で失敗!と出ていたのでやはり挿入失敗しているようです。
(ちなみにデータベースへの接続でも同チェックをしましたが、
こちらは成功!だったのでデータベース接続はうまくいっていました。)
今回試したことその②
$emailなどの変数に値を入れてみました。
bindParamの直前にコードを入れています。
$email=testuser@localhost;
$name=testname;
$password=testpassword;
$stmt->bindParam(‘:email’, $email, PDO:: PARAM_STR);
$stmt->bindParam(‘:name’, $name, PDO:: PARAM_STR);
$stmt->bindParam(‘:password’, $password, PDO:: PARAM_STR);
$stmt->execute();
すると成功!と表示されMySQLで確認してもきちんとデータが挿入されていました。
となるとこのあたりが怪しいということで
$email, $name, $passwordの行を1つずつ消して確認しました。
そして最終的に$nameという変数じゃなく
$account_nameという変数をフォームでは使用していたということが分かりました。
いやーこれだけのミスで特定に苦労させられました。
教訓
時間を取られましたが無事データベースに入力した値を挿入させることができました。
やはりプログラムが思い通りに動いたときは嬉しいものです。
PHPでは実行時にエラーがあるとブラウザ上でエラー内容を表示してくれます。
ただ、今回のようなミスの場合はエラーメッセージが出ません。
エラーメッセージが出ないとミスの特定が少し面倒になると思います。
今回のように簡単なif文で判定を作ってみたり、
怪しい変数の受け渡しのところで、
変数に仮の値を代入してみたりするのはアリだと思いました。
(実際には他にも色々試したりGoogleで検索したりしました。)
プログラムを書いていてエラーに遭遇するのは当たり前だと思いますが、
そこで原因の特定と対処を迅速にできれば
優秀なプログラマーになれるのではないかと思います。