2009-04-16 4 views

risposta

15
array($stmt, 'bindparams') 

è il modo di PHP per identificare metodo bind_params sull'oggetto $stmt, dal PHP 5 non è necessario utilizzare il & di fronte più a lungo (e mysqli è PHP 5 in modo da questo appare come un problema tecnico nel vecchio inviare).

si può vedere un esempio simile here

così

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

significa fondamentalmente

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

GRAZIE ... posso dire che sarà un buon giorno ora ha – johnnietheblack

1

C'è un modo molto simper per fare questo.

creare questa dichiarazione preparata:

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

e passare i args per legare in questo modo:

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

Il predicato (user_id = ? or ?) sarà vero quando l'user_id è uguale al primo parametro sostituito, o quando il il secondo parametro sostituito è vero.

$user_id quando convertito in un int sarà il suo valore quando è una rappresentazione in stringa di un numero o zero altrimenti. L'espressione $userid == "ALL" verrà valutata su un valore booleano, che verrà passato a bind_param. Non possiamo dire a bind_param che un parametro è un valore booleano (la stringa di formato comprende solo string, int, double e blob), quindi bind_param convertirà il valore booleano in un int, che funziona per noi.

Fintantoché nessun ID_utente o id_destinazione nel database è zero, stai bene.

+0

+1 questo risolve anche altri miei problemi :) – johnnietheblack

2

Per quanto ne so, non è possibile passare il risultato di, ad es. $userid == "ALL" in un metodo mysqli-istruzione: il metodo bind_param dell'oggetto, poiché questo metodo richiede che i parametri vengano passati per riferimento. Ovviamente questo non è possibile con il risultato di un'espressione valutata "sul posto".

Per aggirare il problema, ho cambiato seconda parte del programma per

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

Come quella, il risultato dell'operazione booleana può essere passato per riferimento.

Problemi correlati