2010-02-17 35 views
0

我將Doctrine 1.1.2作爲我的ORM框架與Zend Framework和MSSQL服務器後端結合使用。我試圖做的是將一個blob存儲到數據庫中,但是當我嘗試時,Doctrine會拋出錯誤。在數據庫中的列的類型VARBINARY(最大值),而在原則模型被配置如下:用Doctrine存儲blob值的問題

$this->hasColumn('binary_data', 'blob', null, array(
     'type' => 'blob', 
     'notnull' => false, 
     'primary' => false, 
     'autoincrement' => false, 
     )); 

這與學說:: generateModelsFromDB生成的,並且應該是正確的。 blob的來源是文件上傳。我已驗證文件上傳成功,並且能夠打印二進制數據(顯示爲一堆亂碼數據)。

當我嘗試使用Doctrine模型保存二進制數據時,我根據自己的操作獲取了不同的錯誤消息。我至今嘗試過這個(可能更多一些太,我不記得了):

// Error:SQLSTATE[HY000]: General error: 10007 Incorrect syntax near '%PDF-1.5 %µµµµ... 
$model->binary_data = fread(fopen($_FILES["file"]["tmp_name"], 'r'), filesize($_FILES["file"]["tmp_name"])); 
$model->save(); 
--- 
// Error: same as above 
$fileHandle = fopen($_FILES["file"]["tmp_name"], "r"); 
$fileContent = fread($fileHandle, filesize($_FILES["file"]["tmp_name"])); 
$model->binary_data = $fileContent; 
$model->save(); 
--- 
// This should work on 1.2, but I have 1.1.2 
// Error: Validation failed in class Clazz 1 field had validation error: * 1 validator failed on binary_data (type) 
$model->binary_data = file($_FILES["file"]["tmp_name"]); 
$model->save(); 

這應該是簡單的,但我就是想不通,我做錯了什麼。

回答

0

您可以在保存之前嘗試base64_encode-ing您的數據,並在您將其從數據庫中拉出之後再嘗試base64_decode

+0

這是否適用於varbinary列?如果我沒有弄錯,那會導致字符串。我可以將列更改爲varchar(max),但我寧願將其存儲爲varbinary。我會試試看看有什麼作用。我只是不能相信,它是不可能存儲blob到教條的mssql服務器,所以我真的很想看到如何做到這一點的示例;) – Erik

+1

您寫道:「數據庫中的列是類型varchar (最大)「這就是爲什麼我認爲二進制數據有問題。檢查你的模式,也許你在列類型上有一個錯字,並試圖將二進制數據保存到字符串列中。 – Marko

+0

對不起,錯字在上面的文字中。數據庫中的列類型是varbinary(max)。 – Erik