2013-03-08 51 views
1

我在使用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運行? (兩個相當舊的版本)。

回答

1

看來這是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。

我希望這可以幫助別人。

1

我與PHP 5.2.6和MySQL 5.0.45-7有完全相同的問題。這個問題沒有發生5.4.4和MySQL 5.5.25使用相同的代碼庫和CakePHP 2.1.5。

在查看堆棧跟蹤和SQL插入語句時,我的二進制數據確實包含單引號字符,我相信這是查詢的一部分,它將列名/值計數關閉,因爲它在錯誤信息。

唯一的解決辦法我能想出是爲base64(服務它的時候回來了,當然的base64解碼),將其插入到數據庫之前編碼的二進制文件數據。我會有興趣看看是否有更好的解決方案。

+0

感謝發佈,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

+0

謝謝Ben。我認爲你正確的做法是更新PHP是在插入之前規避base64數據的唯一方法。請注意,我只是對你的帖子發表了評論,但是我的代表還不夠高(在某些時候需要修正),我想確保你知道你並不是唯一一個接受這個限制的人。 – bergy 2013-03-18 18:12:33