À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.