我正在尝试运行以下查询,而我遇到了通配符问题。
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。我需要使用通配符的原因是因为列的数据包含序列化数组。我想,如果有更简单的方法来解决这个问题,我该怎么办?
提前致谢!
答案 0 :(得分:18)
您必须通过引用将参数传递给bind_param()
,这意味着您必须传递单个变量(不是连接字符串)。但是,没有理由你不能专门构造这样一个变量来传入:
$className = '%' . $this->className . '%';
$query->bind_param('s', $className);
答案 1 :(得分:9)
另一种方法是:
SELECT id, adminRights FROM users
WHERE classes LIKE CONCAT("%", ?, "%") && adminRights='student'
如果您有动态结果绑定并且只想更改SQL查询...
,这很方便答案 2 :(得分:5)
参数#2必须是引用,而不是值。尝试
$param = '%' . $this->className . '%';
$query->bind_param('s', $param);
答案 3 :(得分:0)
这与在C ++中发生的原因相同。将值传递给期望参数为引用的函数时,需要一个变量(不是临时的)。所以首先创建一个变量,然后传递它。
答案 4 :(得分:-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."%'";
我希望这会有所帮助