在准备的语句中使用通配符 – MySQLi

我正在尝试运行以下查询,并且遇到了通配符问题。

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

提前致谢!

您必须通过引用将parameter passing给bind_param() ,这意味着您必须传递一个variables (不是串联的string)。 虽然没有理由不能特意构造这样一个variables来传入:

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

另一种方法是:

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

如果你有一个dynamic的结果绑定,只需要改变SQL查询,这是很方便的…

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

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

这是在C ++中发生的原因。 当你将一个值传递给一个需要参数的函数时,你需要一个variables(不是临时的)。 所以首先创build一个variables,然后传递它。

现有的答案不适合我,所以这是我使用的:

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

它一直工作。

只是最高的一切,我只是尝试最简单的forms,它的工作

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

我希望这有帮助