🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2784閲覧

PDOによるシンプルな複数のrowの一括update

pegy

総合スコア245

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/12/08 02:49

編集2019/12/08 03:18
  1. 更新したいidカラムはWHEREの条件により複数ある
  2. 一方、更新したい値は一定である

と言う条件でまとめてMYSQLでUPDATEする方法を探しております。
上記のうち2)において更新したい値が1)の条件により変化数場合についてはteratailの過去の記事かr
見つけることができました。(こちら
実際にやりたいことはもっとシンプルで常に更新したいのは"no"か"yes"だけです。

以下のようにWHERE IN句ではエラーが出力されてしまったのですが、
(データベース接続失敗。SQLSTATE[HY093]: Invalid parameter number: no parameters were bound)

これを実装する方法にについてアドバイスをいただけますでしょうか?
よろしくお願い申し上げます。

sql

1CREATE TABLE main_table ( 2 id int NOT NULL AUTO_INCREMENT, 3 name VARCHAR(255) NOT NULL, 4 hantei VARCHAR(255) NOT NULL, 5 PRIMARY KEY (id) 6); 7//*sql('INSERT INTO main_table (hantei) VALUES ("no")'); 8//*をループによりすべてのhanteiカラムに"no"が入っている前提になります

php

1 2//もともとmain_tableのhanteiカラムはすべて"no"が格納されている 3$update ="yes"; 4$id_a=1; 5$id_b=2; 6$sql='UPDATE main_table SET hantei =:hantei WHERE id = IN (id_a=:id_a,id_b=:id_b)'; 7 $stmt->bindParam(':hantei',$update,PDO::PARAM_STR); 8 $stmt->bindParam(':id_a',$id_a,PDO::PARAM_STR); 9 $stmt->bindParam(':id_b',$id_b,PDO::PARAM_STR); 10 $stmt =$pdo->prepare($sql); 11 $stmt->execute(); 12 13//やりたいこととしては idカラムが1または2のもについて、hanteiカラムを共通して"no"から"yes"にUPDATEしたいということになります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

不定数の処理はラベルをつけるより疑問符型で処理するほうが楽です

PHP

1$data=[]; 2$hantei=1; 3$ids=[100,200,300]; 4$data[]=$hantei; 5$sql="UPDATE main_table SET hantei =? WHERE 1 "; 6if(count($ids)>0){ 7 $sql.=" and id in (".implode(",",array_fill(0,count($ids),"?")).")"; 8 $data=array_merge($data,$ids); 9}else{ 10 $sql.=" and 0"; 11} 12print $sql; 13print_r($data); 14 15// $stmt = $pdo->prepare($sql); 16// $stmt->execute($data); 17

投稿2019/12/09 00:48

yambejp

総合スコア116688

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pegy

2019/12/19 02:54

ご教示いただき有難うございます。 確かに疑問符のほうが利用しやすかったです!
guest

0

ベストアンサー

UPDATE main_table SET hantei =:hantei WHERE id** = IN (id_a=:id_a,id_b=:id_b)**
SQLの文法上、太字の部分が誤っています。

UPDATE main_table SET hantei =:hantei WHERE id IN (:id_a, :id_b)
とか、
UPDATE main_table SET hantei =:hantei WHERE id_a = :id_a AND id_b = :id_b
って書き方はあります。

正確なところは質問に CREATE TABLE main_table を追加するのは当然ですが、どういう条件で更新したいのかを文章で追記してください。

投稿2019/12/08 03:01

編集2019/12/08 03:43
Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pegy

2019/12/08 03:19

コメントありがとうございます CREATE文を追加しました。また条件は当初記載させていただきましたidカラムが1または2であれば更新と言うシンプルなものです。 よろしくお願い申し上げます。
pegy

2019/12/08 03:25

UPDATE main_table SET hantei =:hantei WHERE id_a = :id_a AND id_b = :id_b でも現状、パラメータ不一致が出てしまいます。。 Invalid parameter number: no parameters were bound 度々申し訳ございません。
pegy

2019/12/08 05:05

ありがとうございます。一つ大きな間違いを発見しました。 prepareする位置を間違っていました。 $update ="yes"; $id_a=1; $sql='UPDATE main_table SET hantei =:hantei WHERE id = :id'; $stmt =$pdo->prepare($sql); $stmt->bindParam(':hantei',$update,PDO::PARAM_STR); $stmt->bindParam(':id',$id_a,PDO::PARAM_STR); $stmt->execute(); でうまくいくことまでは確認できました。ただ今回はidが1も2もどちらのレコードについても、hanteiをUPDATEしたいのですが $update ="yes"; $id_a=1; $id_b=2; $sql='UPDATE main_table SET hantei =:hantei WHERE id IN (:id1,:id2)'; $stmt =$pdo->prepare($sql); $stmt->bindParam(':hantei',$update,PDO::PARAM_STR); $stmt->bindParam(':id1',$id_a,PDO::PARAM_STR); $stmt->bindParam(':id2',$id_b,PDO::PARAM_STR); $stmt->execute(); とすると何もエラーが出力されず、id=1のレコードもid=2のレコードもhanteiがUPDATEされません。 牛歩で大変申し訳ございませんが、WHERE IN句では複数のレコードに更新をかけることができなのでしょうか? なんども本当に申し訳ございません。 よろしくお願い致します。
Orlofsky

2019/12/09 01:15

データ型に注意して、提示したURLをよく見ましょう。 >$stmt->bindParam(':name', $name, PDO::PARAM_STR); >$stmt->bindValue(':value', 1, PDO::PARAM_INT);
pegy

2019/12/19 02:53

解決することができました! 有難うございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問