Liaison de plusieurs valeurs dans une requête SQL PDO (PDOStatement)
Parfois nous avons besoin de rechercher une valeur unique par le biais de plusieurs colonnes lorsque vous créez des instructions SQL.
Supposons que la table ci-dessous
- [ENTITY_ONE]
- ID
- COLUMN_A
- COLUMN_B
- COLUMN_C
- COLUMN_D
- COLUMN_E
Si nous avons besoin de rechercher une valeur unique sur les colonnes B,D et E Nous allons besoin d’utiliser l’instruction suivante
SÉLECTIONNEZ L’ID, COLUMN_A,(...COLONNES...), COLUMN_E DE ENTITY_ONE OÙ COLUMN_B COMME '%search_value%' OU COLUMN_D COMME '%search_value%' OU COLUMN_E COMME '%search_value%';
Dans le code PHP que nous pouvons faire
$q = « % search_value % »;
$SQL = "SÉLECTIONNEZ * DE ENTITY_ONE OÙ COLUMN_B COMME « $q » OU COLUMN_D COMME « $q » OU COLUMN_E COMME « $q »;
$pdo = nouvel AOP($Dsn, $Utilisateur, $Passer);
$stmt = $pdo->Requête($Sql);
Eh bien, this can work but we know that isn’;t la meilleure approche. Nous avons besoin utilisation valeurs contraignantes pour éviter l’injection SQL et autres gâteries malveillants.
Alors, le code peut être modifié pour
$q = « % search_value % »; $SQL = "SÉLECTIONNEZ * DE ENTITY_ONE OÙ COLUMN_B COMME ? OU COLUMN_D COMME ? OU COLUMN_E COMME ?; $args = [$Q, $Q, $Q]; // Nous avons besoin d’une entrée pour chaque "?" sur l’instruction $pdo = nouvel AOP($Dsn, $Utilisateur, $Passer); $stmt = $pdo->Préparer($Sql); $stmt->Exécuter($Args);
Beaucoup mieux, mais, lors de la construction complexe instruction SQL, things can be confusing with lots of arguments and don’;t oublier: QUESTIONS D’ORDRE.
Heureusement AOP peut lier des valeurs en ordre différent quand à l’aide de nommé les liaisons.
$q = « % search_value % »; $SQL = "SÉLECTIONNEZ * DE ENTITY_ONE OÙ COLUMN_B COMME :first_arg OU COLUMN_D LIKE :second_arg OU COLUMN_E LIKE :third_arg; $pdo = nouvel AOP($Dsn, $Utilisateur, $Passer); $stmt = $pdo->Préparer($Sql); // Une façon $args = [':first_arg' => $Q, ':third_arg' =>$Q, ':second_arg' => $Q]; // Nous avons besoin d’une entrée pour chaque ":Nom" on instruction $stmt->Exécuter($Args); // Another way $stmt->bindValue(':third_arg'. $Q); $stmt->bindValue(':first_arg', $Q); $stmt->bindValue(':second_arg', $Q); $stmt->Exécuter();
Hmm, seems that this isn’;t assez bon. Nous changeons seulement l’utilisation de 1-espace réservé indexée pour un :espace réservé nommé. There’;s aucun gain au-delà du code lisible et la possibilité de lier à n’importe quel ordre.
Oui, mais maintenant, nous pouvons faire la meilleure approche lors de l’utilisation d’un terme de recherche unique en plusieurs colonnes. Nous pouvons utiliser qu’une seule liaison à un ou plusieurs :named placeholders ’;cause AOP est intelligent et astucieux. Regardez notre code final ici.
$q = « % search_value % »; $SQL = "SÉLECTIONNEZ * DE ENTITY_ONE OÙ COLUMN_B COMME :unique_arg ou COLUMN_D comme :unique_arg ou COLUMN_E comme :unique_arg; $pdo = nouvel AOP($Dsn, $Utilisateur, $Passer); $stmt = $pdo->Préparer($Sql); // Aller simple $args = [':unique_arg' => $Q]; // Nous pouvons lier tous les :name with only one term $stmt->Exécuter($Args); // Another way $stmt->bindValue(':unique_arg', $Q); $stmt->Exécuter();
Peut sauver beaucoup de frappe lors de l’écriture de nombreuses instructions SQL en utilisant le même argument.