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

作者选择了 Girls Who Code以作为 Write for Donations计划的一部分获得捐款。

介绍

二进制大对象(Binary Large Object,BLOB)是可以存储图像、多媒体和PDF等二进制数据的MySQL(LINK1)数据类型。

当创建需要紧密连接的数据库的应用程序时,图像应该与相关数据同步(例如,员工门户网站,学生数据库或财务应用程序),您可能会发现在MySQL数据库中与其他相关信息一起存储图像,例如学生护照照片和签名。

这就是MySQLBLOB数据类型出现的地方。这个编程方法消除了创建用于存储图像的单独文件系统的需要。该方案还集中了数据库,使其更便携式和安全,因为数据与文件系统隔离。

数据检索速度更快,在创建记录时,您可以确保数据验证规则和参考完整性得到维护,尤其是在使用 MySQL 交易时。

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

前提条件

要跟随这个指南,你需要以下几点:

步骤一:创建数据库

要做到这一点,请 SSH 进入您的服务器,然后运行以下命令以作为 root 登录您的 MySQL 服务器:

1sudo mysql -u root -p

输入您的MySQL数据库的根密码,然后按ENTER来继续。

然后,运行以下命令来创建数据库. 在本教程中,我们将命名它 test_company:

1CREATE DATABASE test_company;

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

1[secondary_label Output]
2Query OK, 1 row affected (0.01 sec)

接下来,在MySQL服务器上创建一个test_user帐户,并记住用强大的密码取代PASSWORD:

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

您将看到以下输出:

1[secondary_label Output]
2Query OK, 0 rows affected (0.01 sec)

若要在「test_company」数据库中授予「test_user」的完整权限,请运行:

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

确保你得到以下输出:

1[secondary_label Output]
2Query OK, 0 rows affected (0.01 sec)

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

1FLUSH PRIVILEGES;

确保您看到以下输出:

1[secondary_label Output]
2Query OK, 0 rows affected (0.01 sec)

现在‘test_company’数据库和‘test_user’已经准备好了,您将继续创建一个‘产品’表来存储样本产品。

从 MySQL 服务器中退出:

1QUIT;

然后,再次登录您创建的test_user的凭证:

1mysql -u test_user -p

当被提示时,输入test_user的密码,然后按ENTER继续,然后通过键入以下方式切换到test_company数据库:

1USE test_company;

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

1[secondary_label Output]
2Database changed

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

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

此命令创建一个名为产品的表,表有四个列:

  • product_id 数据:本列使用 BIGINT 数据类型,以容纳多达 263-1 个项目的大型产品列表。 您已将列标为 PRIMARY KEY 以便独特地识别产品。 为了使 MySQL 能够处理插入列的新标识符的生成,您使用了 AUTO_INCREMENT 关键字。
  • product_name: 此列包含产品名称。 您已经使用了 VARCHAR 数据类型,因为这个字段通常会处理最多 50 个字符的 alphanumerics,而 50 的限制仅是本教程中使用的假设值。
  • product_name: 此列包含产品名

您已为表使用了InnoDB存储空间ENGINE,以支持包括 MySQL 交易在内的各种功能。

1[secondary_label Output]
2Query OK, 0 rows affected (0.03 sec)

登录您的MySQL服务器:

1QUIT;

您将获得以下输出

1[secondary_label Output]
2Bye

产品表现在已经准备好存储一些记录,包括产品图像,您将在下一步填充一些产品。

步骤 2 — 创建 PHP 脚本来连接和人口数据库

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

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

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

然后,在文件中输入以下信息,并用您在步骤 1 中创建的test_user密码取代PASSWORD

 1[label /var/www/html/config.php]
 2<?php
 3
 4define('DB_NAME', 'test_company');
 5define('DB_USER', 'test_user');
 6define('DB_PASSWORD', 'PASSWORD');
 7define('DB_HOST', 'localhost');
 8
 9$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
10$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
11$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

