15

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

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

提前致谢!

4

5 回答 5

27

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

$className = '%' . $this->className . '%';
$query->bind_param('s', $className);
于 2009-08-29T18:08:06.780 回答
14

另一种方法是:

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

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

于 2013-02-13T21:53:00.347 回答
6

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

$param = '%' . $this->className . '%';
$query->bind_param('s', $param);
于 2009-08-29T18:07:24.083 回答
1

这与 C++ 中发生的原因相同。当您将值传递给期望参数为引用的函数时,您需要一个变量(不是临时的)。所以首先创建一个变量,然后传递它。

于 2010-06-06T16:58:22.563 回答
-5

现有的答案对我不起作用,所以这就是我使用的:

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

它一直有效。

最重要的是,我只是尝试了最简单的形式,它奏效了

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

我希望这有帮助

于 2011-11-02T20:00:40.760 回答