在准备好的语句中使用通配符 - MySQLi

10 php mysqli wildcard prepared-statement

我正在尝试运行以下查询,我遇到了通配符问题.

   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;
    }
Run Code Online (Sandbox Code Playgroud)

我收到一条错误,指出:无法通过引用传递参数2.我需要使用通配符的原因是因为列的数据包含序列化数组.我想,如果有更简单的方法来解决这个问题,我该怎么办?

提前致谢!

Vot*_*ple 18

您必须bind_param()通过引用传递参数,这意味着您必须传递单个变量(不是连接的字符串).但是没有理由你不能专门构造这样一个变量来传入:

$className = '%' . $this->className . '%';
$query->bind_param('s', $className);
Run Code Online (Sandbox Code Playgroud)


Dom*_*nik 11

另一种方法是:

SELECT id, adminRights FROM users 
  WHERE classes LIKE CONCAT("%", ?, "%") && adminRights='student'
Run Code Online (Sandbox Code Playgroud)

如果您有动态结果绑定并且只想更改SQL查询,这很方便...


Vol*_*erK 5

参数#2必须是引用,而不是值.尝试

$param = '%' . $this->className . '%';
$query->bind_param('s', $param);
Run Code Online (Sandbox Code Playgroud)