PHPでmysqlへの書き込みでエラー

このQ&Aのポイント
  • PHPでmysqlへデータベースの書き込みをする時に変数からデータを書き込むとエラーが出て、どうしてなのかが色々と検索してみたのですが、解決できずにいます。
  • mysqlにはソースは以下の通りです。 表示だけなら、全項目表示は出来ます。 データベースに書き込みんで貯めたいのですが、phpmyadminでデータを記入し、SQL実行ならできました。 mysqlには order というテーブルに orderid int(5) syain varchar(11) syohinmei varchar(11) kingaku int(11) timestamp datetime 上記のカラムが作成してあります。
  • エラー: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 なので、コマンドの間違えなのだろうと思いますが、解決できません。同じことを二回してますが、片方ずつでやってもダメなので、色々試してます。
回答を見る
  • ベストアンサー

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 なので、コマンドの間違えなのだろうと思いますが、解決できません。 同じことを二回してますが、片方ずつでやってもダメなので、色々試してます。 よろしくお願いします。

  • MySQL
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

$sql = 'INSERT INTO order(syain,syohinmei,kingaku,timestamp) VALUES("'.$syain.'","'.$syohinmei.'",'.$kingaku.',"'.$timestamp.'")'; ↓ $sql = 'INSERT INTO order(syain,syohinmei,kingaku,timestamp) VALUES(:syain,:syohinmei,:kingaku,:timestamp)';

nakacchi0614
質問者

お礼

ありがとうございます。 記入方法の考え方の勉強になりました。

nakacchi0614
質問者

補足

回答を頂き、色々考え直して再度記入方法を試してみました。 結果、初心者故にやってしまっているアホな間違いを発見しました。 テーブル名が order これって、予約語だったんですね。 phpmyadminでデータ挿入して`(バッククォート)が付いてて、そのままコマンドラインで実行したら出来たのですが、`を消すと同じエラーが出ました。色々試した結果、バッククォートで括って実行したら出来たので、テーブル名を変更したらエラーがなくなり解決しました。 一人で考えてたら、解決できなかったと思います。 ありがとうございました! ちなみに以下のように変更しました。 $sql = 'INSERT INTO order(syain,syohinmei,kingaku,timestamp) VALUES("'.$syain.'","'.$syohinmei.'",'.$kingaku.',"'.$timestamp.'")'; ↓ $sql = "INSERT INTO `order` (`syain`, `syohinmei`, `kingaku`, `timestamp`) VALUES('$syain','$syohinmei','$kingaku','$timestamp')"; 予約語使ってることが分かったので、テーブル名を変更して。 $sql = "INSERT INTO tyumon (syain,syohinmei,kingaku,timestamp) VALUES('$syain','$syohinmei','$kingaku','$timestamp')"; これで問題なくなりました。 大枠の’を”にしたのは、変数展開できていなかったので変更しました。 勉強になりました。ありがとうございました。

その他の回答 (1)

回答No.1

VALUES("'.$syain.'","'.$syohinmei.'",'.$kingaku.',"'.$timestamp.'")'; ↓ VALUES("':syain.'","':syohinmei.'",':kingaku.',"':timestamp.'")';

nakacchi0614
質問者

お礼

ありがとうございます。 コマンドの書き方の勉強になりました。

