Php 将图像保存到MySQL数据库?对还是不?

Php 将图像保存到MySQL数据库?对还是不?,php,mysql,Php,Mysql,我正在尝试使用PHP将图像直接存储在sql表中。 我有一张桌子: CREATE TABLE `products` ( `id` INT UNSIGNED AUTO_INCREMENTS PRIMARY KEY, `date` DATE, `img` LONGBLOB, `path` VARCHAR(255) ); 我尝试使用php将图像保存到mysql表中: <?php // snippet of main part of php code /

我正在尝试使用PHP将图像直接存储在sql表中。 我有一张桌子:

CREATE TABLE `products` (
     `id` INT UNSIGNED AUTO_INCREMENTS PRIMARY KEY,
     `date` DATE,
     `img` LONGBLOB, 
     `path` VARCHAR(255)
);
我尝试使用php将图像保存到mysql表中:

<?php 
// snippet of main part of php code
// query string
$query = "INSERT INTO `produkt` (`id`, `date`, `img`, `path`)";
$query .= " VALUES('', date('d.m.Y'), ?, ?)";

// prepare query 
$stmt = $conn->prepare($query);

//  bind  params
$stmt->bind_param("bs", $img, $path);
$img = addslashes(file_get_contents($_FILES['img']['tmp_name']));
$path = $_FILES['img']['tmp_name'];

// execution of the prepared statement
$stmt->execute();

?>
除了不希望保存图像的img列之外,所有数据都会进入数据库。 我发现这种sql数据库映像管理逻辑可能不是一个好主意,如何使用sql数据库尽可能高效地管理映像,而不必给MySQL数据库带来不必要的负担?
你能描述一个简单的例子吗?谢谢。

将图像直接保存在数据库中可以轻松放大数据库的大小。是否要执行此操作可能取决于要保存在数据库中的图像数量以及这些图像的预期大小。然而,我通常会反对这种做法

将图像直接保存在数据库中作为blob的另一种方法是将图像的路径存储在数据库中。映像本身存储在服务器的硬盘HDD/SSD上。您可以使用PHP的方法来处理这个问题,因为$\u FILES['img']['tmp\u name']中的文件路径只是一个临时路径。这意味着:如果您只是从$_FILES['img']['tmp_name']保存路径,那么以后尝试从该路径检索文件时可能会遇到问题

这种方法通常在数据库中使用的数据比存储完整图像要少得多,除非图像非常小。当然,您的PHP脚本必须从磁盘读取图像文件。

一些注释:

你似乎在用date'd.m.Y'来获取当前日期。您将其用作PHP函数,但它位于SQL语句中。如果将它放在SQL语句中,我建议您使用。如果使用PHP函数,请在SQL语句之外执行,并将结果绑定为参数

您的代码同时存储img内容和TMP文件的路径以供上传。我认为没有必要这样做。挑一个或另一个。一个上传的tmpfile在PHP请求结束时被删除,所以我不知道为什么要存储该路径

不要对绑定到查询参数的内容使用addslashes。这将在内容中存储文字斜杠。由于图像文件不是文本,它将在二进制字节之前添加斜杠,而二进制字节恰好与ASCII字符\0x5C相同。使用绑定参数时,即使是文本,也不需要斜杠

有关通过绑定参数存储较大数据内容的正确方法,请参见。这允许文件大于MySQL的max_allowed_数据包缓冲区,因为它以块的形式发送内容

$query = "INSERT INTO `produkt` (`id`, `date`, `img`)
          VALUES('', CURDATE(), ?)";

// prepare query 
$stmt = $conn->prepare($query);

//  bind  params
$null = NULL;
$stmt->bind_param("b", $null);
$fp = fopen($_FILES['img']['tmp_name'], "r");
while (!feof($fp)) {
    $stmt->send_long_data(0, fread($fp, 8192));
}
fclose($fp);

// execution of the prepared statement
$stmt->execute();
您是在问存储图像还是路径更好?关于这一点,没有普遍的规则。许多开发人员会说,永远不要在数据库中存储大图像和其他文件,因为这样会使数据库更大

但有时有很好的理由这样做,例如:

如果删除一行,它将自动删除存储在该行上的图像。但是,如果将其存储在数据库之外,则需要记住在删除数据库中的行时删除任何孤立图像

数据库中的数据遵循事务语义。如果插入/更新/删除引用图像的行,则在提交之前,更改将被隔离。您也可以选择回滚事务。文件系统上的文件不能这样做

数据库备份将收集所有图像数据以及行数据,这将是原子的。如果将映像文件保留在数据库之外,则必须分两步执行数据备份,并且您总是担心是否获得了该数据库快照的正确映像


我的经验法则是:文件存储在文件库中,数据存储在数据库中。谢谢你的全面回答。你总结了所有重要的事情,解释了优点和缺点。现在,我只需将图像的路径保存到MySQL数据库,并将.jpg文件和其他文件保存到文件系统,然后将文件系统从临时文件夹移动到特定位置。