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

nik*_*hil 16 php mysql blob

我试图将图像存储在DataBase中,由于某种原因它似乎不起作用.这是我桌子的结构.

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

这是我的查询插入图像或至少这应该是什么:

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

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

Lig*_*ica 44

问题

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

这将在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) . "')";
Run Code Online (Sandbox Code Playgroud)

(你甚至可以从语法中看到它突出显示它是如何工作的.)


解决方案(2)

现在您遇到的问题是,如果二进制数据包含任何二进制数据',则查询无效.因此,您应该运行它mysql_escape_string以对查询操作进行清理:

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

解决方案(3)

现在你有一个非常大的字符串,你的数据库变得笨重.

不希望将图像存储在数据库中,您可以其中提供帮助.