Использование подстановочных знаков в подготовленном сообщении – MySQLi

Я пытаюсь запустить следующий запрос, и у меня возникают проблемы с шаблоном.

function getStudents() { global $db; $users = array(); $query = $db->prepare("SELECT id, adminRights FROM users WHERE classes LIKE ? && adminRights='student'"); $query->bind_param('s', '%' . $this->className . '%'); $query->execute(); $query->bind_result($uid, $adminRights); while ($query->fetch()) { if (isset($adminRights[$this->className]) && $adminRights[$this->className] == 'student') $users[] = $uid; } $query->close(); return $users; } 

Я получаю сообщение об ошибке: Не удается передать параметр 2 по ссылке. Причина, по которой мне нужно использовать шаблон, заключается в том, что данные столбца содержат сериализованные массивы. Я думаю, если есть более простой способ справиться с этим, что я могу сделать?

Заранее спасибо!

Вы должны передать параметры bind_param() по ссылке, что означает, что вам нужно передать одну переменную (а не конкатенированную строку). Нет никакой причины, по которой вы не можете сконструировать такую ​​переменную, специально предназначенную для прохождения, хотя:

 $className = '%' . $this->className . '%'; $query->bind_param('s', $className); 

Другой способ сделать это:

 SELECT id, adminRights FROM users WHERE classes LIKE CONCAT("%", ?, "%") && adminRights='student' 

Это удобно в случае, если у вас есть динамическое связывание результатов и вы хотите изменить SQL-запрос …

Параметр №2 должен быть ссылкой, а не значением. Пытаться

 $param = '%' . $this->className . '%'; $query->bind_param('s', $param); 

Это та же самая причина, которая происходит в C ++. Когда вы передаете значение функции, которая ожидает, что аргумент является ссылкой, вам нужна переменная (не временная). Поэтому сначала создайте переменную, а затем передайте ее.

Существующие ответы не работали для меня, поэтому я использовал вместо этого:

  $sql = mysql_query("SELECT * FROM `products` WHERE `product_title` LIKE '$userInput%'") or die(mysq_error()); 

И он работает все время.

и только для того, чтобы все это я просто попробовал простейшую форму, и это сработало

 $sql = "SELECT * FROM `products` WHERE `product_title` LIKE '%".$userInput."%'"; 

надеюсь, это поможет