質問: mysqli_query($link, "SELECT * FROM XXX ORDER BY time DESC"); ?> 名前: 内容: 投稿 更新 削除 名前: 内容: ```
回答: 他の回答者さんのおっしゃる通り、 先ずは**implode関数**を使って配列を展開すると良いかなと思います。 さて今回のケースのような場合は、 **最終的に組み立てるべきSQLの完成像**を意識しつつ取り組んでいただきたいのですが、 先ず実行する必要のあるSQLの完成像は以下のようなイメージとなることを掴んでおいて下さい。 * UPDATE ``` UPDATE XXX SET name = '太郎さん' -- 「'name = '$name'」の先頭の「'」は打ち間違い? , comment = 'IN句を使った更新' WHERE id IN(1, 2, 3) -- id IN('1', '2', '3') ←id列の定義が文字列ならシングルクォートで囲む方が良い ``` * DELETE ``` DELETE XXX FROM WHERE id IN(1, 2, 3) -- id IN('1', '2', '3') ←id列の定義が文字列ならシングルクォートで囲む方が良い ``` 上記の2つのSQLのIN句の括弧内の値の入り方に注目して下さい。 質問者さんの掲示コードの該当箇所から引っ張ってくると、 ``` WHERE id IN($id) // この時の$idの値が「1, 2, 3」のような形式である必要がある! ``` ソースコメントにも書いてますが、 今ケースのように値をリスト化してSQLを組み立てる際、IN句の括弧内には**カンマ区切りの値リスト**を引き渡す必要があります。 最初にも書きましたが、 カンマ区切りリストを得る場合は、 implode関数を利用しましょう。 ### IN句について 最後にもしかしたら誤解しているかもしれないので念のため補足しますが、 SQLで指定している「id in(〜)」の記述内に出てくる**IN句**ですが、 これは**PHP側の構文ではなくSQL側(MySQL)の構文**となります。 詳しくは以下リンク先をどうぞ。 MySQL IN句(リストで比較) SQL構文の知識に不安がある場合は、 確認の意味でも上記サイトを簡単に巡回すると良いかもしれませんね。 ### コメントを受けまして 先ずDBアクセスが発生する処理を整理しましょう。 今回提示していただいたソースコードでDBとの通信が生じるのは、 * mysqli_connect * mysqli_select_db * mysqli_query の3点です。 **「上記処理の実行回数 = データベースとの通信回数」**と考えてください。 foreachではいけないという指摘は、 3番目の**mysqli_query関数**がループ処理1回ごとに呼び出されるという点から受けたものと考えられます。 また**implode関数**というのはデータベース(MySQL側)の処理ではなく、 **PHP側の処理**となります。 MySQL側の処理とPHP側の処理というのは異なるものなので、 上記2つは基本的には切り離して考えてください。 更に付け加えると、 PHP側の処理のうちmysqli_*(mysqli始まりの関数群)というのが、 **PHPとMySQLを橋渡ししている処理**となります。 つまり今回のケースでは、 **「mysqli_*」の関数以外ではDBとの通信処理が発生するはずがない**ということを抑えてもらえればと思います。