我在使用CakePHP 2时遇到了真正的问题。X(2.1.5, 2.2.7)向数据库中插入二进制数据。
我的问题是,当我插入原始二进制数据到数据库中,我得到以下错误:
错误:SQLSTATE[HY093]: Invalid parameter number:混合命名和位置参数
我的插入代码是这样的:
$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库跟踪代码,并确定列类型被正确地猜测为'binary',并且执行正在运行'binary' case:
switch ($column) {
case 'binary':
return $this->_connection->quote($data, PDO::PARAM_LOB);
我也很惊讶,Cake实际上并没有使用正常的PDO语法与命名参数,它只是建立一个大的长SQL字符串。
我的问题插入二进制数据是因为我在PHP 5.2.6或MySQL 5.0.45运行?(都是很老的版本)。
这似乎是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。
我希望这能帮助到别人。
我有完全相同的问题与PHP 5.2.6和MySQL 5.0.45-7。在5.4.4和MySQL 5.5.25使用相同的代码库和CakePHP 2.1.5时,该问题不会发生。
当查看堆栈跟踪和SQL插入语句时,我的二进制数据确实包含单引号字符,我确信这是查询中抛出列名/值计数的部分,正如它在错误消息中所述。
我能想到的唯一解决方案是在将二进制文件数据插入数据库之前对其进行base64编码(当然,在将其返回时进行base64解码)。我很想知道是否有更好的解决办法。