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.
Laisser une réponse