2009-04-16 5 views

Respuesta

15
array($stmt, 'bindparams') 

es forma de identificar bind_params método en el objeto $stmt, a partir de PHP 5 que no es necesario utilizar el & delante de PHP por más tiempo (y mysqli es PHP 5 por lo que este se parece a un problema técnico en el mayor enviar).

se puede ver un ejemplo similar here

por lo

call_user_func_array(array($stmt, 'bindparams'), $array_of_params); 

significa básicamente

$stmt->bind_params($array_of_params[0], $array_of_params[1] ... $array_of_params[N]) 
+0

GRACIAS ... puedo decir que va a ser un buen día ahora – johnnietheblack

1

Hay una manera mucho simper para hacer esto.

crear esta declaración preparada:

select * from mytable 
where status = ? and (userid = ? or ?) 
and (location = ? or ?) 
order by `date` desc, time desc 
limt ? 

y pasar los args a unirse como este:

$stmt = $mysqli->prepare([statement above]); 
$stmt->bind_param("siiiii", 
    "active", $userid, $userid == "ALL", 
    $location, $location == "ALL", 
    $limit); 

El predicado (user_id = ? or ?) será cierto cuando la user_id es igual al primer parámetro sustituido, o cuando el el segundo parámetro reemplazado es verdadero.

$user_id cuando se convierte a un int será su valor cuando se trata de una cadena de representación de un número, o cero en caso contrario. La expresión $userid == "ALL" evaluará a un booleano, que se pasará a bind_param. No podemos decir bind_param que un parámetro es un booleano (la cadena de formato solo comprende cadena, int, doble y blob), por lo que bind_param convertirá el booleano en un int, que funciona para nosotros.

Siempre que ningún user_id o location_id en la base de datos sea cero, está bien.

+0

+1 esto resuelve algunos otros problemas míos también :) – johnnietheblack

2

Por lo que sé, no puede pasar el resultado de, p. Ej. $userid == "ALL" a un método mysqli-statement-bind_param del objeto, porque este método quiere que los parámetros se pasen por referencia. Obviamente, esto no es posible con el resultado de una expresión evaluada "en su lugar".

Como solución, he cambiado segunda parte del programa para

$userIdEmpty = $userid == "ALL"; 
$locationEmpty = $location = "ALL"; 
$stmt->bind_param("siiiii", 
    "active", $userid, $userIdEmpty, 
    $location, $locationEmpty, 
    $limit); 

Al igual que, el resultado de la operación booleana se puede pasar por referencia.

Cuestiones relacionadas