我有一个基本功能,如下所示:
public function query($query, $params = []) {
$statement = $this->db->prepare($query);
// Bind parameters based on value's type
foreach ($params as $key => $value) {
if(is_int($value)) {
$statement->bindParam($key + 1, $value, PDO::PARAM_INT);
} else {
$statement->bindParam($key + 1, $value, PDO::PARAM_STR);
}
}
$statement->execute();
return $statement;
}
无论出于何种原因,当我运行这样的事情时:
public static function photosByTag($tag, $user = null) {
$db = new DBConnection();
$query = "SELECT * FROM photos JOIN tags ON tags.photo = photos.pid WHERE tag LIKE ? AND owner = ?";
$params = [$tag, $user];
$result = $db->query($query, $params);
return $result->fetchAll();
}
photosByTag('city', 1)
它不起作用。如果我将AND owner = ?
替换为AND owner = 1
,则可以正常使用。将整数绑定为params时有些错误,但我不知道是什么或为什么。
答案 0 :(得分:2)
问题不在于绑定,而是循环。如果查看手册,bindParam(& $ variable)的第二个参数需要引用。一旦重新分配$ value,你的循环就会破坏该引用。解决方案是在$params[$key]
$value
代替bindParam()
当你可以使用execute()
语句来绑定参数时,看起来有点冗余这样做。
$statement->execute($params);
让PDO处理它如何分配变量。您所做的只是检查提交的内容然后选择类型,您没有强制执行类型,因此它可能类似于PDO :: execute所执行的操作。