使用 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 数据库中插入空白记录
使用 PDO 和 PHP 将表单中的数据插入 MySQL 数据库