在事先准备好的声明中使用通配符 - 库MySQLi(Using wildcards in prepa

2019-06-21 06:18发布

我试图运行下面的查询,我在使用通配符的麻烦。

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

提前致谢!

Answer 1:

你必须通过参数bind_param()引用,这意味着你必须通过一个变量 (不是一个连接字符串)。 没有理由不能构造明确这样一个变量来传递,虽然:

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


Answer 2:

另一种方法是这样的:

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

这是在方便的情况下你有一个动态的结果绑定,只希望更改SQL查询...



Answer 3:

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

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


Answer 4:

这是发生在C ++一样的道理。 当值传递给它期望参数为基准的功能,则需要一个变量(未暂时的)。 因此,首先创建一个变量,然后将它传递。



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

我希望这有帮助



文章来源: Using wildcards in prepared statement - MySQLi