PDO allows you to execute SQL statements that include an IN clause with an array of values. While this approach works well with string concatenation (implode()), it can lead to issues when using placeholders.
Identifying the Issue
The following code, which uses placeholders, doesn't return all items expected:
$in_array = array(1, 2, 3); $in_values = implode(',', $in_array); $my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (:in_values)"); $my_result->execute(array(':in_values' => $in_values)); $my_results = $my_result->fetchAll();
This code only returns the item whose my_value equals the first element in the $in_array (1), not the others (2 and 3).
Solution for Positional Placeholders
PDO requires creating a string with placeholders dynamically and inserting it into the query while binding array values as usual. For positional placeholders, this solution works:
$in = str_repeat('?,', count($in_array) - 1) . '?'; $sql = "SELECT * FROM my_table WHERE my_value IN ($in)"; $stm = $db->prepare($sql); $stm->execute($in_array); $data = $stm->fetchAll();
Solution for Named Placeholders
The approach for named placeholders involves creating a sequence of placeholders (e.g., :id0, :id1, :id2) and collecting the values into a key-value array. Here's an example:
$ids = [1,2,3]; $in = ""; $i = 0; foreach ($ids as $item) { $key = ":id" . $i++; $in .= ($in ? "," : "") . $key; // :id0,:id1,:id2 $in_params[$key] = $item; // collecting values into a key-value array } $sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar"; $stm = $db->prepare($sql); $stm->execute(array_merge(["foo" => "foo", "bar" => "bar"], $in_params)); // merge two arrays $data = $stm->fetchAll();
By following these solutions, you can successfully use PDO with an IN clause containing an array of values.
The above is the detailed content of How to Correctly Use PDO with an IN Clause and an Array in PHP?. For more information, please follow other related articles on the PHP Chinese website!