Что такое простое решение для динамических аргументов mysqli bind_param в PHP? - PullRequest
7 голосов
/ 16 апреля 2009

Чтобы динамически создать bind_param, я нашел это в других сообщениях SO.

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

Может ли кто-нибудь объяснить это на простом английском для меня? Я особенно теряюсь, что первый аргумент - это массив.

Ответы [ 3 ]

16 голосов
/ 16 апреля 2009
array($stmt, 'bindparams') 

- это способ PHP идентифицировать метод bind_params для объекта $stmt, поскольку в PHP 5 вам больше не нужно использовать & впереди (а mysqli - это PHP 5, так что в старшей версии это выглядит как сбой) почта).

вы можете увидеть похожий пример здесь

так

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

в основном означает

$stmt->bind_params($array_of_params[0], $array_of_params[1] ... $array_of_params[N])
2 голосов
/ 19 октября 2011

Насколько я знаю, вы не можете передать результат, например, $userid == "ALL" в метод bind_param объекта mysqli-Statement-Object, потому что этот метод хочет, чтобы параметры передавались по ссылке. Очевидно, что это невозможно, если результат выражения оценивается «на месте».

В качестве обходного пути я изменил вторую часть программы на

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

Таким образом, результат логической операции может быть передан по ссылке.

1 голос
/ 16 апреля 2009

Есть гораздо более простой способ сделать это.

создайте этот подготовленный оператор:

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, все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...