Resumo : neste tutorial você aprenderá como usar o PDO para executar uma consulta com o IN
operador.
Uma rápida introdução ao operador IN
O IN
operador retorna verdadeiro se um valor estiver em um conjunto de valores. O IN
operador pode ser usado na WHERE
cláusula da instrução SELECT
e .UPDATE
DELETE
Por exemplo, para obter uma lista de livros da books
tabela com id 1, 2 ou 3, você pode usar o IN
operador assim:
SELECT book_id, title
FROM books
WHERE book_id IN (1,2,3);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
É equivalente ao operador = e OR:
SELECT book_id, title
FROM books
WHERE book_id = 1 OR
book_id = 2 OR
book_id = 3;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Execute uma instrução SQL com o operador IN usando PDO
Para executar esta instrução SQL no PDO, você precisa construir uma instrução com os espaços reservados (?) assim:
$sql = 'SELECT book_id, title
FROM books
WHERE book_id IN (?,?,?)';
Linguagem de código: PHP ( php )
E use uma instrução preparada para vincular os valores do array :
$statement = $pdo->prepare($sql);
$statement->execute([1,2,3]);
Linguagem de código: PHP ( php )
Na prática, o tamanho da lista de IDs é dinâmico. Normalmente, você não sabe quantos valores serão passados para o método $sql
e execute()
.
Se você usar um espaço reservado como o seguinte, não funcionará:
$sql = 'SELECT book_id, title
FROM books
WHERE book_id IN ?';
Linguagem de código: PHP ( php )
A razão é que quando você vincula os valores, a instrução ficará assim:
SELECT book_id, title
FROM books
WHERE book_id IN ('1,2,3');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
No entanto, a consulta correta é:
SELECT book_id, title
FROM books
WHERE book_id IN ('1','2','3');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Para corrigir isso, você precisa construir a instrução SQL com base no número de elementos do array. O exemplo a seguir ilustra a solução:
<?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);
Linguagem de código: PHP ( php )
Como funciona.
A get_book_list()
função aceita um objeto PDO e um array de id de livro. Ele retorna uma série de livros.
Primeiro, gere uma lista de marcadores (?) com base no número de elementos do $list
array:
$placeholder = str_repeat('?,', count($list) - 1) . '?';
Linguagem de código: PHP ( php )
Por exemplo, se a lista $ tiver três elementos, o espaço reservado será ‘?,?,?’;
A seguir, use o espaço reservado para construir a instrução SQL:
$sql = "SELECT book_id, title
FROM books
WHERE book_id in ($placeholder)";
Linguagem de código: PHP ( php )
Em seguida, prepare a declaração para execução:
$statement = $pdo->prepare($sql);
Linguagem de código: PHP ( php )
Depois disso, execute a instrução passando $list
:
$statement->execute($list);
Linguagem de código: PHP ( php )
Finalmente, busque todas as linhas do conjunto de resultados e retorne uma matriz associativa:
return $statement->fetchAll(PDO::FETCH_ASSOC);
Linguagem de código: PHP ( php )
O código a seguir se conecta ao banco de dados e usa a get_book_list()
função para obter o livro com id no conjunto 1, 2 e 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);
Linguagem de código: PHP ( php )
Resumo
- Gere espaços reservados (
?
) e construa a instrução SQL com oIN
operador. - Use uma instrução preparada para executar a instrução SQL passando uma matriz de valores.