2015-05-11 107 views
0
$serv = "xxx"; 
$user = "xxx"; 
$pass = "xxx"; 
$db = "xxx"; 

$imgloc = "../images/bg.jpg"; 
$image = fopen($imgloc, 'rb'); 
$imageContent = fread($image, filesize($imgloc)); 

$conn = new mysqli($serv, $user, $pass, $db); 

$sql = "INSERT INTO `image`(`advert_id`,`img`) VALUES('1','" . $imageContent . "');"; 
$conn->query($sql); 

我正在使用上面的代碼嘗試向我的MySQL數據庫中插入二進制文件,但沒有任何內容正在發送到數據庫。 $ imageContent僅在數據庫中顯示爲空,但如果我回顯$ imageContent,它似乎顯示二進制數據。將二進制插入到MySQL BLOB

advert_id只是一個INT領域和IMG是BLOB

+0

你很容易受到[SQL注入攻擊(http://bobby-tables.com )。你不能只是隨機二進制垃圾到查詢字符串,並期望事情工作。 –

+0

http://php.net/manual/en/mysqli.prepare.php和http://php.net/manual/en/mysqli-stmt.bind-param.php – AbraCadaver

+0

我應該使用哪些函數來清除它? –

回答

5

爲什麼你的代碼是不工作的原因是因爲你需要逃避你的數據。

$imageContent = fread($image, filesize($imgloc)); 
$imageContent = mysqli_real_escape_string($conn, $imageContent); 

你是不是看到了語法錯誤,類似於:

你有一個錯誤的SQL語法;檢查對應於你的MySQL服務器版本的手冊正確的語法使用近「8月16日@#54」在行1 ...

  • 因爲你不檢查錯誤。

訪問http://php.net/manual/en/mysqli.error.phphttp://php.net/manual/en/function.error-reporting.php,然後用下面的在你的文件的頂部:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 
// rest of your code 

這將標誌着語法錯誤。


使用mysqli with prepared statements,或PDO with prepared statements


此外,如邁克·布蘭特在評論中說,我引用:

「爲切評論,我會建議確保您對於在MySQL中存儲圖像斑點,真的有一個很好的用例。在很多情況下,與簡單地在數據庫中存儲文件引用相比,這可能不是一個好主意。「

  • 邁克說出真相。隨着時間的推移,數據庫會大幅增加,因此將文件的副本存儲在一個文件夾中,然後參考它,通常是一個更好的主意,但這完全取決於您。

閱讀以下是問答& A的上棧: