Enlace varios valores en la instrucción SQL de PDO (PDOStatement)
A veces necesitamos buscar un valor único a través de varias columnas al crear instrucciones SQL.
Supongamos la siguiente tabla
- [ENTITY_ONE]
- ID
- COLUMN_A
- COLUMN_B
- COLUMN_C
- COLUMN_D
- COLUMN_E
Si necesitamos buscar un valor en columnas B,D y E necesario utilizaremos la siguiente instrucción
SELECCIONAR ID, COLUMN_A,(...Columnas..), COLUMN_E DE ENTITY_ONE DONDE COLUMN_B COMO '%search_value%' O COLUMN_D COMO '%search_value%' O COLUMN_E COMO '%search_value%';
Código PHP que podemos hacer
$q ' '%search_value%';
$sql ? "Seleccione * DESDE ENTITY_ONE DONDE COLUMN_B COMO '$q' O COLUMN_D COMO '$q' O COLUMN_E COMO '$q';
$pdo - nueva DOP($Dsn, $Usuario, $Pasar);
$stmt = $pdo->Consulta($Sql);
Bien, this can work but we know that isn’;t el mejor enfoque. Necesitamos utilizamos valores vinculantes para evitar SQL injection y otras golosinas que.
Por lo tanto, el código puede ser modificado a
$q ' '%search_value%'; $sql ? "Seleccione * DE ENTITY_ONE DONDE COLUMN_B COMO ? O COLUMN_D COMO ? O COLUMN_E COMO ?; $args ? [$Q, $Q, $Q]; // Necesitamos una entrada para cada "?" instrucciones $pdo - nueva DOP($Dsn, $Usuario, $Pasar); $stmt = $pdo->Preparar($Sql); $stmt->Ejecutar($Args);
Mucho mejor, pero, al generar instrucciones SQL complejas, things can be confusing with lots of arguments and don’;no se olvide: ASUNTOS DE ORDEN.
Felizmente PDO puede enlazar valores en orden diferente cuando usando el nombre enlaces.
$q ' '%search_value%'; $sql ? "Seleccione * DE ENTITY_ONE DONDE COLUMN_B COMO :first_arg o COLUMN_D COMO :second_arg o COLUMN_E COMO :third_arg; $pdo - nueva DOP($Dsn, $Usuario, $Pasar); $stmt = $pdo->Preparar($Sql); // Una forma $args ? [':first_arg' => $Q, ':third_arg' =>$Q, ':second_arg' => $Q]; // Necesitamos una entrada para cada ":Nombre" on instruction $stmt->Ejecutar($Args); // Another way $stmt->bindValue(':third_arg'. $Q); $stmt->bindValue(':first_arg', $Q); $stmt->bindValue(':second_arg', $Q); $stmt->Ejecutar();
Hmm, seems that this isn’;t bueno. Sólo cambiamos el uso de 1-marcador de posición indexada a un :marcador de posición nombre. There’;s ningún beneficio más allá del código legible y la posibilidad de enlazar en cualquier orden.
Sí, pero ahora podemos hacer la mejor aproximación cuando se utiliza un término de búsqueda única en varias columnas. Podemos utilizar solamente un lazo a uno o más :named placeholders ’;causa PDO es inteligente y listo. Mira aquí nuestro código final.
$q ' '%search_value%'; $sql ? "Seleccione * DE ENTITY_ONE DONDE COLUMN_B COMO :unique_arg o COLUMN_D COMO :unique_arg o COLUMN_E COMO :unique_arg; $pdo - nueva DOP($Dsn, $Usuario, $Pasar); $stmt = $pdo->Preparar($Sql); // Una forma $args ? [':unique_arg' => $Q]; // Podemos atar a todos :name with only one term $stmt->Ejecutar($Args); // Another way $stmt->bindValue(':unique_arg', $Q); $stmt->Ejecutar();
Puede ahorrar un montón de escribir al escribir muchas instrucciones SQL utilizando el mismo argumento.