CakePHP 2未正确处理二进制字段
我在CakePHP2.x(2.1.5,2.2.7)将二进制数据插入数据库时遇到了实际问题 我的问题是,当我将原始二进制数据插入数据库时,会出现以下错误: 错误:SQLSTATE[HY093]:无效参数编号:混合命名参数和位置参数 我的插入代码如下所示:CakePHP 2未正确处理二进制字段,cakephp,pdo,binary-data,Cakephp,Pdo,Binary Data,我在CakePHP2.x(2.1.5,2.2.7)将二进制数据插入数据库时遇到了实际问题 我的问题是,当我将原始二进制数据插入数据库时,会出现以下错误: 错误:SQLSTATE[HY093]:无效参数编号:混合命名参数和位置参数 我的插入代码如下所示: $imageData = array( $this->alias => array( 'parent_id' => $imageId,
$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编码,那么插入工作正常。CakePHP1.3中的类似代码运行良好,无需先对数据进行base64编码。MySQL中的列是MEDIUMBLOB
我已经开始在cake库中跟踪代码,并确定列类型正确地被猜测为“二进制”,并且执行是运行“二进制”情况:
switch ($column) {
case 'binary':
return $this->_connection->quote($data, PDO::PARAM_LOB);
我也很惊讶Cake实际上没有使用带命名参数的普通PDO语法,它只是构建了一个很大的长SQL字符串
我插入二进制数据的问题可能是因为我运行的是PHP5.2.6或MySQL 5.0.45吗?(两个版本都很旧) 我对PHP5.2.6和MySQL 5.0.45-7有着完全相同的问题。使用相同的代码库和CakePHP 2.1.5,5.4.4和MySQL 5.5.25不会出现此问题 当查看堆栈跟踪和SQL insert语句时,我的二进制数据确实包含单引号字符,我确信这是查询中抛出列名/值计数的部分,正如它在错误消息中所述
我能想到的唯一解决方案是在将二进制文件数据插入数据库之前对其进行base64编码(当然,在将其返回时进行base64解码)。我想看看是否有更好的解决方案。这似乎是PHP5.2.6中PDO系统的一个限制。有关更多信息,请参阅此错误: 显然,这在PHP5.2.8中是固定的,这就是为什么CakePHP的要求说5.2.8是与之兼容的PHP的最低版本 因此,解决方案是要么将数据Base64,要么升级到PHP5.2.8
我希望这对其他人有所帮助。谢谢你的发帖,贝基。我刚刚验证了这个问题在CakePHP2.3.0中仍然存在。我想最可能的问题是PHP5.2.6中的PDO系统,更具体地说是这个bug:我想我们只需要升级到PHP的更高版本。谢谢Ben。我认为您是对的,更新PHP是避免在插入数据之前使用base64的唯一方法。请注意,我可能刚刚对您的帖子发表了评论,但我的代表级别不够高(在某个时候必须解决这个问题),我想确保您知道,您不是唯一一个遇到此限制的人。