Vinculação de vários valores em instrução de SQL com PDO (PDOStatement)

O que ando aprendendo nesta caminhada sobre a Terra

Vinculação de vários valores em instrução de SQL com PDO (PDOStatement)

Às vezes temos de procurar um único valor através de várias colunas ao criar instruções SQL.

Suponha a tabela abaixo

  • [ENTITY_ONE]
    • ID
    • COLUMN_A
    • COLUMN_B
    • COLUMN_C
    • COLUMN_D
    • COLUMN_E

Se precisamos procurar um único valor nas colunas B,D e E Vamos precisar usar a seguinte instrução

SELECIONE A ID, COLUMN_A,(...COLUNAS...), COLUMN_E 
FROM ENTITY_ONE WHERE COLUMN_B LIKE '%search_value%' OR COLUMN_D LIKE '%search_value%' OR COLUMN_E LIKE '%search_value%';

No código PHP podemos fazer

$q = '% search_value %';
$SQL = "SELECIONE * DE ENTITY_ONE onde COLUMN_B como '$q' ou COLUMN_D como '$q' ou COLUMN_E como '$q'; 
$DOP = novo DOP($DSN, $usuário, $passar); 
$stmt = $pdo->;consulta($SQL);

Bem, this can work but we know that isn’;a melhor abordagem. Nós precisamos usar valores de ligação para evitar a injeção SQL e outras coisas maliciosas.

Então, o código pode ser modificado para

$q = '% search_value %'; 
$SQL = "SELECIONE * DE ENTITY_ONE ONDE COLUMN_B COMO ? OU COLUMN_D COMO ? OU COLUMN_E COMO ?; 
$args = [$q, $q, $q]; // Precisamos de uma entrada para cada "?" on instruction
$pdo = new PDO($DSN, $usuário, $passar); 
$stmt = $pdo->;Prepare-se($SQL);
$stmt->;executar($args);

Muito melhor, Mas, Quando estiver criando instruções de SQL complexas, things can be confusing with lots of arguments and don’;esqueça: A ORDEM IMPORTA.

Felizmente PDO pode vincular os valores em ordem diferente quando usando ligações nomeadas.

$q = '% search_value %'; 
$SQL = "SELECIONE * DE ENTITY_ONE ONDE COLUMN_B COMO :first_arg ou COLUMN_D como :second_arg ou COLUMN_E como :third_arg; 

$DOP = novo DOP($DSN, $usuário, $passar); 
$stmt = $pdo->;Prepare-se($SQL); 
// One way
$args = [':first_arg' =>; $q, ':third_arg' =>;$q, ':second_arg' =>; $q]; // Precisamos de uma entrada para cada ":nome" on instruction 
$stmt->;executar($args); 
// Another way
$stmt->;bindValue(':third_arg'. $q);
$stmt->;bindValue(':first_arg', $q); 
$stmt->;bindValue(':second_arg', $q);

$stmt->;executar(); 

Hmm, seems that this isn’;bom o suficiente. Só mudamos o uso de 1-espaço reservado indexado para um :espaço reservado nomeado. There’;ganho além do código ficar mais legível e a possibilidade de ligar em qualquer ordem.

Sim, Mas agora podemos fazer a melhor abordagem possível ao usar um termo de pesquisa único em várias colunas. Podemos usar apenas um bind para um ou mais :named placeholders ‘;porque o PDO é esperto e inteligente. Olha nosso código final aqui.

$q = '% search_value %'; 
$SQL = "SELECIONE * DE ENTITY_ONE ONDE COLUMN_B COMO :unique_arg ou COLUMN_D como :unique_arg ou COLUMN_E como :unique_arg; 
$DOP = novo DOP($DSN, $usuário, $passar); 
$stmt = $pdo->;Prepare-se($SQL); 
// One way 
$args = [':unique_arg' =>; $q]; // Podemos vincular todos :name with only one term 
$stmt->;executar($args); 
// Another way 
$stmt->;bindValue(':unique_arg', $q); 
$stmt->;executar(); 

Pode economizar um monte de digitação quando escrevendo muitas instruções SQL, usando o mesmo argumento.

 ;

Deixe um comentário

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

Este site utiliza o Akismet para reduzir spam. Fica a saber como são processados os dados dos comentários.