- ベストアンサー
配列で受け取った値がUPDATEできない
- 複数の一行テキストに入力された値を配列にして受け取り、まとめてデータベースへUPDATEさせる際に、最終の値が全てのカラムにUPDATEされてしまう問題が発生しています。
- foreachループ内でUPDATE文を実行しているが、毎回同じSQL文を実行しているため、最後のループの値が全てのカラムにUPDATEされてしまう。
- 最終の値だけでなく、ループ内の各値が正しくカラムにUPDATEされるようにするために、ループ内でSQL実行時に値を指定する必要がある。具体的には、$stmt->execute()のarray($value)の箇所で、配列のキーを指定して個別の値をUPDATEするようにする。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>> 依然最終の値のみが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)); }
その他の回答 (4)
- Bnbnbnta101
- ベストアンサー率7% (41/516)
sqlのupdate文の条件指定しなければダメでしょう。
お礼
ご回答ありがとうございます。 問題解決しました。 参考になるご回答をありがとうございました。
訂正 × $sql = "UPDATE テーブル名 SET comment = ? AND WHERE id = ?"; ○ $sql = "UPDATE テーブル名 SET comment = ? WHERE id = ?";
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
お礼
ご回答ありがとうございます。 実は質問をする前に、ご指摘をいただいた $sql = "UPDATE テーブル名 SET comment = ? WHERE id = ?"; という様にプレースホルダを使用して実装していましたが、依然最終の値のみが UPDATEされるという結果になったので、WHERE句とidの箇所を削除して質問させていただきました。 もう一度、ご指摘いただいた形式で書き直しましたが、やはり結果は同じです。 $iというのは何か関係があるのでしょうか? 他に思い当たる節がございましたらご回答いただけると幸いです。
- mjtanaka
- ベストアンサー率39% (34/86)
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++; } } このような感じでどうでしょうか。
お礼
ご回答ありがとうございます。 ご指摘の通り実装すると、「 Call to a member function execute() on a non-object 」という PDOStatementエラーが返りました。 $stmt->executeの箇所で失敗しているようです。 参考になるご回答をありがとうございました。
お礼
すみません。やっと意味が分かりました。 ++$iとして、id「 1,2,3,4,・・・n 」と$valueが入るカラムを 揃えるという感じなのですね。 本当にありがとうございました。 ようやく思い通りに実装できました。