2009-08-29 12 views
9

Estoy tratando de ejecutar la siguiente consulta, y estoy teniendo problemas con el comodín.Usar comodines en una declaración preparada - MySQLi

function getStudents() { 
     global $db; 
     $users = array(); 
     $query = $db->prepare("SELECT id, adminRights FROM users WHERE classes LIKE ? && adminRights='student'"); 
     $query->bind_param('s', '%' . $this->className . '%'); 
     $query->execute(); 
     $query->bind_result($uid, $adminRights); 
     while ($query->fetch()) { 
      if (isset($adminRights[$this->className]) && $adminRights[$this->className] == 'student') 
       $users[] = $uid; 
     } 
     $query->close(); 
     return $users; 
    } 

Recibo un error que indica: No se puede pasar el parámetro 2 por referencia. La razón por la que necesito usar el comodín es porque los datos de la columna contienen matrices serializadas. Supongo que, si hay una manera más fácil de manejar esto, ¿qué podría hacer?

¡Gracias de antemano!

+0

posible duplicado de [ SQL como los problemas de declaración] (http://stackoverflow.com/questions/618527/sql-like-statement-problems) – outis

Respuesta

16

Tienes que pasar parámetros a bind_param() por referencia, lo que significa que tiene que pasar un solo (no una cadena concatenada) Variable . No hay razón para que no se puede construir una variable tal específicamente a pasar, sin embargo:

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

El parámetro n. ° 2 debe ser una referencia, no un valor. Trate

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

Correcto, como dice la primera oración en el manual: "Vincula las variables a una declaración preparada como parámetros" (énfasis en las variables) – Zed

0

Es la misma razón por la que ocurre en C++. Cuando pasa un valor a una función que espera que el argumento sea una referencia, necesita una variable (no temporal). Entonces primero crea una variable y luego pásala.

-4

Las respuestas existentes no funcionan para mí, así que esto es lo que he usado en su lugar:

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

Y trabajan todo el tiempo.

y justo para rematar, he intentado la forma más simple y funcionó

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

espero que esto ayude a

+1

La segunda consulta es peligrosa y debe *** nunca *** usarse ya que está abierta a ataques de inyección SQL. – zzzzBov

+1

Ejemplo perfecto de qué * no * hacer. –

7

Otra manera de hacer esto es:

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

Este es útil en caso de que tenga un enlace de resultado dinámico y solo desee cambiar la consulta SQL ...

Cuestiones relacionadas