• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列で受け取った値がUPDATEできない)

配列で受け取った値がUPDATEできない

このQ&Aのポイント
  • 複数の一行テキストに入力された値を配列にして受け取り、まとめてデータベースへUPDATEさせる際に、最終の値が全てのカラムにUPDATEされてしまう問題が発生しています。
  • foreachループ内でUPDATE文を実行しているが、毎回同じSQL文を実行しているため、最後のループの値が全てのカラムにUPDATEされてしまう。
  • 最終の値だけでなく、ループ内の各値が正しくカラムにUPDATEされるようにするために、ループ内でSQL実行時に値を指定する必要がある。具体的には、$stmt->execute()のarray($value)の箇所で、配列のキーを指定して個別の値をUPDATEするようにする。

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

  • ベストアンサー
noname#244856
noname#244856
回答No.4

>> 依然最終の値のみがUPDATEされる つまりそれはidを固定値にしているからではないでしょうか? value | id --------  a  | 1  b  | 2  c  | 3  d  | 4 こうする必要があるのは自明ですよね。 $stmt = $conn->prepare('UPDATE テーブル名 SET comment = ? WHERE id = ?'); $comment = array('a', 'b', 'c', 'd'); foreach ($comment as $i => $value) { $stmt->execute(array($value, ++$i)); }

nazalzuki
質問者

お礼

すみません。やっと意味が分かりました。 ++$iとして、id「 1,2,3,4,・・・n 」と$valueが入るカラムを 揃えるという感じなのですね。 本当にありがとうございました。 ようやく思い通りに実装できました。

その他の回答 (4)

回答No.5

sqlのupdate文の条件指定しなければダメでしょう。

nazalzuki
質問者

お礼

ご回答ありがとうございます。 問題解決しました。 参考になるご回答をありがとうございました。

noname#244856
noname#244856
回答No.3

訂正 × $sql = "UPDATE テーブル名 SET comment = ? AND WHERE id = ?"; ○ $sql = "UPDATE テーブル名 SET comment = ? WHERE id = ?";

noname#244856
noname#244856
回答No.2

IDの指定が無いのが原因です。しかし… >> $sql = "UPDATE テーブル名 SET comment = ".$value." where id=id".$i; 他者の回答を否定するのは筋ではないですが、ちょっとこれは…セキュリティ的に問題ありでしょう。普通にプレースホルダを使って $sql = "UPDATE テーブル名 SET comment = ? AND WHERE id = ?"; これでどうぞ。また、プリペアドステートメントの生成はforeachループ外で行い、foreachループ内で行うのは値をバインドを伴うexecuteのみにしたほうが実行速度は向上します。毎回同じプリペアドステートメントを生成する必要は無いので使いまわしましょう。 PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71

nazalzuki
質問者

お礼

ご回答ありがとうございます。 実は質問をする前に、ご指摘をいただいた $sql = "UPDATE テーブル名 SET comment = ? WHERE id = ?"; という様にプレースホルダを使用して実装していましたが、依然最終の値のみが UPDATEされるという結果になったので、WHERE句とidの箇所を削除して質問させていただきました。 もう一度、ご指摘いただいた形式で書き直しましたが、やはり結果は同じです。 $iというのは何か関係があるのでしょうか? 他に思い当たる節がございましたらご回答いただけると幸いです。

  • mjtanaka
  • ベストアンサー率39% (34/86)
回答No.1

idの指定がないからではないでしょうか。 $i = 1; if( isset( $_POST['comment'] )) { foreach ($_POST['comment'] as $value) { echo $value."<br>"; $sql = "UPDATE テーブル名 SET comment = ".$value." where id=id".$i; $stmt = $conn->prepare($sql); $stmt->execute(array($value)); $i++; } } このような感じでどうでしょうか。

nazalzuki
質問者

お礼

ご回答ありがとうございます。 ご指摘の通り実装すると、「 Call to a member function execute() on a non-object 」という PDOStatementエラーが返りました。 $stmt->executeの箇所で失敗しているようです。 参考になるご回答をありがとうございました。