2010-08-04 17 views
4

我有一個圖像文件存儲在遠程服務器上。我只有HTTP訪問服務器,所以我得到它的內容使用file_get_contents(URL)遠程圖像文件到PHP中的sqlite blob?

我需要將此內容存儲在類型爲'blob'的字段的本地sqlite3數據庫中。我正在使用PDO對象連接到數據庫,並且正在使用

$db->exec("INSERT INTO myTable (myImageBlob) VALUES 
      ('".file_get_contents($filePath)."')") 

將數據添加到數據庫。

這不起作用。道歉,如果我犯了一個真正的無意義的錯誤。我們都必須學會......

由於我不會深入研究的原因,我不可能在本地存儲圖像並將URL放入數據庫中。它/有/被存儲在一個blob中。

+0

當你使用sqlite時,總是使用參數化查詢,這三個優點。 1.速度要快得多(對db所需的sql語句的解析較少)。 2.沒有sql注入。 3.當你的字符串包含'或者'時沒有問題。 – TTT 2010-08-04 03:29:21

回答

3

你在SQL語句中無法控制的串聯數據是一個非常糟糕的主意。例如,圖像數據可能包含一個引號,該引號將終止字符串或將被解釋爲控制字符的反斜線。最糟糕的是,有人可能會構建僞造的圖像,在應用程序中注入惡意SQL代碼。

我建議你改用一份準備好的聲明:

$query = $db->prepare("INSERT INTO myTable (myImageBlob) VALUES (?)"); 
$query->bindParam(1, fopen($filePath, "rb"), PDO::PARAM_LOB); 
$query->execute(); 

注意,通過將PDO :: PARAM_LOB到bindParam()從流中插入blob數據。這就是爲什麼我使用fopen()而不是file_get_contents()

+0

我同意!因爲不需要解析不同的sql語句,所以它也快得多。它可以快三倍。請參閱http://stackoverflow.com/questions/904796/how-do-i-get-around-the-problem-in-sqlite-and-c/926251#926251 – TTT 2010-08-04 03:53:44

+0

謝謝!圖像在遠程服務器上,我只有http讀取權限,fopen仍然可以工作?我現在無法測試。 – Origamiguy 2010-08-04 12:02:45

+0

@Origamiguy它應該工作 – 2010-08-04 12:10:40

4

不要這樣做。每當你將二進制數據插入數據庫時​​,神會殺死一隻小貓。
相反,將該映像存儲在文件系統中的某個位置,並將路徑保存在您的數據庫中。

記得想想小貓!

alt text

+0

我知道它是file_get_contents(),我在我的iPhone上從內存中輸入,並且弄錯了。 – Origamiguy 2010-08-04 01:15:05

+0

@Origami好的,足夠公平:) – NullUserException 2010-08-04 01:16:12

+1

在數據庫中存儲二進制數據有一些優缺點,有些數據庫比其他數據庫做得更好。 – TTT 2010-08-04 03:33:57