MySQL PDO 不适用于整数

MySQL PDO won't work with integers

我有一个如下所示的基本函数:

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 = ? 它工作正常。将整数绑定为参数时出现问题,但我不知道是什么原因。

问题不在于绑定,而在于循环。如果查看手册,bindParam (&$variable) 的第二个参数需要引用。一旦重新分配 $value,您的循环就会销毁该引用。解决方案是在 bindParam()

中使用 $params[$key] 而不是 $value

当您可以只使用 execute() 语句绑定参数时,这样做似乎有点多余。

$statement->execute($params);

让 PDO 处理它如何分配变量。您所做的只是检查提交的内容,然后选择类型,您没有强制执行类型,因此它可能类似于 PDO::execute 所做的事情。