Php 在prepared语句中使用通配符-MySQLi

Php 在prepared语句中使用通配符-MySQLi,php,mysqli,prepared-statement,wildcard,Php,Mysqli,Prepared Statement,Wildcard,我正在尝试运行以下查询,但通配符有问题 function getStudents() { global $db; $users = array(); $query = $db->prepare("SELECT id, adminRights FROM users WHERE classes LIKE ? && adminRights='student'"); $query->bind_param('

我正在尝试运行以下查询,但通配符有问题

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

提前谢谢

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

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

您必须通过引用将参数传递给
bind_param()
,这意味着您必须传递单个变量(而不是串联字符串)。您没有理由不能构造这样一个专门用于传入的变量,不过:

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

<>这是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."%'";

我希望这有帮助

另一种方法是:

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

如果您有一个动态结果绑定,并且只想更改SQL查询…

正确,这非常方便,因为手册的第一句话是:“将变量绑定到一个准备好的语句作为参数”(重点放在变量上)第二个查询的可能重复是危险的,不应该使用,因为它容易受到SQL注入攻击。这是一个完美的例子,说明了不应该做什么。非常有用。绑定参数对我来说是无用的,因为变量计数不断变化。