関連するQ&A

  • PHP(prepareについて)

    html(fromタグ)→php(fromの受取)→db(データベース)→php(出力) ということをやりたいのです。htmlからの送信はできているのですが、 エラーがphp文の中にあるexecute();メゾッド部分に起こります。どうすれば直りますか? PHP <?php try{ $dbh=new PDO("mysql:dbname=blog;host=localhost","root",""); $sth=$dbh->prepare("select * from id where id=:id"); $sth=$sth->bindValue(":id",2,PDO::PARAM_STR); $sth=$sth->execute(); $result=$sth->fetchALL(); print_r($result); }catch(Exception $e){echo $e->getMessage();} ?>

    • ベストアンサー
    • PHP
  • コードの終端にエラー???php

    いつもお世話になり誠にありがとうございます。 標記の件。 エラーメッセージは次です。 ( ! ) Parse error: syntax error, unexpected end of file in /srv/www/htdocs/blog.php on line 98 コードは97行になります。 どうか教えてください。 アドバイスを宜しくお願い申し上げます。      記 <?php require_once('dbc.php'); class Blog extends Dbc { protected $table_name = 'blog'; //カテゴリー名を表示 //引数:数字 //返り値:カテゴリーの文字列 public function setCategoryName($category) { if ($category == '1') { return '日常'; } elseif ($category == '2') { return '非日常'; } else { return 'その他'; } } public function blogCreate($blogs) { $sql = "INSERT INTO blog(title,content,category,publish_status) VALUES (:title, :content, :category, :publish_status)"; $dbh = $this->dbConnect(); $dbh->biginTransaction(); try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':title', $blogs['title'], PDO::PARAM_STR); $stmt->bindValue(':content', $blogs['content'], PDO::PARAM_STR); $stmt->bindValue(':category', $blogs['category'], PDO::PARAM_INT); $stmt->bindValue(':publish_status', $blogs['publish_status'], PDO::PARAM_INT); $stmt->bindValue(':id', $blogs['id'], PDO::PARAM_INT); $stmt->execute(); $stmt->commit(); echo 'ブログを投稿しました!'; } catch (PDOException $e) { $dbh->rollBack(); exit($e); } function blogUpdate($blogs) { $sql = "UPDATE $this->table_name SET title = :title, content = :content, category = :category, publish_status = :publish_status Where id = :id"; $dbh = dbConnect(); $dbh->biginTransaction(); try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':title', $blogs['title'], PDO::PARAM_STR); $stmt->bindValue(':content', $blogs['content'], PDO::PARAM_STR); $stmt->bindValue(':category', $blogs['category'], PDO::PARAM_INT); $stmt->bindValue(':publish_status', $blogs['publish_status'], PDO::PARAM_INT); $stmt->bindValue(':id', $blogs['id'], PDO::PARAM_INT); $stmt->execute(); $stmt->commit(); echo 'ブログを更新しました!'; } catch (PDOException $e) { $dbh->rollBack(); exit($e); } } function blogUpdate($blogs){ } //ブログのバリデーション function blogValidate($blogs) { if (empty($blogs['title'])) { exit('タイトルを入力してください。'); } if (mb_strlen($blogs['title']) > 191) { exit('タイトルは191文字以下にしてください。'); } if (empty($blogs['content'])) { exit('本文を入力してください。'); } if (empty($blogs['category'])) { exit('カテゴリーは必須です。'); } if (empty($blogs['publish_status'])) { exit('公開ステータスは必須です。'); } } ?>

    • ベストアンサー
    • PHP
  • PHPからSQL文で〇〇か〇〇か〇〇という時に

    PHPからMYSQLに問い合わせでご質問です。 実行している文です(SELECT文から) SELECT * FROM users WHERE id = ? AND level = ?' ))); $stmt->bindValue(1, $id, PDO::PARAM_INT); $stmt->bindValue(2, $level, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetchAll(); } このような感じでユーザーIDとユーザーのレベルを判別しているものですが、IDはセッションを入れレベルに2と3と4の人を抽出という場合がわからずご質問させて頂きました。 ORを使って WHERE id = ? AND level = ? OR id = ? AND level = ? OR id = ? AND level = ? OR id = ? AND level = ? $stmt->bindValue(1, $id, PDO::PARAM_INT); $stmt->bindValue(2, $level, PDO::PARAM_INT); $stmt->bindValue(3, $id, PDO::PARAM_INT); $stmt->bindValue(4, $level, PDO::PARAM_INT); $stmt->bindValue(5, $id, PDO::PARAM_INT); $stmt->bindValue(6, $level, PDO::PARAM_INT); のような感じで当てはめたいものを書くのかと思ったり、もっときれいな書き方というか正しい書き方がありそうな気がしてご質問させて頂いた限りです。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • mySQLでINSERT Errorとなります。

    初心者です。よろしくお願いいたします。 データを入れたいのですが、エラーとなってしまいます。 以下でデータベースとテーブルを作成し、 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } $sql = 'CREATE DATABASE tori'; if (mysql_query($sql, $db)) { echo "データベースtori の作成に成功しました\n"; } else { echo 'データベースtoriの作成に失敗しました: ' . mysql_error() . "\n";} mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $query ="create table {$tbl_name} ( id char(8) primary key, date TEXT, sex TEXT, age TEXT )TYPE=MyISAM"; mysql_query($query); $query ="INSERT INTO `houzingpark`.`hatogaya` ( id , date , sex , iro ) VALUES ( '2', 'uu', 'ii', 'po' )"; mysql_close($db); ?> 以下で入れ込みたいのですが、出来ないのです。 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $sql="INSERT INTO hatogaya ( id , date , sex , iro ) VALUES ( 3, 2005-12-3, mesu, cya )"; mysql_query($sql); if(!$result){print 'INSERT Error!';} echo $sql; mysql_close($db); ?> でINSERTしようとするのですが、INSERT Error!と表示されてしまいます。 Adminで見るとデータベースとテーブルは出来ているのですが、どうしてもINSERTできないのです。 もう何時間も悪戦苦闘しております。 どなたかご指導よろしくお願いいたします。

  • PDOでMYSQL

    WHERE区の値をbindValueしているのですが、結果が取得できません。 ちなみにエラーになるわけでも文字化けを起こすわけでもありません。 $name = '太郎'; $sql = 'SELECT * FROM table WHERE name = :name; $sth = $dbh->prepare($sql); $sth->bindValue(':name', $name, PDO::PARAM_STR); $sth->execute(); $result = $sth->fetchAll(); print_r($result); いろいろ試してたところ、日本語だと結果を取得しないようで SQLデータの「太郎」となっていた箇所を「tarou」に変更し 変数の部分だけ変更したところ結果を取得できました。 $name = 'tarou; 基本の構文は合っていると思うのですが単純に日本語の指定が できないのでしょうか? PHPとMYSQLは全てUTF-8でバージョンは下記の通りです。 PHP:5.3.8 MYSQL:Client API version mysqlnd 5.0.8-dev - 20102224 - $Revision: 310735 $ PDO: PDO drivers mysql, odbc, sqlite, sqlite2 Client API version mysqlnd 5.0.8-dev - 20102224 - $Revision: 310735 $

    • ベストアンサー
    • PHP
  • MySQLでのエラー

    MySQLのコマンド画面で、データベースを作成しています。 そこで、WEB上を参考にして打ち込んでみたところ ERROR 1064: You have an error in your SQL syntax. Check the manual that corresp onds to your MySQL server version for the right syntax to use near ')' at line 1 とでます。 僕が打ち込んだ文は以下のとおりです。 mysql> create database odinms; です。 間違いなどがあればご指摘お願いします。

  • PHP PDO execute のsql

    $sql = "select count(*) as ..........."; $PDOStatement = $pdo->prepare($sql); $PDOStatement ->bindValue(':id', $dat, PDO::PARAM_INT); $PDOStatement -> execute(); のような場合に、実際に問い合わせが行われたSQLはどうやって取得できますか?

    • ベストアンサー
    • PHP
  • Windows、Apache、PHP、MySQLを使ったwebアプリケーションのエラー

    widows環境でMySQLで作ったデータベースをApache+PHPでwebページで見れるようにしたいと思い、 http://www.yamada-lab.org/doc/win/mysql5/4/0401.html#a2 このページの通りに進めていました (データベースの内容は少し変更しました) しかし、いざページを開いてみると 「Parse error: syntax error, unexpected T_STRING in C:\test\connect01.php on line 8」 とでてきて、うまく表示されません。 syntax errorなので、文法ミスだとは思いますが、どこが違うかがわからないので、どなたか教えてください。 使用しているPCは   OS:Windows XP professional MySQL:5.1.38 PHP:5.2.10 apache:2.2.13 です。 --以下、connect01.phpの中身の途中まで-- <html> <head> <title>connect.php</title> </head> <body> <?php  //データベースサーバ名の設定  $db_host  = "localhost";  //ユーザ名の設定  $db_user  = "webapl";  //パスワードの設定  $db_passwd = "pass1234";  //データベースサーバへの接続  $db = mysql_connect($db_host,$db_user,$db_passwd); ---- エラーが出ているのは、「 $db_host  = "localhost";」の行ですが、 サーバー名、ユーザー名、パスワードに関する3項目を消し、 データベースサーバへの接続を $db = mysql_connect(localhost,webapl,pass1234); と書きかえても、この行でエラーが出ていました。

    • ベストアンサー
    • PHP
  • PHP disconnect()でエラー

    WAMP初級者です。 いままでPEAR::DBを使って書いていたサイトがあり、PDOを利用するように書き換えています。 画面が真っ白になる現象に陥り、他の投稿によりご指導いただき、画面にエラーが表示されるようになったものの、エラーの対処方法がわからず、どなたかご指導いただければと思います。 コードを一つずつコメントアウトして画面が真っ白になるポイントをさぐったところ、問題の箇所がみつかりました。(ここをコメントアウトすると画面がちゃんと表示され、コメントアウトしないとエラーのみの白い画面がでてしまいます。) ●問題の記述 $connection->disconnect(); ●表示されるエラー Fatal error: Call to undefined method PDO::disconnect() in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\test\test2.php on line 406 そもそもこの記述は必要ないのでしょうか? このページ自体は、あるDBからユーザーが検索をした結果が表示されるページになっていて、 まず、以下のように接続をしています。 // 接続 $connection = new PDO('mysql:host=127.0.0.1;dbname=test_db;charset=utf8','root','root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, ) ); そのあと、クエリをくみたて、prepareして、値をbindValueしてexecuteして、テーブルを表示させるようにしています。 不特定多数のユーザーが検索をするので、事が終えたらdisconnectしないとダメなんじゃないかな、と思ってつけてみたんですが。。特に不要なのでしょうか。 初歩的な質問ですみませんが、どなたお助けいただけますと幸いです。 環境はApache/2.2.4 (Win32) PHP/5.4.22です 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHP pdo データが無い場合とある場合

    tablename( id int not null, name text not null, age int ); 的なテーブルがあったとして、id番号と名前は必ずデータがあるが、年齢はデータがあったり無かったりするとします。 $id = 1; $name = "太郎"; $age = ""; だったり $age = "25";だったり シンプルにinsert 書きたいのですが、やはり$ageが空文字の場合と数字で構成される文字の場合でわけないと書けないでしょうか? $sql = "insert into tablename( id,name,age) values (:id,:name,:age); $stmt = $pdo->prepare($sql); $stmt->bindValue(":id", $id, PDO::PARAM_INT); $stmt->bindValue(":name", null, PDO::PARAM_STR); if ($age === "") { $stmt->bindValue(":age ", null, PDO::PARAM_NULL); } else { $stmt->bindValue(":age ", $age , PDO::PARAM_INT); } とわけないと無理?

    • 締切済み
    • PHP