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.
GRACIAS ... puedo decir que va a ser un buen día ahora – johnnietheblack