保存并关闭文件。

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

  • DB_NAME : 这个常数包含了 test_company 数据库的名称。
  • DB_USER : 这个变量包含了 test_user 用户名。
  • DB_PASSWORD : 这个常数存储了 test_user 帐户的 MySQL `PASSWORD。
  • DB_HOST: 这是数据库所在的服务器。

您的文件中的下一行启动了 PHP Data Object (PDO) 并连接到 MySQL 数据库:

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

到文件的尽头,你已经设置了几个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 PHP 脚本,将记录插入到产品表中:

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

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

 1[label /var/www/html/insert_products.php]
 2<?php
 3
 4require_once 'config.php';
 5
 6$products = [];
 7
 8$products[] = [
 9              'product_name' => 'VIRTUAL SERVERS',
10              'price' => 5,
11              'product_image' => file_get_contents("https://i.imgur.com/VEIKbp0.png")
12              ];
13
14$products[] = [
15              'product_name' => 'MANAGED KUBERNETES',
16              'price' => 30,
17              'product_image' => file_get_contents("https://i.imgur.com/cCc9Gw9.png")
18              ];
19
20$products[] = [
21              'product_name' => 'MySQL DATABASES',
22              'price' => 15,
23              'product_image' => file_get_contents("https://i.imgur.com/UYcHkKD.png" )
24              ];
25
26$sql = "INSERT INTO products(product_name, price, product_image) VALUES (:product_name, :price, :product_image)";
27
28foreach ($products as $product) {
29    $stmt = $pdo->prepare($sql);
30    $stmt->execute($product);
31}
32
33echo "Records inserted successfully";

保存并关闭文件。

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

然后,您创建了一组产品数据,将其插入到数据库中。除了product_nameprice,这些数据分别以字符串和数字值编制,脚本使用PHP的内置file_get_contents函数来读取来自外部源的图像,并将它们作为字符串传送到product_image列。

接下来,您已经准备了一个SQL语句,并使用PHP的foreach{...}语句将每个产品插入数据库。

要執行 /var/www/html/insert_products.php 檔案,請在瀏覽器窗口使用下列 URL 進行執行。

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

執行檔案後,你會看到一個成功訊息在您的瀏覽器中確認記錄被插入到資料庫。

A success message showing that records were inserted to database

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

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

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

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

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

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

 1[label /var/www/html/display_products.php]
 2<html>
 3  <title>Using BLOB and MySQL</title>
 4  <body>
 5
 6  <?php
 7
 8  require_once 'config.php';
 9
10  $sql = "SELECT * FROM products";
11  $stmt = $pdo->prepare($sql);
12  $stmt->execute();
13  ?>
14
15  <table border = '1' align = 'center'> <caption>Products Database</caption>
16    <tr>
17      <th>Product Id</th>
18      <th>Product Name</th>
19      <th>Price</th>
20      <th>Product Image</th>
21    </tr>
22
23  <?php
24  while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
25      echo '<tr>';
26      echo '<td>' . $row['product_id'] . '</td>';
27      echo '<td>' . $row['product_name'] . '</td>';
28      echo '<td>' . $row['price'] . '</td>';
29      echo '<td>' .
30      '<img src = "data:image/png;base64,' . base64_encode($row['product_image']) . '" width = "50px" height = "50px"/>'
31      . '</td>';
32      echo '</tr>';
33  }
34  ?>
35
36  </table>
37  </body>
38</html>

将更改保存到文件中并关闭它。

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

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

来自product_image列的图像被嵌入到<img src = "">标签中,您已经使用了widthheight属性来调整图像的大小到更小的尺寸,可以适合 HTML 表列。

为了将BLOB数据类型的数据转换为图像,您已经使用了内置的PHPbase64_encode函数和下面的语法为 Data URI 方案:

1data:media_type;base64, base_64_encoded_data

在这种情况下,image/pngmedia_type,而product_image列的Base64编码字符串是base_64_encoded_data

接下来,在网页浏览器中运行display_products.php文件,键入以下地址:

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

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

List of products from MySQL database

这证实了从MySQL获取图像的PHP脚本正按预期工作。

结论

在本指南中,您使用MySQLBLOB数据类型来存储和显示在Ubuntu 18.04上使用PHP的图像,您还看到了存储图像在数据库中的基本优势,而不是存储它们在文件系统中。

有关 MySQL 支持的数据类型的更多信息,请参阅 MySQL 数据类型指南

Published At
Categories with 技术
comments powered by Disqus