2013-03-08 2 views
1

데이터베이스에 이진 데이터를 삽입하는 CakePHP 2.x (2.1.5, 2.2.7)에 실제 문제가 있습니다. 나는 인코딩 BASE64 경우CakePHP 2에서 이진 필드를 제대로 처리하지 못합니다.

 $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); 

:

Error: SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters

내 삽입 코드는 다음과 같습니다

내 문제는 내가 데이터베이스에 원시 이진 데이터를 삽입 할 때, 나는 다음과 같은 오류를 얻을 수 있다는 것입니다 imageBlob 데이터를 삽입하기 전에 삽입하면 잘 작동합니다. CakePHP 1.3의 비슷한 코드는 base64로 데이터를 먼저 인코딩 할 필요없이 잘 동작했습니다. MySQL의 열은 MEDIUMBLOB입니다.

나는 케이크 라이브러리를 통해 코드를 추적하기 시작했으며, 컬럼 형이 올바르게 '바이너리'로 추측되고있는 것으로 확인하고, 실행은 '진'의 경우 실행 :

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

I을 또한 Cake은 실제로 명명 된 매개 변수로 일반적인 PDO 구문을 사용하지 않는다는 것에 상당히 놀랐습니다. 단지 큰 긴 SQL 문자열을 작성하기 만합니다.

PHP 5.2.6 또는 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에서 똑같은 문제가 발생합니다. 동일한 코드 기반과 CakePHP 2.1.5를 사용하는 문제는 5.4.4와 MySQL 5.5.25에서 발생하지 않습니다.

스택 추적 및 SQL 삽입 문을 보면 내 바이너리 데이터에 작은 따옴표가 포함되어 있습니다.이 열은 작은 따옴표를 포함하고 있습니다. 에러 메시지.

유일한 해결책은 데이터베이스에 삽입하기 전에 이진 파일 데이터를 base64로 인코딩하는 것입니다 (물론 다시 제공 할 때 base64 디코딩). 더 나은 해결책이 있는지 관심을 가질 것입니다.

+0

게시 주셔서 감사합니다. bergy. 나는이 문제가 여전히 CakePHP 2.3.0에도 존재 함을 확인했다. https://bugs.php.net/bug.php?id=44251 : 나는 더 구체적으로이 버그, 가장 가능성있는 문제는 PHP 5.2.6에서 PDO 시스템과 함께 할 것을 상상하는 것 PHP의 최신 버전으로 업그레이드하면됩니다. –

+0

감사합니다. PHP를 업데이트하는 것이 삽입 전에 데이터를 base64하는 것을 피할 수있는 유일한 방법이라고 생각합니다. 귀하의 게시물에 댓글을 달았지만 제 담당자가 충분히 높지는 않습니다 (어느 시점에서이를 고쳐야 할 것입니다). 그리고 나는 당신이이 제한에 부딪치고있는 유일한 사람이 아니라는 것을 알고 싶었습니다. – bergy

관련 문제