我有一个看起来像这样的基本函数:
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 = 1
替换 AND owner = ?
它工作正常。将整数绑定(bind)为参数时出现问题,但我不知道是什么原因。
最佳答案
问题不在于绑定(bind),而在于循环。如果查看手册,bindParam (&$variable) 的第二个参数需要引用。一旦重新分配 $value,您的循环就会销毁该引用。解决方案是在 bindParam()
$params[$key]
而不是 $value
当您可以只使用 execute()
语句来绑定(bind)参数时,这样做似乎有些多余。
$statement->execute($params);
让 PDO 处理它如何分配变量。您所做的只是检查提交的内容,然后选择类型,您没有强制执行类型,因此它可能类似于 PDO::execute 的原样。
关于php - MySQL PDO 不适用于整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29738996/