DOP IN

Resumo : neste tutorial você aprenderá como usar o PDO para executar uma consulta com o INoperador.

Uma rápida introdução ao operador IN

O INoperador retorna verdadeiro se um valor estiver em um conjunto de valores. O INoperador pode ser usado na WHEREcláusula da instrução SELECTe .UPDATEDELETE

Por exemplo, para obter uma lista de livros da bookstabela com id 1, 2 ou 3, você pode usar o INoperador 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 $sqle 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 $listarray:

$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 o INoperador.
  • Use uma instrução preparada para executar a instrução SQL passando uma matriz de valores.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *