2

我在使用 CakePHP 2.x (2.1.5, 2.2.7) 将二进制数据插入数据库时​​遇到了真正的问题。

我的问题是,当我将原始二进制数据插入数据库时​​,出现以下错误:

错误:SQLSTATE[HY093]:无效参数号:混合命名参数和位置参数

我的插入代码如下所示:

        $imageData = array(
            $this->alias => array(
                'parent_id' => $imageId,
                'image' => $imageBlob,
                'encoding' => $encoding,
                'mime_type' => $mime_type,
                'file_name' => $options['fileDetails']['name'],
                'width' => $imageWidth,
                'height' => $imageHeight,
                'size_type' => $resizeName,
                'owner_class' => $options['ownerClass'],
                'token' => $this->generateToken()
            )
        );

        $this->create();
        $this->save($imageData);

如果我在插入之前对 imageBlob 数据进行 base64 编码,则插入工作正常。CakePHP 1.3 中的类似代码运行良好,无需先对数据进行 base64 编码。MySQL 中的列是 MEDIUMBLOB。

我已经开始通过 cake 库跟踪代码,并确定列类型被正确猜测为“二进制”,并且执行正在运行“二进制”案例:

        switch ($column) {
        case 'binary':
            return $this->_connection->quote($data, PDO::PARAM_LOB);

我也很惊讶 Cake 实际上并没有使用带有命名参数的普通 PDO 语法,它只是构建了一个很大的长 SQL 字符串。

插入二进制数据的问题可能是因为我在 PHP 5.2.6 或 MySQL 5.0.45 中运行吗?(两个都很旧的版本)。

4

2 回答 2

2

这似乎是 PHP 5.2.6 中 PDO 系统的限制。有关更多信息,请参阅此错误:https ://bugs.php.net/bug.php?id=44251

显然这是在 PHP 5.2.8 中修复的,这就是为什么 CakePHP 的要求说 5.2.8 是与其兼容的 PHP 的最低版本。

因此,解决方案是对您的数据进行 Base64 处理,或者升级到 PHP 5.2.8。

我希望这对其他人有帮助。

于 2013-03-20T00:45:03.643 回答
1

我在使用 PHP 5.2.6 和 MySQL 5.0.45-7 时遇到了完全相同的问题。使用相同的代码库和 CakePHP 2.1.5 的 5.4.4 和 MySQL 5.5.25 没有发生此问题。

在查看堆栈跟踪和 SQL 插入语句时,我的二进制数据确实包含单引号字符,我确信这是查询的一部分,它会抛出错误消息中所述的列名/值计数。

我能想出的唯一解决方案是在将二进制文件数据插入数据库之前对其进行 base64 编码(当然,在将其返回时进行 base64 解码)。我很想看看是否有更好的解决方案。

于 2013-03-13T01:27:52.707 回答