使用 php 在 MySql 数据库中插入 Blob

Posted

技术标签:

【中文标题】使用 php 在 MySql 数据库中插入 Blob【英文标题】:Insert Blobs in MySql databases with php 【发布时间】:2011-10-26 12:42:28 【问题描述】:

我正在尝试将图像存储在数据库中,但由于某种原因它似乎不起作用。这是我的表的结构。

mysql> describe ImageStore;
+---------+----------+------+-----+---------+-------+
| Field   | Type     | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| ImageId | int(11)  | NO   | PRI | NULL    |       |
| Image   | longblob | NO   |     | NULL    |       |
+---------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)

这是我的查询,它插入了图像,或者至少它应该是这样的:

//Store the binary image into the database
                $tmp_img = $this->image['tmp_name'];
                $sql = "INSERT INTO ImageStore(ImageId,Image)               
                VALUES('$this->image_id','file_get_contents($tmp_image)')";
                mysql_query($sql); 

如果我打印 file_get_contents($tmp_image) 的值,那么屏幕上有大量数据。但是这个值不会存储在数据库中,这就是我面临的问题。

【问题讨论】:

【参考方案1】:

问题

$sql = "INSERT INTO ImageStore(ImageId,Image)
        VALUES('$this->image_id','file_get_contents($tmp_image)')";

这会在 php 中创建一个名为 $sql 的字符串。暂时忘记 MySQL,因为您还没有执行任何查询。你只是在构建一个字符串。

PHP 的魔力意味着你可以写一个变量名——比如,$this->image_id——双引号内,变量仍然可以神奇地扩展。

此功能称为“变量插值”,不会发生在函数调用中。因此,您在这里所做的只是将字符串 "file_get_contents($tmp_image)" 写入数据库。


解决方案(1)

所以,要连接调用file_get_contents($tmp_image)的结果,就得跳出字符串,明确地做事:

$sql = "INSERT INTO ImageStore(ImageId,Image)
        VALUES('$this->image_id','" . file_get_contents($tmp_image) . "')";

(您甚至可以从突出显示其工作原理的语法中看到。)


解决方案(2)

现在您遇到的问题是,如果二进制数据包含任何',则您的查询无效。所以你应该通过mysql_escape_string 运行它来为查询操作清理它:

$sql = "INSERT INTO ImageStore(ImageId,Image)
        VALUES('$this->image_id','" . mysql_escape_string(file_get_contents($tmp_image)) . "')";

解决方案(3)

现在你有一个真的很大的字符串,而且你的数据库变得越来越庞大。

Prefer not storing images in databases,您可以在哪里提供帮助。

【讨论】:

@LightnessRacesinOrbit。重新“不喜欢在数据库中存储大文件”.. 这取决于 what db.【参考方案2】:

要扩展 Tomalak 的评论,您不能在引号内运行函数。

试试:

$sql = "INSERT INTO ImageStore(ImageId,Image)               
        VALUES('$this->image_id','".file_get_contents($tmp_image)."')";

【讨论】:

【参考方案3】:

试试这个:

$tmp_img = $this->image['tmp_name'];
$sql = "INSERT INTO ImageStore(ImageId,Image)               
  VALUES('$this->image_id','" . addslashes(file_get_contents($tmp_image)) . "')";
mysql_query($sql);

【讨论】:

"请注意,使用 addlashes() 进行数据库参数转义可能会导致大多数数据库出现安全问题。" - PHP Manual PDO:: 使用prepare(),但它也应该使用addslashes() 之类的东西,所以我们更喜欢PHP.Native 解决方案,即addslashes()。它工作得很好。【参考方案4】:

如前所述,您只是将字符串 "file_get_contents($tmp_image)" 保存到数据库中 但您需要运行函数file_get_contents 在将图像保存到数据库之前,不要忘记使用散列算法(例如 base64_encode)对图像进行散列。

【讨论】:

图片中可能包含一些非法字词(如 -- 、 " 、 ' 等...),这可能会导致我们在执行查询时出现问题 没有散列或任何其他检查这可能会导致 sql 注入攻击 你根本不需要散列。只需转义单引号和反斜杠,以免脱离字符串模式。 你是对的,但是还有另一种选择,我们可以像字符串一样向浏览器发送和接收图像,大多数浏览器可以将 base64 字符串转换为图像,但是对于 sql 注入和自定义错误我相信你的解决方案

以上是关于使用 php 在 MySql 数据库中插入 Blob的主要内容,如果未能解决你的问题,请参考以下文章

PHP 代码使用 _POST 方法在 MySql 数据库中插入空白记录

无法通过php在mysql表中插入数据

使用 PDO 和 PHP 将表单中的数据插入 MySQL 数据库

使用 MySQL/PHP 在字段中使用 now() 插入当前日期/时间

如何从 PHP 在 mySQL 中插入/创建存储过程?

正确的 PHP 代码? - 插入 MySQL