Rss

  • youtube
  • linkedin
  • google

Archives for : Valores múltiplos vinculantes

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 de ENTITY_ONE onde COLUMN_B como '% search_value %' ou COLUMN_D como '% search_value %' ou COLUMN_E como '% 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 "?" na instrução $pdo = novo DOP($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); 
// Uma maneira de $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); 
// Uma maneira de $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.