2010-04-27 9 views
18

Dans cette requêtemysql AOP comment lier COMME

select wrd from tablename WHERE wrd LIKE '$partial%' 

Je suis en train de lier la '$partial%' variable AOP. Je ne sais pas comment cela fonctionne avec le % à la fin.

Serait-il

select wrd from tablename WHERE wrd LIKE ':partial%' 

:partial est lié à $partial="somet"

ou serait-il

select wrd from tablename WHERE wrd LIKE ':partial' 

:partial est lié à $partial="somet%"

ou serait-il quelque chose e vraiment différent?

+3

La dernière option devrait fonctionner ... – Cfreak

+1

moins les citations – bobince

Répondre

27

+1 réponse de karim couvre. Vous pouvez également dire:

"SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')" 

de faire la chaîne de caractères à la fin de MySQL, pas qu'il y ait de raison particulière dans ce cas. Les choses deviennent un peu plus délicates si le wrd partiel que vous recherchez peut lui-même contenir un caractère de pourcentage ou de soulignement (puisque ceux-ci ont une signification particulière pour l'opérateur LIKE) ou un backslash (que MySQL utilise comme autre couche d'échappement dans l'opérateur LIKE - incorrectement, selon la norme ANSI SQL).

Espérons que cela ne vous affecte pas, mais si vous avez besoin d'obtenir ce droit de cas, voici la solution en désordre:

$stmt= $db->prepare("SELECT wrd FROM tablename WHERE wrd LIKE :term ESCAPE '+'"); 
$escaped= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $var); 
$stmt->bindParam(':term', $escaped); 
+2

+1 Maintenant que je l'ai lu, je réalise qu'il est vous qui a couvert, et pas moi. – karim79

+1

Pour échapper ou ne pas s'échapper ... Cela dépend de l'intention du personnage. Était-ce l'intention d'être un joker ou un littéral? Je ne m'attendrais pas à une déclaration préparée pour décider de cela pour moi. Son travail est d'échapper des caractères dans la valeur qui mettrait fin à la clause 'LIKE' et injecterait un sql non désiré. – Stoutie

+0

+1 pour la solution 'désordonnée'. La seule fois où je ne l'utiliserais pas, c'est si je voulais donner à mes utilisateurs la possibilité de mettre des caractères génériques dans leur propre chaîne de recherche. –

13
$var = "partial%"; 
$stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial"); 
$stmt->bindParam(":partial", $var); 
$stmt->execute(); // or $stmt->execute(array(':partial' => $var)); without 
        // first calling bindParam() 
$rs = $stmt->fetchAll(); 

paramètres à l'aide des points d'interrogation:

$stmt = $dbh->prepare('select wrd from tablename WHERE wrd LIKE ?'); 
$stmt->execute(array('partial%')); 
$rs = $stmt->fetchAll(); 

http://www.php.net/manual/en/pdo.prepare.php

-4

Qui a écrit le Answare (peut être karim79):

$var ="partial%" 
$stmt =$dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial") 
$stmt->bindParam(":partial",$var) 
$stmt->execute(); //or$stmt->execute(array(':partial'=>$var)); without 
        // first calling bindParam() 
$rs =$stmt->fetchAll(); 

paramètres à l'aide des points d'interrogation:

$stmt =$dbh->prepare('select wrd from tablename WHERE wrd LIKE ?'); 
$stmt->execute(array('partial%')); 
$rs =$stmt->fetchAll(); 

Un grand merci à lui. Je cherchais le code & vu de nombreux exemples, mais je ne pouvais pas résoudre mon problème. Cette fois, j'ai réussi à le faire. J'ai utilisé la section "Utilisation des paramètres de point d'interrogation:" du code.

Pour d'autres aider, si vous voulez récupérer la valeur d'une variable que vous pouvez modifier le code pour

$stmt->execute(array($variable.'%')); 

au lieu de

$stmt->execute(array('partial%')); 

Parce que le mot « partiel » est spécifié dans le répondre et ne peut pas être changé. Merci beaucoup.

+0

C'est surtout un merci, pas une réponse. – ScottR

+0

ce n'est même pas votre question * lol !! * –

-1

Voici comment vous devriez le faire

bindValue(':partial', '%' . $_GET['partial'] . '%'); 

Merci,

Qwerty

-1

Le code ci-dessous ne montre que les premiers mots-clés dans la base de données!

"SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')" 

Essayez celui-ci si vous voulez rechercher tous les mots-clés de la base de données

"SELECT wrd FROM tablename WHERE wrd LIKE :partial"; 
$stmt->execute(array(':partial'=>'%'.$YourVarHere.'%')); 
0

Vous pouvez utiliser addcslashes avant préparée. J'ai testé sur mysql.

$value = addcslashes($value, '%'); 
$stmt = $db->prepare('select * from products where description like ?'); 
$stmt->execute(["$value%"]);