2015-05-11 31 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的上栈: