• 締切済み

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
  • 回答数2
  • ありがとう数1

みんなの回答

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.2

> どうやら「'SQLSTATE[42000]: 」と表示されていてSQL文にミスがあるようです。 質問にあるソースコードをよく拝見したらSQL文が間違っていることに気付きました。 $update='update test set count=? used_day=? where id=?'; ではなく、正しくは $update='update test set count=?, used_day=? where id=?'; です。カンマが抜けていますよ。

atlantic32
質問者

お礼

x_jouet_x 様 何から何までご指導有難うございます。 完成しました。 こんな簡単なミスにも気付かず、時間を費やしていました。

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.1

PDOでDB接続はあまり行ったことがありませんが・・・。 下記のようにsetAttribute()関数で例外処理を有効にできませんか? ---------- $dbh = new PDO(...); $dbh->setAttribute(PDO_ATTR_ERRMODE, PDO_ERRMODE_EXCEPTION); ---------- 例外処理を有効にできたら下記のようにクエリー実行時に例外が出ていないか確認してみて下さい。 ---------- try { $flag=$stmt->execute(array($count[$i],$time,$id[$i])); } catch(PDOException $exception) { echo $exception->getMessage(); } ----------

atlantic32
質問者

補足

x_jouet_x様 ご指導有難うございます。 例外が見つかりました。どうやら「'SQLSTATE[42000]: 」と表示されていてSQL文にミスがあるようです。どう考えても見つかりそうにないですが…。 PDOを使わずに全部一個づつ更新する方法もありますけど、一気に更新したいと考えてますが中々難しく上手く行きません。

関連するQ&A

  • 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が入ります

    • ベストアンサー
    • MySQL
  • 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
  • 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でDBの複数行更新について

    はじめまして、PHPを最近使い始めました初心者です。 [環境] PHP: 5.4.7 DB: SQLite 3.7.15.2 a  OS: Windows 7 DB上のテーブルへ複数行を挿入するソースを書いてますが 下記の文法エラーとなり行き詰っています。 [配列データとソース] Array ( [0] => Array ( [0] => 1359904500 [1] => 1359905400 [2] => 150 ) [1] => Array ( [0] => 1359990900 [1] => 1359991800 [2] => 150 ) [2] => Array ( [0] => 1360077300 [1] => 1360078200 [2] => 150 ) [3] => Array ( [0] => 1360163700 [1] => 1360164600 [2] => 150 ) 以下100件ほど続きます $sql1 = "INSERT INTO aaa (id,sstamp,estamp,data,flag) VALUES " ; $flag = 1; $count = count($time_array) ; for ( $i=1; $i< $count; $i++ ) { $sql1.= "(null,'".$time_array[$i][0]."',"."'".$time_array[$i][1]."',"."'".$time_array[$i][2]."',"."'".$flag."')," ; } $sql1 = substr($sql1, 0, -1) ; var_dump($sql1) ; $result = $db->query($sql1) ; [エラー] Warning: SQLite3::query(): Unable to prepare statement: 1, near ",": syntax error var_dumpでsql作成用変数($sql1)を見てみると問題ないように見えました。 解せないのは、変数内容をsqliteのコマンドラインへコピぺすると 正常に挿入できてしまいました。また配列を一つにしてみるとエラーなくDB挿入できました。 これよりSQL複数行挿入のvalue以下の記述が怪しいと思い、確認しましたが (aa, bb, cc), (dd, ee, ff)になっているようと思えます。 どこに問題があるかご教示をお願いいたします。

    • 締切済み
    • PHP
  • 文字例の比較について WHERE句

    文字例の比較について、教えてください。 DELETE_FLAGという項目には、文字列の"1"、もしくはNULLが入っています。 セレクト文でDELETE_FLAGが"1"以外のものを抽出したいのですが、うまくいきません。 以下のSQL文を実行した際に、結果として5件ヒットしてほしいのですが、なぜか0件となってしまいます。 select count(product_id) from hpk_atoz_list_view where delete_flag != '1'; 原因わかりますでしょうか? よろしくお願いいたします。 ============================================================================ SQL> select delete_flag, product_id from product_list_view; DELETE_FLAG product_ID ---------------------------------   0002 1 1003   0002 1 1003   0002 1 1003   0002   0002 8行が選択されました。 SQL> SQL> select count(product_id) from product_list_view where delete_flag != '1'; COUNT(product_id) ---------- 0 SQL> SQL> select count(product_id) from product_list_view where delete_flag = '1'; COUNT(product_id) ---------- 3 SQL> SQL> select count(product_id) from product_list_view where delete_flag is not null; COUNT(product_id) ---------- 3 SQL> SQL> select count(product_id) from product_list_view where delete_flag is null; COUNT(product_id) ---------- 5 SQL> =====以上=====

  • SQL WHERE文のノットイコールについて

    初歩的な質問ですみません。 Oracle9iでsqlplusで接続しています。 「member_accountテーブルのdelete_flag(VARCHAR2)カラムの値が'1'ではない」ものを抽出したいと考えてます。 ただ、正しい結果が返ってきません。 何が問題でしょうか?よろしくお願いいたします。 ============================================================ SQL> select count(ID) from member_account; COUNT(ID) ---------- 16450 SQL> SQL> select count(ID) from member_account where delete_flag='1'; COUNT(ID) ---------- 107 SQL> SQL> select count(ID) from member_account where delete_flag<>'1'; COUNT(ID) ---------- 0 SQL> SQL> select count(ID) from member_account where delete_flag!='1'; COUNT(ID) ---------- 0 ============================================================ よろしくお願いいたします。

  • PDOでDB ページング

    一覧画面と検索画面を一緒にしています 一覧画面は10件表示にし、テキストになにも入力されてなかったらデータを全件表示したいです また、1 l 2 l 3 のようにページを表示し、また何件中何件目データですと表示したいです <!--一覧画面 index.php--> <html> <head> <title>一覧画面</title> </head> <body> <br><br> <blockquote> 一覧画面 <br><br> <?php if ($_GET) { // データがGETされていたら $event = isset($_GET['event']) ? $_GET['event'] : ''; // 取得 if (isset ($_GET['page'])==false) { $page=0; } else { //そうでなければpageパラメータの値をpage変数にセット $page = $_GET['page']; } } ?> <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $name=isset($_GET['name'])?$_GET['name']:""; $sql ="select * from tbl_test where "; $sql.="`氏名` like concat('%',?,'%') "; $sql.="or `住所` like concat('%',?,'%') "; $sql.= " limit " . $page*10 . ", 10" ; $stmt = $pdo->prepare( $sql); $stmt->execute(array($name,$name)); $count = $stmt->rowCount(); if($count>0){ print "<table border=1>" ; print "<tr>"; print "<th>番号</th>"; print "<th>氏名</th>"; print "<th>住所</th>"; print "<th>操作</th>"; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ print "</tr>"; $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr> <td>$ID</td> <td>$NAME</td> <td>$ADDR</td> <td><a href='edit.php?番号=$ID'>修正</a> <a href='delete.php?番号=$ID'>削除</a></td></tr>"; }; print "</table>" ; }else{ print "該当するデータがありません"; } ?> <br><br><br> <form action = "index.php" method="GET"> <input type="hidden" name="event" value="find"> <input type="text" name="name"style ="font-size:20px;width: 400px; height: 40px"> <input type="submit" value="検索" style ="font-size:20px;width: 100px; height: 40px"> </form> <br><br> <form action = "regist.php" method="GET"> <input type="hidden" name="event" value="regist"> <input type = "submit" value = "新規登録" style ="font-size:20px;width: 100px; height: 40px"> </form> <input type="hidden" name="page" value="0"> </blockquote> </body> </html> 検索のテキストボックスが空だったら全件表示したいのですが今10件しか出ません limitの書く場所が原因でしょうか? またこのように一覧画面と検索結果画面が一緒じゃまずいですかね? 検索結果を別ウインドウじゃなく自分に返したいと思いこのやり方にしたのですがよくないですか?

    • ベストアンサー
    • MySQL
  • 複数クエリ実行

    以前ここで質問させて頂き諦めていたのですが、やはりどうしても諦めきれず、 再度挑戦しようとしているスクリプトです。 PHP5.29 Apache2.33 MySQL5 -------------------------------------------------------------------------- ファイル名:test.php <form action="test2.php" method="post"> <? for($i=0;$i<3;$i++) { ?> <input type="text" name="group[<?php echo $i?>][name]" /><br /> <input type="checkbox" name="group[<?php echo $i?>][check][]" value="日本語" />日本語 <input type="checkbox" name="group[<?php echo $i?>][check][]" value="英語" />英語 <input type="checkbox" name="group[<?php echo $i?>][check][]" value="西語" />西語 <input type="checkbox" name="group[<?php echo $i?>][check][]" value="独語" />独語 <input type="checkbox" name="group[<?php echo $i?>][check][]" value="伊語" />伊語 <br /> <textarea name="group[<?php echo $i?>][context]" cols="30" rows="3" /></textarea> <br /> <? } ?> <input type="submit" value="登録" /> </form> -------------------------------------------------------------------------- ファイル名:test2.php <?php $dbuser="root"; $dbpass="root"; $db=new PDO("mysql:host=localhost;dbname=test",$dbuser,$dbpass); $group=$_POST['group']; for($i=0;$i<count($group);$i++) { $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $db->query('set names utf8'); $name=$group[$i]['name']; $check=implode(" ",$group[$i]['check']); $context=$group[$i]['context']; $arr=array($name,$check,$context); $stt=$db->prepare('insert into test(name,group,context) values(?,?,?)'); $stt->execute($arr); //print_r($arr); print "<br />"; } ?> <br /><br /><a href="test.php">戻る</a> <hr /> <?php print_r($_POST); ?> -------------------------------------------------------------------------- 上記スクリプトにて名前と言語及びテキストまでのパラメータを表示する所までは何とか行けたのですが、 いざ入力しようとするとエラーが返されます。エラーは'SQLSTATE[42000]:と言うものでSQL文に異常が 報告されています。「print_r($arr);」で配列が正確に格納されていることを確認しています。 どうも$stt->execute($arr)で何か問題があると思われるのですが、こちらの方わかる方いらっしゃいましたら 教えて頂けませんでしょうか? 宜しくお願い致します。

    • 締切済み
    • PHP
  • レコード削除・sqlインジェクション対策

    このようなSQL文は危険でしょうか? $sql = "delete テーブル名 where id = :id"; $stmt = $dbh->prepare($sql); $stmt->execute(array(":id" => $_POST['id'])); 上記の例だと、$_POST['id']は、 ちゃんとエスケープできているのでしょうか?

    • ベストアンサー
    • MySQL
  • PDOのプレースホルダで変数でUPDATE出来ない

    bindValueに値を直接入れると動くのに、変数だと動かない状態になっており、質問をさせて頂きました。 MySQLに「serialcode」と「count」というテーブルを作り、POSTでシリアルコードを送信するとデータベースから対応した今の「count」をマイナス1した値を「count」にUPDATEするというものを作ろうとしております。 下記のコードで動かすと、シリアルコードは正しいものなのに、「count」がマイナス1されません。 ですが最後のechoには入力された値が表示されます。 なのでechoでは値が表示されるのでPOSTの値は受け取っていると思われます。 またbindValueの「$_POST["serialcode"]」の箇所を直接シリアルコードの値にして書き換えると「count」はマイナス1されます。 どのようにしたら変数でUPDATEを動作させる事が出来るでしょうか? -------------------------------------------------------------------------------------------- $pdo = new PDO($dsn, $user, $password); $sql = "UPDATE serialcode_table SET count = count - 1 WHERE serialcode = :serialcode2"; $stm = $pdo->prepare($sql); $stm->bindValue(':serialcode2', $_POST["serialcode"], PDO::PARAM_STR); $stm->execute(); <div> echo "シリアルコード:{$_POST["serialcode"]}" </div> -------------------------------------------------------------------------------------------- まだまだ勉強不足のところがあり恐縮ですが、原因についてご教示頂けますよう、何卒お願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう