Summary: in this tutorial, you’ll learn how to use PDO to execute a query with the IN
operator.
A quick introduction to the IN operator
The IN
operator returns true if a value is in a set of values. The IN
operator can be used in the WHERE
clause of the SELECT
, UPDATE
and DELETE
statement.
For example, to get a list of books from the books
table with id is either 1, 2, or 3, you can use the IN
operator like this:
SELECT book_id, title
FROM books
WHERE book_id IN (1,2,3);
Code language: SQL (Structured Query Language) (sql)
It’s equivalent to the = and OR operator:
SELECT book_id, title
FROM books
WHERE book_id = 1 OR
book_id = 2 OR
book_id = 3;
Code language: SQL (Structured Query Language) (sql)
Execute an SQL statement with the IN operator using PDO
To execute this SQL statement in PDO, you need to construct a statement with the placeholders (?) like this:
$sql = 'SELECT book_id, title
FROM books
WHERE book_id IN (?,?,?)';
Code language: PHP (php)
And use a prepared statement to bind the values from the array:
$statement = $pdo->prepare($sql);
$statement->execute([1,2,3]);
Code language: PHP (php)
In practice, the size of the id list is dynamic. Typically, you don’t know how many values will be passed to both the $sql
and execute()
method.
If you use one placeholder like the following, it won’t work:
$sql = 'SELECT book_id, title
FROM books
WHERE book_id IN ?';
Code language: PHP (php)
The reason is that when you bind the values, the statement will look like this:
SELECT book_id, title
FROM books
WHERE book_id IN ('1,2,3');
Code language: SQL (Structured Query Language) (sql)
However, the correct query is:
SELECT book_id, title
FROM books
WHERE book_id IN ('1','2','3');
Code language: SQL (Structured Query Language) (sql)
To fix this, you need to construct the SQL statement based on the number of elements in the array. The following example illustrates the solution:
<?php
/**
* Return an array of books with the book id in the $list
*/
function get_book_list(\PDO $pdo, array $list): array
{
$placeholder = str_repeat('?,', count($list) - 1) . '?';
$sql = "SELECT book_id, title
FROM books
WHERE book_id in ($placeholder)";
$statement = $pdo->prepare($sql);
$statement->execute($list);
return $statement->fetchAll(PDO::FETCH_ASSOC);
}
// connect to the database
$pdo = require 'connect.php';
// get a list of book
$books = get_book_list($pdo, [1, 2, 3]);
print_r($books);
Code language: PHP (php)
How it works.
The get_book_list()
function accepts a PDO object and an array of book id. It returns an array of books.
First, generate a list of the placeholders (?) based on the number of elements in the $list
array:
$placeholder = str_repeat('?,', count($list) - 1) . '?';
Code language: PHP (php)
For example, if the $list has three elements, the placeholder wil be ‘?,?,?’;
Next, use the placeholder to construct the SQL statement:
$sql = "SELECT book_id, title
FROM books
WHERE book_id in ($placeholder)";
Code language: PHP (php)
Then, prepare the statement for execution:
$statement = $pdo->prepare($sql);
Code language: PHP (php)
After that, execute the statement by passing the $list
:
$statement->execute($list);
Code language: PHP (php)
Finally, fetch all rows from the result set and return an associative array:
return $statement->fetchAll(PDO::FETCH_ASSOC);
Code language: PHP (php)
The following code connects to the database and uses the get_book_list()
function to get the book with id in the set 1, 2, and 3:
// connect to the database
$pdo = require 'connect.php';
// get a list of book
$books = get_book_list($pdo, [1, 2, 3]);
print_r($books);
Code language: PHP (php)
Summary
- Generate placeholders (
?
) and construct the SQL statement with theIN
operator. - Use a prepared statement to execute the SQL statement by passing an array of values.