質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
PDO

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

PHP

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

Q&A

解決済

3回答

2220閲覧

PDOのUpdate( where句)でデータが流し込めないです

SugiuraY

総合スコア317

PDO

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

PHP

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

0グッド

0クリップ

投稿2016/09/01 11:41

お世話になりあmす。

下部の$comb配列があり$comb[$ii][0]の数値がRDSのテーブルsecidに存在し、これをkeyにして、comb[$ii][1]及びcomb[$ii][2]をfor文で順番に格納していきたいのですが、うまくいきません。エラー結果は下部の通りでした。

問題はWHERE secid = $comb[$ii][0]かと思うのですが
このような条件Where句はPDOで許容されないのでしょうか?

実際にはこの条件とプレースホルダに数値及び変数を入れると正しくmysqlにデータがupdateされます。
WHERE secid =8951;
$a=6;
$b=12;

$stmt->bindParam(':first', $a, PDO::PARAM_INT);
$stmt->bindParam(':second', $b, PDO::PARAM_INT);

どなたか、この原因と解決法をご教示願えませんでしょうか。
よろしくお願い申し上げます。

配列$comb array(57) { [0]=> array(3) { [0]=> string(4) "8951" [1]=> string(2) "6 " [2]=> string(3) " 12" } [1]=> array(3) { [0]=> string(4) "8952" [1]=> string(2) "3 " [2]=> string(2) " 9" } [2]=> array(3) { [0]=> string(4) "8953" [1]=> string(2) "2 " [2]=> string(2) " 8" 以下,省略
$dsn = 'XXX'; $user = 'XXX'; $password = 'XXX'; try { $pdo = new PDO($dsn, $user, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); for ($ii=0; $ii <=57; $ii++) { $stmt = $pdo->prepare("UPDATE wp5_entitymaster SET first=:first, second=:second WHERE secid = $comb[$ii][0]"); $stmt->bindParam(':first', $comb[$ii][1], PDO::PARAM_INT); $stmt->bindParam(':second', $comb[$ii][2], PDO::PARAM_INT); $stmt->execute(); } }catch (PDOException $e){ var_dump($e->getMessage());
string(207) "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 '['0']' at line 1"

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

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

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

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

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

guest

回答3

0

UPDATEをバルクで処理する

PHP

1$data=[]; 2$max=57; 3$sql="INSERT INTO wp5_entitymaster(secid,first,secound) VALUES"; 4for($i=0;$i<$max;$i++){ 5 $sql.=($i==0?"":",")."(?,@a:=?,@b:=?)"; 6 $data=array_merge($data,[$comb[$i][0],$comb[$i][1],$comb[$i][2]]); 7} 8$sql.=" ON DUPLICATE KEY UPDATE first=@a,secound=@b"; 9//test 10print $sql; 11print_r($data); 12$stmt = $pdo->prepare($sql); 13$stmt->execute($data); 14

投稿2016/09/01 12:35

yambejp

総合スコア114839

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

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

SugiuraY

2016/09/01 12:51

ご回答いただき、ありがとうございます。 参考にさせていただきます。よろしくお願い申し上げます。
guest

0

ベストアンサー

php

1 2 for ($ii=0; $ii <=57; $ii++) { 3 $stmt = $pdo->prepare("UPDATE wp5_entitymaster SET first=:first, second=:second WHERE secid = :secid"); 4 $stmt->bindParam(':first', $comb[$ii][1], PDO::PARAM_INT); 5 $stmt->bindParam(':second', $comb[$ii][2], PDO::PARAM_INT); 6 $stmt->bindParam(':secid', $comb[$ii][0], PDO::PARAM_INT); 7 $stmt->execute();

より、こっちのほうがいいですね。

php

1 $stmt = $pdo->prepare("UPDATE wp5_entitymaster SET first=:first, second=:second WHERE secid = :secid"); 2for ($ii=0; $ii <=57; $ii++) { 3 $stmt->bindParam(':first', $comb[$ii][1], PDO::PARAM_INT); 4 $stmt->bindParam(':second', $comb[$ii][2], PDO::PARAM_INT); 5 $stmt->bindParam(':secid', $comb[$ii][0], PDO::PARAM_INT); 6 $stmt->execute(); 7}

投稿2016/09/01 11:52

編集2016/09/01 11:58
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SugiuraY

2016/09/01 12:00

ご回答いただき、ありがとうございます。 すみません、先日このような変数もプレースホルだにいれるべきとご教示いただいたばかりでした。大変失礼いたしました。 ちなみにですが、直接変数をwhere句に使用する場合には、下記のtakasima20様のおっしゃる. $comb[$ii][0]の結合演算子や、{ }でくくる等を使用しなければならないのはSQLのお作法(SQL文内の変数はすべて、この様に記載しなければならない?)という理解でよろしかったでしょうか? ご教示いただいたのに重ねてで申し訳御座いませんが よろしくお願い申し上げます。
退会済みユーザー

退会済みユーザー

2016/09/01 12:03

SQLに $(ドルマーク)がある時点で、有無を言わさずアウトです。ドットでつなごうとなんだろうとNG。
SugiuraY

2016/09/01 12:05

早速のご回答ありがとうございます。 承知をいたします。素直に頭に叩き込みます(猛省です)。 よろしくおねが申し上げます。
SugiuraY

2016/09/01 12:07

forの位置も了解いたしました。 ご鞭撻、深謝です。
退会済みユーザー

退会済みユーザー

2016/09/01 12:08

個人情報流出なんて、ほとんどがSQLインジェクションが原因ですからね…。 $sql = "..............."; // ←この行に $ があったらNG 
guest

0

こんな感じでどうスかね。

PHP

1$stmt = $pdo->prepare("UPDATE wp5_entitymaster SET first=:first, second=:second WHERE secid = " . $comb[$ii][0]);

投稿2016/09/01 11:50

takasima20

総合スコア7458

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

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

SugiuraY

2016/09/01 12:01

ご教示いただいた方法で、解決することができました、また{}でくくる方法も許容される様です。よろしくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問