作者选择了 Girls Who Code以作为 Write for Donations计划的一部分获得捐款。
介绍
二进制大对象(Binary Large Object,BLOB)是可以存储图像、多媒体和PDF等二进制数据的MySQL(LINK1)数据类型。
当创建需要紧密连接的数据库的应用程序时,图像应该与相关数据同步(例如,员工门户网站,学生数据库或财务应用程序),您可能会发现在MySQL数据库中与其他相关信息一起存储图像,例如学生护照照片和签名。
这就是MySQLBLOB
数据类型出现的地方。这个编程方法消除了创建用于存储图像的单独文件系统的需要。该方案还集中了数据库,使其更便携式和安全,因为数据与文件系统隔离。
数据检索速度更快,在创建记录时,您可以确保数据验证规则和参考完整性得到维护,尤其是在使用 MySQL 交易时。
在本教程中,您将使用MySQLBLOB
数据类型来存储在Ubuntu 18.04上使用 PHP的图像。
前提条件
要跟随这个指南,你需要以下几点:
- Ubuntu 18.04 服务器配置使用 初始服务器设置与 Ubuntu 18.04和非根用户与
sudo
特权。 - Apache,MySQL,PHP设置通过遵循指南在 如何安装Linux,Apache,MySQL,PHP(LAMP)堆栈在 Ubuntu 18.04 。
步骤一:创建数据库
要做到这一点,请 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_name
和price
,这些数据分别以字符串和数字值编制,脚本使用PHP的内置file_get_contents
函数来读取来自外部源的图像,并将它们作为字符串传送到product_image
列。
接下来,您已经准备了一个SQL语句,并使用PHP的foreach{...}
语句将每个产品插入数据库。
要執行 /var/www/html/insert_products.php
檔案,請在瀏覽器窗口使用下列 URL 進行執行。
1http://your-server-IP/insert_products.php
執行檔案後,你會看到一個成功訊息在您的瀏覽器中確認記錄被插入到資料庫。
您已成功将包含产品图像的三个记录插入到产品
表中,在下一步,您将创建一个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 = "">
标签中,您已经使用了width
和height
属性来调整图像的大小到更小的尺寸,可以适合 HTML 表列。
为了将BLOB
数据类型的数据转换为图像,您已经使用了内置的PHPbase64_encode
函数和下面的语法为 Data URI 方案:
1data:media_type;base64, base_64_encoded_data
在这种情况下,image/png
是media_type
,而product_image
列的Base64
编码字符串是base_64_encoded_data
。
接下来,在网页浏览器中运行display_products.php
文件,键入以下地址:
1http://your-server-IP/display_products.php
在您的浏览器中运行display_products.php
文件后,您将看到一个包含产品列表和相关图像的HTML表。
这证实了从MySQL获取图像的PHP脚本正按预期工作。
结论
在本指南中,您使用MySQLBLOB
数据类型来存储和显示在Ubuntu 18.04上使用PHP的图像,您还看到了存储图像在数据库中的基本优势,而不是存储它们在文件系统中。
有关 MySQL 支持的数据类型的更多信息,请参阅 MySQL 数据类型指南。
- [如何在Ubuntu 18.04上实现MySQL中的页面化(https://andsky.com/tech/tutorials/how-to-implement-pagination-in-mysql-with-php-on-ubuntu-18-04)
- 如何在Ubuntu 18.04上使用PDO PHP扩展来执行MySQL交易