MySQLのPDO接続でINSERT文が書き込めない理由について

このQ&Aのポイント
  • MySQLのPDO接続を使用してデータベースにアクセスする際、SELECT文では問題なくデータを取得できるが、INSERT文を使用してデータを追加することができず困っている。
  • PDO接続に成功したことを確認し、INSERT文のソースコードを記述しているが、データの追加に失敗している。
  • テーブルの構造や項目の型に変更はなく、同じソースコードで他のテーブルには書き込みができているため、問題の原因がわからない。
回答を見る
  • ベストアンサー

MySQLのPDO接続に関して

SELECT文を使って件数やデータを取得することはできますが、 INSERT文を使って、データを追加することができません。 他のテーブルへはこの記述で書き込みを行えております。 書き込めない理由がわからず困っています。 よろしくお願いいたします。 ■INSERT文のソースコードです。※テーブル名、項目名は一部変更しておりますが、 実際のソース上では、テーブル名、項目名は同じにしております。項目数に変更はございません。 -------------------------------------------------------------------------- if($dbh != null){ print '接続に成功しました。<br />'; //データを登録 $sql = 'insert into test (name,flag1,content1,content2,flag2) values (?,?,?,?,?)'; $stmt = $dbh->prepare($sql); var_dump($stmt); print '<br />'; $flag = $stmt->execute(array($name,$flag1,$content1,$content2,$flag2)); if($flag){ print 'データの追加に成功しました<br />'; }else{ print 'データの追加に失敗しました<br />'; var_dump($flag); print '<br />'; } }else{ print '接続に失敗しました。<br />'; } ■画面への表示※質問板に投稿するにあたり、テーブル名、項目名の変更している都合により、string(80)とは異なっております。項目数に変更はございません。 ---------------------------------------------------------- 接続に成功しました。 object(PDOStatement)#2 (1) { ["queryString"]=> string(80) "insert into test (name,flag1,content1,content2,flag2) values (?,?,?,?,?)" } データの追加に失敗しました bool(false) ■データベース※質問板に投稿するにあたり、テーブル名、項目名の変更しております。項目数、型に変更はございません。 ---------------------------------------------------------- テーブル: test 項目: num bigint(20) UNSIGNED AUTO_INCREMENT name varchar(255) flag1 int(1)→0か1が入ります content1 longtext content2 longtext flag2 int(1)→0か1が入ります

noname#202682
noname#202682
  • MySQL
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

prepare も成功してるなら、あとは warning でも発生してるのかな? SQL文エラーじゃなくてwarning のほうは、mysqlでは、"show warnings" っていうSQL文を直後に発行しないと捉えられないので、$flagがfalse だったとき以下実行。 <?php $w = $dbh->query("show warnings"); var_dump($w->fetchAll(PDO::FETCH_ASSOC)); ?> ※ mysql は5.1 以降でないと show warnings は無効です。 一応、SQL文のエラーは、errorInfo() でチェックして下さい。execute()の返値を見ても、エラー時は false かnull なだけですので。 <?php var_dump($stmt->errorInfo()); ?>

noname#202682
質問者

お礼

解決しました。テーブルの項目名にSQLで使う用語が含まれているのが原因でした。ありがとうございました。

noname#202682
質問者

補足

ご回答いただき、ありがとうございました。 下記エラーが発生しているようです。 ヘテムルのレンタルサーバーで運用しております。 改善案をご教授いただけないでしょうか。 引き続き、よろしくお願いいたします。 ■実行文 $w = $dbh->query("show warnings"); var_dump($w->fetchAll(PDO::FETCH_ASSOC)); ■画面表示 array(1) { [0]=> array(3) { ["Level"]=> string(5) "Error" ["Code"]=> string(4) "1064" ["Message"]=> string(225) "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 'content2,flag2) values ('','0','ここに作成したいページタブの内' at line 1" } } ■実行文 var_dump($stmt->errorInfo()); ■画面表示 array(3) { [0]=> string(5) "42000" [1]=> int(1064) [2]=> string(225) "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 'content2,flag2) values ('','0','ここに作成したいページタブの内' at line 1" }

関連するQ&A

  • mysql 接続について

    こんにちわ カートを作っていてつまづいたのでお力かしていただきたいです。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title></title> </head> <body> <?php try{ require_once('../common/common.php'); $post=sanitize($_POST); $pro_name=$post['name']; $pro_namecode=$post['namecode']; $pro_kg=$post['kg']; $pro_price=$post['price']; $pro_gazou_name=$_POST['gazou_name']; $pro_gazou_name2=$_POST['gazou_name2']; $dsn='mysql:dbname=LAA******-******;host=mysql***.phy.lolipop.lan'; $user='LAA******'; $password='********'; $dbh=new PDO($dsn,$user,$password); $pdo=new PDO("mysql:host=mysq***.phy.lolipop.lan;dbname=LAA*****-*******;charset=utf8",'LAA*****','********←パスワード'); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);                                                 $sql='INSERT INTO mst_product(namecode,name,kg,price,gazou,gazou2) VALUES(?,?,?,?,?,?)'; $stmt=$dbh->prepare($sql); $data[]=$pro_namecode; $data[]=$pro_name; $data[]=$pro_kg; $data[]=$pro_price; $data[]=$pro_gazou_name; $data[]=$pro_gazou_name2; $stmt->execute($data); $dbh=null; print$pro_name; print'を追加しました。<br/>'; } catch(Exception $e) { print'ただいま障害により大変ご迷惑をおかけします。<br/>'; exit(); } ?> <a href="pro_list.php">戻る</a> </body> </html> 一応エラーもでないで最後のprint$pro_name;print'を追加しました。<br/>'; までいくんですがデータベースを見ても商品は追加されていません。 エラーもでないで最後まで行くということは一応接続は出来ているということ なんでしょうか? どうしたらきちんと商品登録でしますか? レンタルサーバーはロりポップです。 必要かは分からないんですが phpバージョンは5.3 データベースバージョン5.6 よろしくおねがいします。

    • ベストアンサー
    • MySQL
  • PDOで接続をechoするとエラーになる現象の対処

    PDOでPHPとMySQLを連動させる時にエラーが出てしまいます。 対処法を教えて下さい。 サーバーの設定(PHP・MySQLなど)が原因のような気がしていますが、自分では解決できません。 PDOでINSERTを繰り返し行っています。 下記のソースでうまく動作をしています。 しかし、ソースの中で $dbh = new PDO($DSN , $DBUSER , $DBPASS); の後に echo $dbh を入れるとエラーになってしまいます。 このプログラムは複数のレンタルサーバーなどで動作が確認できています。 今回新しくVPSを借りてプログラムを設置したら上記のような現象が出てしまいました。 php.ini , my.cnf , httpd.conf などに設定が必要なのでしょうか? 普通にPHPのプログラムは動くのですが、接続 $dbh をecho したときだけエラーになるのです。 環境 PHP:5.1.6 MySQL:5.0.77 //$DNS,$DBUSER,$DBPASSは別途設定し読み込み。 //$nameには次々に名前が入り、1件ずつDBに登録されていく。 foreach($matches as $match) { $name = $match[1]; try { $dbh = new PDO($DSN , $DBUSER , $DBPASS); //echo $dbh; $query=<<<EOF INSERT INTO sample (name) VALUES (:name) EOF; $stmt = $dbh->prepare($query); $stmt->bindParam(':name', $name); $stmt->execute(); } catch(PDOException $e) { print "Error!: " . $e->getMessage() . "<br>"; die(); } }

  • 【PHP+MySQL 】レコード追加できない

    配列に入っているタブ区切りのデータを MySQLのテーブルに入れたいと思い 下記のようにコーディングしたのですが (因みにDB接続はちゃんと確立されております) ------------------------------------------ $arrData[0] = "1001 ^ あ"; $arrData[1] = "1002 ^ い";     ・     ・     ・ $sql = 'insert into table_a values (?,?)'; $stmt = $dbh->prepare($sql); for($i=0;$i<=count($arrData);$i++){ $tmp = split("\t",$arrData[$i]); $flag = $stmt->execute(array($tmp[0],$tmp[1])); if (!$flag){ die('データの追加に失敗しました'); } } ------------------------------------------ データの追加に失敗しましたが表示されうまくできません。 ■ どのように直せばよいかご教示願います。 ■ また、mysql関数にはPDO関数のprepare→executeのような 書き方は無いのでしょうか。 ご存知の方いらっしゃいましたら教えて下さい。 よろしくお願い致します。

    • 締切済み
    • PHP
  • mysqlのデータをPDOでDELETEできない

    PDOオブジェクト(PHP)を使用したmysqlのデータ削除について、質問させてください。 PDOオブジェクトを使用して、mysqlのデータ読み込み・削除を行っています。 特定のデータを読み込み、処理を行わせた後、対象のデータの削除をしたいのですが 読み込みは出来るのに、削除で失敗してしまいます。 処理を行わせるSQLをvar_dumpで出力させ、 それを直接phpMyAdminでSQL実行してみたのですが、 問題なく削除が行われています。 SQLの問題ではなく、PHP側の問題だと思うのですが、 解決方法が見つかっておりません。 知恵を貸していただけないでしょうか。 $post_data = explode('¥t', $_POST['data_array']); $user_id = $post_data[0]; $account_name = $post_data[1]; $data_id = $post_data[2]; $gunre_id = $post_data[3]; try { // DB接続 $dbh = new PDO($serverInfo["SERVER"], $serverInfo["USER"], $serverInfo["PASS"]); $dbh -> query('SET NAMES utf8'); // 処理させる対象アカウント情報を取得 $sql_account; $sql_account = 'SELECT * FROM '. $serverInfo['TBL_ACCOUNT']. ' WHERE GUNRE_ID = :gunre'; } $stmt_account = $dbh -> prepare($sql_account); $stmt_account -> bindParam(':gunre', $gunre_id, PDO::PARAM_STR); $stmt_account -> execute(); while($account = $stmt_account -> fetch(PDO::FETCH_ASSOC)) { // 取得してきたデータを使用して処理 // この処理は正常に行われているので、SELECTは正常に行われていると考えられます } // 処理が完了したら、データを削除 // ↓ここで組み立てたSQLを出力し、phpMyAdminでSQL実行すると、データは削除されました $sql_delete = 'DELETE FROM '. $serverInfo['TBL_DATA']. ' WHERE USER_ID = "'. $user_id. '" AND ACCOUNT_NAME = "'. $account_name. '" AND DATA_ID = "'. $data_id. '"'; $stmt_delete = $dbh -> prepare($sql_delete); // ↓元々はbindParamで指定していたのですが、処理が出来なかったので // $SQL_deleteの中に値を埋め込み、処理を行わせました。結局出来なかったのですが・・・ // $stmt_delete -> bindParam(':id', $user_id, PDO::PARAM_STR); // $stmt_delete -> bindParam(':account', $account_name, PDO::PARAM_STR); // $stmt_delete -> bindParam(':data', $data_id, PDO::PARAM_STR); $result = $stmt_delete -> execute(); var_dump($result); // ←出力結果は「false」です } catch (Exception $ex) { echo '<font color="red">システムエラーが発生しました</font><br />'; exit(); } 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpからmysqlのテーブルにデータ登録されない

    phpの初心者です。 下記記述のphpファイルから、mysqlにデータを登録させようとしていますが、エラーメッセージは出ないけど、データはMYSQLに登録できません。 ・WIN7(64bit) ・IE 11 ・phpmyadmin バージョン情報: 3.3.9 ・データベース(irai) ・テーブル(kinkyu) 原因を自分で調べようとしているのですが、どうしても原因を見つけ出すことができません。 誠にご無理なお願いだとは思いますが、下記、記述で、どこに問題があるのか、教えていただけないでしょうか? <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>緊急依頼受付完了</title> </head> <body> <?php try { $kirai_datetime=date_format(new DateTime('now', new DateTimeZone('Asia/Tokyo')),'Y-m-d H:i:s'); $kirai_kkubun=$_POST['kkubun']; $kirai_contents=$_POST['contents']; $kirai_basyo=$_POST['basyo']; $kirai_namae=$_POST['namae']; $kirai_busyo=$_POST['busyo']; $kirai_naisen=$_POST['naisen']; $dsn='mysql:dbname=irai;host=localhost'; $user='root'; $password=''; $dbh=new PDO($dsn,$user,$password); $dbh->query('SET NAMES utf8'); $sql='INSERT INTO kinkyu(datetime,kubun,naiyou,basyo,onamae,busyo,naisenbangou) VALUES (?,?,?,?,?,?,?)'; $stmt=$dbh->prepare($sql); $data[]=$kirai_datetime; $data[]=$kirai_kkubun; $data[]=$kirai_contents; $data[]=$kirai_basyo; $data[]=$kirai_namae; $data[]=$kirai_busyo; $data[]=$kirai_naisen; $stmt->execute($data); $dbh=null; print '用件の区分:'; print $kirai_kkubun; print '<br />'; print '依頼内容の詳細:'; print $kirai_contents; print '<br />'; print '場 所:'; print $kirai_basyo; print '<br />'; print '名 前:'; print $kirai_namae; print '<br />'; print '所属部署:'; print $kirai_busyo; print '<br />'; print '内線番号:'; print $kirai_naisen; print '<br />'; print '<br />'; print '上記内容を登録しました。 <br />'; print '担当者からの連絡をお待ちください。 <br />'; print 'もし連絡がない場合、お手数ですが内線70-3832までお電話ください <br />'; } catch(Exception $e) { print 'ただいま障害により大変ご迷惑をおかけしております。'; exit(); } ?> <a href="../topmenu.html"> トップに戻る </a> </body> </html>

  • PDOについて

    プログラム初心者です 最近PDO使うようになりましたがまったく使いこなせません 何回もSQL発行して効率わるいコードになりました(--; 一回のSQL発行にまとめる方法はありますか? for ($i=0; $i<$count; $i++) { $id=$Array[$i][0]; $name=$Array[$i][1]; $stmt = $pdo -> prepare("INSERT IGNORE INTO table(id,name) VALUES (?,?)"); $stmt->bindValue(1, $id, PDO::PARAM_INT); $stmt->bindValue(2, $name, PDO::PARAM_STR); $stmt->execute(); } 質問2 prepareのキャッシュを利かすってどうゆうことでしょうか?上の場合でもキャッシュ生かせていますか? よろしくお願いします

    • ベストアンサー
    • PHP
  • 複数のRSSのタイトル等をPDOでMySQLに登録

    複数のRSSを読み込み、RSS記事のタイトル・RSS記事のURLをMySQLに登録する方法について教えて頂ければと思います。 具体的にプログラムも作ってみましたが、もう一歩のところでうまくいきません。 うまくいっていないのは、「ループの中でPDOを使ったデータ登録」部分です。 ご回答宜しくお願い致します。 環境 PHP:5.1.6 MySQL:5.0.77 (目的) 複数のRSSを読み込み、RSS記事のタイトル・RSS記事のURLをMySQLに登録する。 (現状) 複数のRSSの記事を表示することには成功しています。 RSS1個目(記事数20)、RSS2個目(記事数15)の場合、35個の記事リストが表示される状態まではうまくいっています。しかし、PDOを使ってDBに登録の処理を入れると、RSS1個目の記事数20個が画面に表示され、MySQLにもRSS1個目の記事数20個分が登録される状態 になってしまいます。 ※RSS取得の形式はRSS2.0とします。(実際にはAtom、rdfにも対応させますが今回はDBの登録部分の質問なので) 【テーブル構成】 [RSSのタイトル・URL登録] テーブル名:rss_list (3列構成) フィールド名:id(auto_increment),title,url [RSSの記事タイトル・RSSの記事URL・RSSの発行日時] テーブル名:rss_data (4列構成) フィールド名:id(auto_increment),rss_title,rss_url,rss_date --------------表示まで成功したソース(始)---------------------------------- try { $dbh=newPDO($DSN,$DBUSER,$DBPASS); $query='SELECT*FROM rss_list' $stmt=$dbh->query($query); //rss_listテーブルよりtitle,urlを取得 while($result=$stmt->fetch(PDO::FETCH_ASSOC)) { $url=($result['url']); $title=($result['title']); echo$title.'<br>'; //RSS情報を取得 $xml=simplexml_load_file($url); foreach($xml->channel->itemas$entry) {   $entrydate=date("Y.m.d.H:i",strtotime($entry->pubDate)) $entry_title=strval($entry->title); $entry_url=strval($entry->link); $entry_cate=strval($entry->category); echo'<li><span>'.$entrydate.'</span>'; echo'<ahref="'.$entry->link.'">&nbsp&nbsp'.$entry->title.'</a>; }//foreach終了 }//while終了 } catch(PDOException$e) { print"Error!:".$e->getMessage()."<br>"; die(); }//catch_end --------------表示まで成功したソース(終)---------------------------------- 上記プログラムのRSS情報を取得する部分 foreachの中にDBへの登録の処理を加えます。 --------------DBへの登録追加(始)---------------------------------- try { $dbh=newPDO($DSN,$DBUSER,$DBPASS); $query='SELECT*FROMrss_list' $stmt=$dbh->query($query); //rss_listテーブルよりtitle,urlを取得 while($result=$stmt->fetch(PDO::FETCH_ASSOC)) { $url=($result['url']); $title=($result['title']); echo$title.'<br>'; //RSS情報を取得 $xml=simplexml_load_file($url); foreach($xml->channel->itemas$entry) {   $rss_date=date("Y.m.d.H:i",strtotime($entry->pubDate)) $rss_title=strval($entry->title); $rss_url=strval($entry->link); echo'<li><span>'.$entrydate.'</span>'; echo'<ahref="'.$entry->link.'">&nbsp&nbsp'.$entry->title.'</a>; //追加部分(開始) try { $dbh2=newPDO($DSN,$DBUSER,$DBPASS); $query2='INSERT INTO rss_data SET(rss_title,rss_url,rss_date)VALUES(:rss_title,:rss_url,:rss_date)'; $stmt=$dbh2->prepare($query2); $stmt->bindParam(':rss_date',$rss_date); $stmt->bindParam(':rss_title',$rss_title); $stmt->bindParam(':rss_url',$rss_url); } catch(PDOException$e) { print"Error!:".$e->getMessage()."<br>"; die(); }         //追加部分(終了)   }//foreach終了 }//while終了 } catch(PDOException$e) { print"Error!:".$e->getMessage()."<br>"; die(); }//catch_end --------------DBへの登録追加(終)---------------------------------- DBへの追加処理を加えると、1個目のRSS記事20個は表示・DBへの登録がされますが、そこで処理が止まってしまっています。 原因を下記のように考えてみました。 1.PDO(セレクト文 while)→ foreach→ PDOのような入れ子になっておりデータベースの切断などに工夫が必要?(いろいろやってみましたが上手くいかないので上記ソースでは$dbh=null;は記載してません) 2.RSSの記事取得のforeachに問題がある。  1個目のRSSは20個の記事があり、20個分はDBに登録できている。21個目を殻で登録しようとしてDBでエラーが出て止まっている可能性があるかもしれない。 (その他疑問点) 上記のようなプログラムの場合、データベース切断はどこに記載すれば良いのか? 1回だけの接続の場合は下記のような形だと思いますが、ループの中に入れ子になったような場合どうすれば良いのでしょうか。 try { } catch(PDOException$e) { print"Error!:".$e->getMessage()."<br>"; die(); }//catch_end $dbh=null;

    • ベストアンサー
    • PHP
  • PDOの複数クエリ

    PHP5.29 Apache2 MySQL5 PDOを使用して複数クエリを実行しようとしています。 update文、delete文が失敗してしまいます。 ------------------------------------------------- データベース接続省略 $id=$_POST['id'];要素が数値の配列 $time=$_POST['myFormDate'];//0000-00-00型の日付 $count=$_POST['count'];//数値の配列 上記3つの変数はprintし、変数は代入されている。 for($i=0;$i<count($id);$i++) { $update='update test set count=? used_day=? where id=?'; $stmt=$db->prepare($update); $flag=$stmt->execute(array($count[$i],$time,$id[$i])); if ($flag){ print('データ更新に成功しました<br>'); }else{ print('データ更新に失敗しました<br>'); } } --------------------------------------------------------- 何故これでupdate出来ないのか、またはdelete文にしても削除されないのか全くわかりません。select文にすると正確に表示されます。 どなたかおわかりになる方いらっしゃいましたらご教授お願い致します。

    • 締切済み
    • PHP
  • 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
  • PHP mysql の戻り値

    PHP内にて、下記の処理、上手くINSERTはされているのですが、 デバッグで埋めた print のところで res1 == Object id #6 が表示されます。 (1) Object id #6とはなんでしょうか? (2)正常、異常のときの $stmt の戻り値は何が返りますか?   (3)正常、異常のときの $res  の戻り値は何が返りますか? ~~~(一部抜粋)~~~ $sql = "insert into thread ( id, name, insert_datetime ) values (?, ? , now())"; $stmt = self::$_conn->prepare($sql); $res = $stmt->execute(array($id_mx,$this->get('name'))); print "res1 == ".$res."</br>"; die_if_dberror($res); ~~~~~~~~~~~

    • ベストアンサー
    • PHP