如何使用 MySQL BLOB 数据类型在 Ubuntu 18.04 上使用 PHP 存储图像

作为Write for DOnations计划的一部分,作者选择了“编码女孩”来接受捐赠

介绍

一个二进制大对象(BLOB是一个MySQL的,可以存储二进制数据,如图像,多媒体,和PDF文件的数据类型。

在创建需要紧密耦合的数据库且图像应与相关数据(例如,员工门户、学生数据库或财务应用程序)同步的应用程序时,您可能会发现存储学生护照等图像很方便MySQL 数据库中的照片和签名以及其他相关信息。

这就是 MySQLBLOB数据类型的用武之地。这种编程方法无需创建单独的文件系统来存储图像。该方案还集中了数据库,使其更加便携和安全,因为数据与文件系统隔离。创建备份也更加无缝,因为您可以创建一个包含所有数据的MySQL 转储文件。

检索数据更快,并且在创建记录时,您可以确保数据验证规则和参照完整性得到维护,尤其是在使用MySQL 事务时

在本教程中,您将使用 MySQLBLOB数据类型在 Ubuntu 18.04 上使用PHP存储图像

先决条件

要遵循本指南,您将需要以下内容:

步骤 1 — 创建数据库

您将首先为您的项目创建一个示例数据库。为此,请通过 SSH 连接到您的服务器,然后运行以下命令以 root 用户身份登录到您的 MySQL 服务器:

  • sudo mysql -u root -p

输入您的 MySQL 数据库的 root 密码并点击ENTER继续。

然后,运行以下命令创建数据库。在本教程中,我们将其命名为test_company

  • CREATE DATABASE test_company;

创建数据库后,您将看到以下输出:

Output
Query OK, 1 row affected (0.01 sec)

接下来,test_user在 MySQL 服务器上创建一个帐户并记住替换PASSWORD为强密码:

  • CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';

您将看到以下输出:

Output
Query OK, 0 rows affected (0.01 sec)

要授予test_usertest_company数据库的完全权限,请运行:

  • GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';

确保您获得以下输出:

Output
Query OK, 0 rows affected (0.01 sec)

最后,刷新权限表以便 MySQL 重新加载权限:

  • FLUSH PRIVILEGES;

确保您看到以下输出:

Output
Query OK, 0 rows affected (0.01 sec)

既然test_company数据库test_user已准备就绪,您将继续创建products用于存储示例产品表。稍后您将使用此表插入和检索记录以演示 MySQL 的BLOB工作方式。

从 MySQL 服务器注销:

  • QUIT;

然后,使用test_user您创建的凭据重新登录

  • mysql -u test_user -p

出现提示时,输入密码test_user并点击ENTER继续。接下来,test_company通过键入以下内容切换到数据库:

  • USE test_company;

一旦test_company选择数据库,MySQL 将显示:

Output
Database changed

接下来,products通过运行创建一个表:

  • CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;

此命令创建一个名为products. 该表有四列:

  • product_id:此列使用BIGINT数据类型以容纳最多 2⁶³-1 个项目的大型产品列表。您已将该列标记为PRIMARY KEY唯一标识产品。为了让 MySQL 处理插入列的新标识符的生成,您使用了关键字AUTO_INCREMENT

  • product_name:此列包含产品的名称。您已经使用了VARCHAR数据类型,因为该字段通常最多可处理最多50字符的字母数字— 的限制50只是用于本教程目的的假设值。

  • price:出于演示目的,您的products表包含price用于存储产品零售价列。由于某些产品可能具有浮动值(例如,23.69、45.36、102.99),因此您使用了DOUBLE数据类型。

  • product_image:此列使用一种BLOB数据类型来存储产品图像的实际二进制数据。

您已经使用InnoDB存储ENGINE来支持广泛的功能,包括MySQL 事务执行此操作以创建products表后,您将看到以下输出:

Output
Query OK, 0 rows affected (0.03 sec)

从您的 MySQL 服务器注销:

  • QUIT;

您将获得以下输出

Output
Bye

products表现在已准备好存储包括产品图像在内的一些记录,您将在下一步中用一些产品填充它。

第 2 步 – 创建 PHP 脚本以连接和填充数据库

在此步骤中,您将创建一个 PHP 脚本,该脚本将连接到您在步骤 1 中创建的 MySQL 数据库。该脚本将准备三个示例产品并将它们插入到products表中。

要创建 PHP 代码,请使用文本编辑器打开一个新文件:

  • sudo nano /var/www/html/config.php

然后,在文件中输入以下信息并替换PASSWORDtest_user您在步骤 1 中创建密码:

/var/www/html/config.php
<?php

define('DB_NAME', 'test_company');
define('DB_USER', 'test_user');
define('DB_PASSWORD', 'PASSWORD');
define('DB_HOST', 'localhost');

$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

保存并关闭文件。

在此文件中,您使用了四个 PHP 常量连接到您在步骤 1 中创建的 MySQL 数据库:

  • DB_NAME:这个常量保存test_company数据库的名称

  • DB_USER:这个变量保存test_user用户名。

  • DB_PASSWORD:这个常量存储的MySQLPASSWORD中的test_user帐户。

  • DB_HOST:这表示数据库所在的服务器。在这种情况下,您使用的是localhost服务器。

文件中的以下行启动一个 PHP数据对象(PDO) 并连接到 MySQL 数据库:

...
$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
...

在文件末尾,您设置了几个 PDO 属性:

  • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION:该属性指示 PDO 抛出一个异常,该异常可以被记录以用于调试目的。
  • ATTR_EMULATE_PREPARES, false:此选项通过告诉 MySQL 数据库引擎执行准备而不是 PDO 来提高安全性。

您将/var/www/html/config.php在接下来创建的两个 PHP 脚本中包含该文件,分别用于插入和检索记录。

首先,创建/var/www/html/insert_products.php用于将记录插入到 products 表PHP 脚本:

  • sudo nano /var/www/html/insert_products.php

然后,将以下信息添加到/var/www/html/insert_products.php文件中:

/var/www/html/insert_products.php
<?php

require_once 'config.php';

$products = [];

$products[] = [
              'product_name' => 'VIRTUAL SERVERS',
              'price' => 5,
              'product_image' => file_get_contents("https://i.imgur.com/VEIKbp0.png")
              ];

$products[] = [
              'product_name' => 'MANAGED KUBERNETES',
              'price' => 30,
              'product_image' => file_get_contents("https://i.imgur.com/cCc9Gw9.png")
              ];

$products[] = [
              'product_name' => 'MySQL DATABASES',
              'price' => 15,
              'product_image' => file_get_contents("https://i.imgur.com/UYcHkKD.png" )
              ];

$sql = "INSERT INTO products(product_name, price, product_image) VALUES (:product_name, :price, :product_image)";

foreach ($products as $product) {
    $stmt = $pdo->prepare($sql);
    $stmt->execute($product);
}

echo "Records inserted successfully";

保存并关闭文件。

在文件中,您已将config.php文件包含在顶部。这是您为定义数据库变量和连接到数据库而创建的第一个文件。该文件还启动一个 PDO 对象并将其存储在一个$pdo变量中。

接下来,您已经创建了要插入到数据库中的产品数据数组。除了分别作为字符串和数值准备product_nameand之外price,该脚本还使用 PHP 的内置file_get_contents函数从外部源读取图像并将它们作为字符串传递给product_image列。

接下来,您准备了一条 SQL 语句并使用 PHPforeach{...}语句将每个产品插入到数据库中。

要执行该/var/www/html/insert_products.php文件,请使用以下 URL 在浏览器窗口中运行它。请记住替换your-server-IP为您服务器的公共 IP 地址:

http://your-server-IP/insert_products.php

执行该文件后,您将在浏览器中看到一条成功消息,确认记录已插入到数据库中。

显示记录已插入数据库的成功消息

您已成功将包含产品图像的三个记录插入到products表中。在下一步中,您将创建一个 PHP 脚本来检索这些记录并将它们显示在您的浏览器中。

第 3 步 – 从 MySQL 数据库显示产品信息

使用数据库中的产品信息和图像,您现在将编写另一个 PHP 脚本,该脚本在浏览器的 HTML 表中查询和显示产品信息。

要创建文件,请键入以下内容:

  • sudo nano /var/www/html/display_products.php

然后,在文件中输入以下信息:

/var/www/html/display_products.php
<html>
  <title>Using BLOB and MySQL</title>
  <body>

  <?php

  require_once 'config.php';

  $sql = "SELECT * FROM products";
  $stmt = $pdo->prepare($sql);
  $stmt->execute();
  ?>

  <table border = '1' align = 'center'> <caption>Products Database</caption>
    <tr>
      <th>Product Id</th>
      <th>Product Name</th>
      <th>Price</th>
      <th>Product Image</th>
    </tr>

  <?php
  while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
      echo '<tr>';
      echo '<td>' . $row['product_id'] . '</td>';
      echo '<td>' . $row['product_name'] . '</td>';
      echo '<td>' . $row['price'] . '</td>';
      echo '<td>' .
      '<img src = "data:image/png;base64,' . base64_encode($row['product_image']) . '" width = "50px" height = "50px"/>'
      . '</td>';
      echo '</tr>';
  }
  ?>

  </table>
  </body>
</html>

保存对文件的更改并关闭它。

在这里,您再次包含了该config.php文件以连接到数据库。然后,您使用 PDO 准备并执行了一条 SQL 语句,以products使用该SELECT * FROM products命令表中检索所有项目

接下来,您创建了一个 HTML 表并使用 PHPwhile() {...}语句用产品数据填充它该行$row = $stmt->fetch(PDO::FETCH_ASSOC)查询数据库并将结果$row作为多维数组存储在变量中,然后您使用$row['column_name']语法将其显示在 HTML 表列中

product_image列中的图像包含在<img src = "">标签内。您已经使用widthheight属性将图像调整为更小的尺寸,以适合 HTML 表格列。

为了将BLOB数据类型保存的数据转换回图像,您使用了内置的 PHPbase64_encode函数和数据 URI 方案的以下语法

data:media_type;base64, base_64_encoded_data

在这种情况下,image/png列中media_typeBase64编码字符串product_imagebase_64_encoded_data

接下来,display_products.php通过键入以下地址在 Web 浏览器中执行该文件:

http://your-server-IP/display_products.php

display_products.php浏览器中运行该文件,您将看到一个 HTML 表格,其中包含产品和相关图像的列表。

MySQL 数据库中的产品列表

这证实了用于从 MySQL 检索图像的 PHP 脚本按预期工作。

结论

在本指南中,您使用 MySQLBLOB数据类型在 Ubuntu 18.04 上使用 PHP 存储和显示图像。您还看到了将图像存储在数据库中而不是将它们存储在文件系统中的基本优势。这些包括便携性、安全性和易于备份。如果您正在构建需要将信息和相关图像存储在一起的学生门户或员工数据库等应用程序,那么这项技术对您非常有用。

有关 MySQL 中支持的数据类型的更多信息,请遵循MySQL 数据类型指南如果您对与 MySQL 和 PHP 相关的更多内容感兴趣,请查看以下教程:

觉得文章有用?

点个广告表达一下你的爱意吧 !😁