将二进制文件插入MySQL BLOB

Ena*_*ain 0 php mysql blob

$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);
Run Code Online (Sandbox Code Playgroud)

我正在使用上面的代码尝试将二进制文件插入到我的MySQL数据库中,但没有任何内容被发送到数据库.$ imageContent只在数据库中显示为null,但如果我回显$ imageContent,它似乎显示二进制数据.

advert_id只是一个int字段,img是一个BLOB

Fun*_*ner 5

您的代码无法正常工作的原因是您需要转义数据.

$imageContent = fread($image, filesize($imgloc)); 
$imageContent = mysqli_real_escape_string($conn, $imageContent);
Run Code Online (Sandbox Code Playgroud)

您没有看到语法错误,类似于:

您的SQL语法有错误; 查看与MySQL服务器版本对应的手册,以便在第1行'8 16 @#54'附近使用正确的语法...

  • 因为您没有检查错误.

访问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
Run Code Online (Sandbox Code Playgroud)

这将发出语法错误信号.


mysqli预准备语句一起使用,或PDO与准备好的语句一起使


另外,正如迈克布兰特在评论中所说,我引用:

"作为一个切向评论,我建议确保你真的有一个很好的用例来存储MySQL中的图像blob.在很多情况下,与简单地在数据库中存储文件引用相比,这可能不是一个好主意. "

  • 迈克说实话.您的数据库将随着时间的推移而急剧增加,因此将文件的副本存储在一个文件夹中,然后对其进行引用通常是一个更好的主意,但这完全取决于您.

阅读Stack上的以下问答: