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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

1回答

3989閲覧

foreach で複数の変数を条件として where 検索することについて

alkeran

総合スコア29

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2016/12/03 13:54

編集2016/12/04 06:29

以下のコードの通り、複数の id で where 検索して update することは可能でしょうか?配列を条件とする場合は where xx in (xx) でよろしいでしょうか?
ご教授よろしくお願い致します。

<?php if($_SERVER["REQUEST_METHOD"] == "GET") { $today = date("Y-m-d H:i:s"); $ids = $_REQUEST['ids']; $pdo = new PDO("mysql:host=xxx; dbname=xxx; charset=utf8", "xxx", "xxx", array( PDO::ATTR_EMULATE_PREPARES => false ) ); $sql = <<< SQL update list set date=:date where id=:id SQL; foreach($ids as $id) { $condition = array( ":date" => $today[$id], ":id" => $id, ); $statement = $pdo->prepare( $sql ); $result = $statement->execute( $condition ); } } exit(); ?>

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

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

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

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

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

guest

回答1

0

ベストアンサー

where inでいいと思いますよ
以下にサンプルコード書いてみたので参考にしてください。
なお、更新処理はGETではなくPOSTにしたほうがいいですよ

php

1<?php 2if($_SERVER["REQUEST_METHOD"] == "GET") { 3$today = date("Y-m-d H:i:s"); 4$ids = explode(',', $_REQUEST['ids']); 5$pdo = new PDO("mysql:host=localhost; dbname=test; charset=utf8mb4", "app", "pass", array( PDO::ATTR_EMULATE_PREPARES => false ) ); 6 7$ins = array(); 8for($i=0; $i<count($ids); $i++) { 9 $ins[] = ":id{$i}"; 10} 11$sql = "update list set date=:date where id in (" . implode(', ',$ins) . ")"; 12$condition = array(":date" => $today); 13for($i=0; $i<count($ids); $i++) { 14 $condition[":id{$i}"] = $ids[$i]; 15} 16$statement = $pdo->prepare( $sql ); 17$result = $statement->execute( $condition ); 18exit(); 19}

投稿2016/12/04 06:47

popobot

総合スコア6586

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

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

alkeran

2016/12/04 07:08

サンプルコードまで書いていただき誠にありがとうございました。 動作確認してみたのですが、例えば3つの id が条件が変数として渡されたら、その3番目しか date が update されません。何度も申し訳ありませんが教えて頂けないでしょうか?
popobot

2016/12/04 07:16 編集

手元ではうまくいきますけどね?以下のようにカンマ区切りで渡すと、IDが1,5,6のものが更新されるはずです。 hoge.php?ids=1,5,6
alkeran

2016/12/04 07:21

get で渡すと hoge.php?ids=1&ids=2&ids=3 になります。
popobot

2016/12/04 07:33

それだと、最後のidsの3しか渡ってこない気がします
alkeran

2016/12/04 07:36

カンマ区切りで渡さないと駄目なんですね。
popobot

2016/12/04 07:42

POSTだったら配列で渡せますけどね <input name='ids[]' value=1> <input name='ids[]' value=2>
alkeran

2016/12/04 07:52

以下の通り送ったのですが、hoge.php?ids=1&ids=2&ids=3 でした。 <input type="hidden" name="ids[]" value="<?php print( htmlspecialchars( $result["id"], ENT_QUOTES ) ); ?>" >
alkeran

2016/12/04 08:04

update したら下記のエラーが出ました。 Warning: explode() expects parameter 2 to be string, array given in
popobot

2016/12/04 08:26

状況がよくわかりません...POSTに変えたということですか? であれば、以下のカンマ区切りの文字列を配列に変換する処理はいらないので、単に代入にしてくださいね。 $ids = explode(',', $_REQUEST['ids']);
alkeran

2016/12/04 08:37

$ids = explode(',', $_REQUEST['ids']); を削除したのですができませんでした。 もう一度見直してみたいと思います。
alkeran

2016/12/04 08:39

POSTに変えました。
popobot

2016/12/04 08:42

以下に置き換えたらだめですか? まぁ落ち着いて見てみてください!! $ids = $_REQUEST['ids'];
alkeran

2016/12/04 08:45

それでもだめでした。
popobot

2016/12/04 08:50

var_dump($ids);とかで出力してみて、$idsが配列になっていれば問題ないはずですが...
alkeran

2016/12/04 08:55

何も表示されませんでした。
alkeran

2016/12/04 09:01

何度も申し訳ありません。念のための確認ですが、postにした場合以下のコードでよろしいでしょうか? <?php if($_SERVER["REQUEST_METHOD"] == "post") { $today = date("Y-m-d H:i:s"); $ids = $_REQUEST['ids']; $pdo = new PDO("mysql:host=xxx; dbname=xxx; charset=utf8", "xxx", "xxx", array( PDO::ATTR_EMULATE_PREPARES => false ) ); $ins = array(); for($i=0; $i<count($ids); $i++) { $ins[] = ":id{$i}"; } $sql = "update list set date=:date where id in (" . implode(', ',$ins) . ")"; $condition = array(":date" => $today); for($i=0; $i<count($ids); $i++) { $condition[":id{$i}"] = $ids[$i]; } $statement = $pdo->prepare( $sql ); $result = $statement->execute( $condition ); } exit(); ?>
popobot

2016/12/04 09:02

POSTする側の問題かもしれませんね... ブラウザのデベロッパーツール等でPOSTデータ等が正しいか確認するとか var_dump($_REQUEST);を見てみるとか
alkeran

2016/12/04 09:05

var_dump($ids); でみたら NULLと表示されました。
退会済みユーザー

退会済みユーザー

2016/12/04 09:05

ここの部分 if($_SERVER["REQUEST_METHOD"] == "post") { == 'post' ではなく、=== 'POST' では?
alkeran

2016/12/04 09:12

'post'です。
alkeran

2016/12/04 09:36

'POST' にしたらできました。 長々と申し訳ありませんでした。ありがとうございました。
popobot

2016/12/04 10:09

うまくいってよかったです! Kosuke_Shibuyaさん、コメントありがとうございます。助かりました!
alkeran

2016/12/04 11:05

Kosuke_Shibuyaさんもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問