statement sentencias prepared preparadas mysqli_prepare bind_result bind_param mysqli

mysqli - sentencias - prepared statement php



¿Qué es una solución simple para los argumentos dinámicos de bind_param de mysqli en PHP? (3)

Para construir un bind_param dinámicamente, he encontrado esto en otras publicaciones SO.

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

¿Alguien puede analizar esto en inglés sencillo para mí? Me pierdo especialmente que el primer argumento es una matriz.


Hay una manera mucho más simple de hacer esto.

crea esta declaración preparada:

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

y pasa los args para unir así:

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

El predicado (user_id = ? or ?) Será verdadero cuando user_id sea igual al primer parámetro reemplazado, o cuando el segundo parámetro reemplazado sea verdadero.

$user_id cuando se convierte a un int será su valor cuando sea una cadena de representación de un número, o cero de lo contrario. La expresión $userid == "ALL" se evaluará a un booleano, que se pasará a bind_param . No podemos decirle a 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.


Por lo que yo sé, no se puede pasar el resultado de, por ejemplo, $userid == "ALL" al método bind_param de mysqli-statement-Object, 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, cambié la segunda parte del programa a

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

Así, el resultado de la operación booleana se puede pasar por referencia.


array($stmt, ''bindparams'')

es la forma de PHP de identificar el método bind_params en el objeto $stmt , ya que PHP 5 ya no necesita usar el & en el frente (y mysqli es PHP 5, así que esto parece una falla en la publicación anterior).

puedes ver un ejemplo similar aquí

asi que

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

básicamente significa

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