Использование подстановочных знаков в подготовленном утверждении - MySQLi - PullRequest
10 голосов
/ 29 августа 2009

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

   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 по ссылке. Причина, по которой мне нужно использовать подстановочный знак, заключается в том, что данные столбца содержат сериализованные массивы. Я думаю, если есть более простой способ справиться с этим, что я мог сделать?

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

Ответы [ 5 ]

18 голосов
/ 29 августа 2009

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

$className = '%' . $this->className . '%';
$query->bind_param('s', $className);
10 голосов
/ 14 февраля 2013

Еще один способ сделать это:

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

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

5 голосов
/ 29 августа 2009

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

$param = '%' . $this->className . '%';
$query->bind_param('s', $param);
0 голосов
/ 03 ноября 2011

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

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

И это работает постоянно.

и просто чтобы превзойти все это, я просто попробовал простейшую форму, и она сработала

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

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

0 голосов
/ 06 июня 2010

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

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