Есть гораздо более простой способ сделать это.
создайте этот подготовленный оператор:
select * from mytable
where status = ? and (userid = ? or ?)
and (location = ? or ?)
order by `date` desc, time desc
limt ?
и передайте аргументы для связывания следующим образом:
$stmt = $mysqli->prepare( [statement above] );
$stmt->bind_param( "siiiii",
"active", $userid, $userid == "ALL",
$location, $location == "ALL",
$limit);
Предикат (user_id = ? or ?)
будет иметь значение true, когда user_id равен первому замененному параметру или когда второй замененный параметр имеет значение true.
$user_id
при преобразовании в int будет его значением, если это строковое представление числа, или ноль в противном случае. Выражение $userid == "ALL"
будет вычислено как логическое значение, которое будет передано bind_param
. Мы не можем сказать bind_param
, что параметр является логическим значением (строка формата понимает только строку, int, double и blob), поэтому bind_param преобразует логическое значение в int, что нам подходит.
Пока в базе данных нет ни user_id, ни location_id, все в порядке.