php 在预准备语句中使用通配符

wfypjpf4  于 2022-12-10  发布在  PHP
关注(0)|答案(4)|浏览(143)

我正在尝试运行以下查询,但在使用通配符时遇到问题。

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。
我需要使用通配符的原因是因为列的数据包含序列化数组。我想,如果有更简单的方法来处理这个问题,我该怎么做呢?

ttp71kqs

ttp71kqs1#

你必须通过引用将参数传递给bind_param(),这意味着你必须传递一个单个变量(而不是一个连接字符串)。

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

ykejflvf2#

另一种方法是:

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

如果您有一个动态结果绑定,并且只想更改SQL查询,这将非常方便...

n53p2ov0

n53p2ov03#

参数#2必须是一个引用,而不是一个值。请尝试

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

bqujaahr4#

这和C++中的情况是一样的。当你把一个值传递给一个函数,而这个函数期望参数是一个引用时,你需要一个变量(不是临时的)。所以首先创建一个变量,然后传递它。

相关问题