PHPでmysqlへの書き込みでエラー
PHPとmysqlを最近勉強し始めました。
PHPでmysqlへデータベースの書き込みをする時に変数からデータを書き込むとエラーが出て、どうしてなのかが色々と検索してみたのですが、解決できずにいます。
どなたかご教示ください。
弁当の注文を把握するために作りました。
mysqlには
ソースは以下の通りです。
表示だけなら、全項目表示は出来ます。
データベースに書き込みんで貯めたいのですが、phpmyadminでデータを記入し、SQL実行ならできました。
mysqlには order というテーブルに
orderid int(5)
syain varchar(11)
syohinmei varchar(11)
kingaku int(11)
timestamp datetime
上記のカラムが作成してあります。
<?php
$gokojo = $_GET['gokojo'];
$syain = $_GET['syain'];
$bento = $_GET['bento'];
$orderkojo = $_GET['orderkojo'];
$syohinmei = $_GET['syohinmei'];
$kingaku = $_GET['kingaku'];
$db_user = "naka"; // ユーザー名
$db_pass = "naka"; // パスワード
$db_host = "192.168.0.9"; // ホスト名
$db_name = "bento"; // データベース名
$db_type = "mysql"; // データベースの種類
$dsn = "$db_type:host=$db_host;dbname=$db_name;charset=utf8";
try {
$pdo = new PDO($dsn, $db_user,$db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch(PDOException $Exception) {
die('エラー :' . $Exception->getMessage());
}
$timestamp = date("Y-m-d H:i:s") ;
try {
$pdo->beginTransaction();
$sql = 'INSERT INTO order(syain,syohinmei,kingaku,timestamp) VALUES("'.$syain.'","'.$syohinmei.'",'.$kingaku.',"'.$timestamp.'")';
$stmh = $pdo->prepare($sql);
$stmh->bindValue(':syain',$syain,PDO::PARAM_STR);
$stmh->bindValue(':syohinmei',$syohinme,PDO::PARAM_STR);
$stmh->bindValue(':kingaku',$kingaku,PDO::PARAM_INT);
$stmh->bindValue(':timestamp',$timestamp,PDO::PARAM_STR);
$stmh->execute();
$pdo->commit();
print "データを更新しました。<br>";
} catch (PDOException $Exception) {
$pdo->rollBack();
print "エラー:" . $Exception->getMessage();
}
?>
エラーは以下の通りです。
エラー:SQLSTATE[42000]: Syntax error or access violation: 1064 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 'order(syain,syohinmei,kingaku,timestamp) VALUES("中川","サンマ弁当",450,"' at line 1
Syntax error なので、コマンドの間違えなのだろうと思いますが、解決できません。
同じことを二回してますが、片方ずつでやってもダメなので、色々試してます。
よろしくお願いします。
お礼
お返事ありがとうございます。 全く原因がわからず半分やけでxamppを再インストールしたところ 普通に結果を取得できました^^; 確かに方法としては「$sth->execute(array($name));」もありですよね! 自分で書いておきながらですが、executeの前にbindValueするメリットって あるんでしょうか? bindValueだと型を指定できるので、より厳密になるとかしか思いつきません・・・