2009-08-29 8 views
9

J'essaie d'exécuter la requête suivante et j'ai des problèmes avec le caractère générique. Je reçois une erreur indiquant: Impossible de transmettre le paramètre 2 par référence. La raison pour laquelle j'ai besoin d'utiliser le caractère générique est parce que les données de la colonne contiennent des tableaux sérialisés. Je suppose, s'il y a un moyen plus facile de gérer cela, que pourrais-je faire?Utilisation de caractères génériques dans l'instruction préparée - MySQLi

Merci d'avance!

+0

duplication possible de [ Problèmes d'instruction SQL like] (http://stackoverflow.com/questions/618527/sql-like-statement-problems) – outis

Répondre

16

Vous devez passer des paramètres à bind_param() par référence, ce qui signifie que vous devez passer une seule variable (pas une chaîne concaténée). Il n'y a pas de raison que vous ne puissiez pas construire une telle variable spécifiquement pour la transmission, bien que:

$className = '%' . $this->className . '%'; 
$query->bind_param('s', $className); 
5

Le paramètre n ° 2 doit être une référence et non une valeur. Essayez

$param = '%' . $this->className . '%'; 
$query->bind_param('s', $param); 
+0

Corriger, comme le dit la première phrase du manuel: "Lie les variables à une instruction préparée en tant que paramètres" (en mettant l'accent sur les variables – Zed

0

C'est la même raison que cela arrive en C++. Lorsque vous transmettez une valeur à une fonction qui s'attend à ce que l'argument soit une référence, vous avez besoin d'une variable (non temporaire). Donc d'abord créer une variable et ensuite la passer.

-4

Les réponses existantes ne fonctionnait pas pour moi, donc ce que j'utilisé à la place:

$sql = mysql_query("SELECT * FROM `products` WHERE `product_title` LIKE '$userInput%'") or die(mysq_error()); 

Et ça marche tout le temps.

et juste pour couronner le tout ce que je viens d'essayer la forme la plus simple et cela a fonctionné

$sql = "SELECT * FROM `products` WHERE `product_title` LIKE '%".$userInput."%'"; 

J'espère que cette aide

+1

La deuxième requête est dangereuse et ne devrait jamais être utilisée car elle est ouverte aux attaques par injection SQL. – zzzzBov

+1

Parfait exemple de ce que * pas * faire. –

7

Une autre façon de faire est la suivante:

SELECT id, adminRights FROM users 
    WHERE classes LIKE CONCAT("%", ?, "%") && adminRights='student' 

C'est pratique dans le cas où vous avez un lien de résultat dynamique et que vous voulez seulement changer la requête SQL ...