【问题标题】:Inserting Binary into MySQL BLOB将二进制文件插入 MySQL BLOB
【发布时间】:2015-07-22 09:06:50
【问题描述】:
$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 只是在数据库中显示为 null,但如果我回显 $imageContent,它似乎显示的是二进制数据。

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

【问题讨论】:

标签: php mysql blob


【解决方案1】:

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

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

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

您的 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

这将表示语法错误。


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


另外,正如 Mike Brant 在 cmets 中所说,我引用:

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

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

阅读 Stack 上的以下问答:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2013-06-06
    • 2010-10-18
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多