我在使用CakePHP 2.x(2.1.5,2.2.7)將二進制數據插入數據庫時遇到了實際問題。CakePHP 2沒有正確處理二進制字段
我的問題是,當我插入原始的二進制數據到數據庫中,我得到以下錯誤:
Error: SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters
我插入的代碼如下所示:
$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);
如果我Base64編碼,插入前的imageBlob數據,然後插入工作正常。 CakePHP 1.3中的類似代碼工作正常,不需要先base64編碼數據。 MySQL中的列是MEDIUMBLOB。
我已經開始跟蹤通過濾餅庫的代碼,並且已經確定,列類型被正確地被猜到爲「二進制」,並執行正在運行「二進制」的情況下:
switch ($column) {
case 'binary':
return $this->_connection->quote($data, PDO::PARAM_LOB);
我對於Cake實際上並不使用具有命名參數的普通PDO語法,它也很驚訝,它只是建立一個很長的SQL字符串。
莫非我的問題,將二進制數據是因爲我在PHP 5.2.6或MySQL 5.0.45運行? (兩個相當舊的版本)。
感謝發佈,bergy。 我剛剛證實,這個問題在CakePHP 2.3.0中也存在。 我想像,最有可能的問題是在PHP 5.2.6與PDO製做,更具體的這個bug: https://bugs.php.net/bug.php?id=44251 我想我們只需要升級到更高版本的PHP。 – 2013-03-18 02:37:34
謝謝Ben。我認爲你正確的做法是更新PHP是在插入之前規避base64數據的唯一方法。請注意,我只是對你的帖子發表了評論,但是我的代表還不夠高(在某些時候需要修正),我想確保你知道你並不是唯一一個接受這個限制的人。 – bergy 2013-03-18 18:12:33