Liaison de plusieurs valeurs dans une requête SQL PDO (PDOStatement)

O que ando ainda nesta caminhada sobre un Terra

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 
FROM ENTITY_ONE WHERE COLUMN_B LIKE '%search_value%' OR COLUMN_D LIKE '%search_value%' OR COLUMN_E LIKE '%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); 
// One way 
$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

Votre adresse email ne sera pas publié. Les champs obligatoires sont marqués *

Ce site utilise Akismet pour réduire le spam. Apprenez comment vos données de commentaire sont transformées.