这是针对 MySQL 数据库的 PHP 编程教程。 它涵盖了使用 PHP 进行 MySQL 编程的基础。 它使用 _ 通用 mysql_ 模块。 这些示例是在 Ubuntu Linux 上创建和测试的。
如果您需要重新了解 PHP 语言,可以在极客教程上找到完整的 PHP 教程。
关于 MySQL 数据库
MySQL 是领先的开源数据库管理系统。 它是一个多用户,多线程的数据库管理系统。 MySQL 在网络上特别流行。 它是非常流行的 _LAMP_
平台的组成部分之一。 Linux,Apache,MySQL 和 PHP。 目前,MySQL 由 Oracle 拥有。 MySQL 数据库在最重要的 OS 平台上可用。 它可以在 BSD Unix,Linux,Windows 或 Mac OS 上运行。 维基百科和 YouTube 使用 MySQL。 这些站点每天管理数百万个查询。 MySQL 有两个版本:MySQL 服务器系统和 MySQL 嵌入式系统。
开始之前
我们需要安装几个软件包来执行本教程中的示例:php5-cli
,php5-mysql
,mysql-server
和mysql-client
。
_php5-cli_
是 PHP5 编程语言的命令行解释器。 本教程中的所有示例均在控制台上创建。 我特意跳过了 Web 界面,以使示例更简单,仅关注 PHP 和 MySQL。
如果您尚未安装 MySQL,则必须安装它。
此命令将安装 MySQL 服务器和其他各种软件包。 在安装软件包时,提示我们输入 MySQL 根帐户的密码。
接下来,我们将创建一个新的数据库用户和一个新的数据库。 我们使用mysql
客户端。
我们检查 MySQL 服务器是否正在运行。 如果没有,我们需要启动服务器。 在 Ubuntu Linux 上,可以使用service mysql start
命令来完成。
如果我们已经从软件包中安装了 MySQL 数据库,则上述命令是启动 MySQL 的常用方法。
上面的命令使用 MySQL 服务器启动脚本启动 MySQL 服务器。 我们启动 MySQL 服务器的方式可能有所不同。 这取决于我们是否从源代码或软件包安装了 MySQL,也取决于 Linux 发行版。 有关更多信息,请查阅 MySQL 的第一步或您的 Linux 发行版信息。
接下来,我们将创建一个新的数据库用户和一个新的数据库。 我们使用mysql
客户端。
我们使用 _mysql 监视器 _ 客户端应用连接到服务器。 我们使用根帐户连接到数据库。 我们用SHOW DATABASES
语句显示所有可用的数据库。
我们创建一个新的mydb
数据库。 在整个教程中,我们将使用此数据库。
我们创建一个新的数据库用户。 我们授予该用户mydb
数据库所有表的所有特权。
php5-mysql
为了从 PHP 语言连接到 MySQL 数据库,我们必须安装php5-mysql
软件包。 这是 Debian / Ubuntu Linux 的软件包名称。 在其他衍生产品上,名称可能有所不同。 该程序包包含三个模块。 它们也称为扩展。
- mysql 模块
- mysqli 模块
- pdo_mysql
通用mysql
模块是 MySQL 数据库的原始 PHP API。 我们的教程涵盖了该模块。 API 是程序性的。 该模块不提供较新的 MySQL 数据库的所有最新功能。 MySQL 改进的mysqli
模块是 MySQL 4.1.3 或更高版本的推荐模块。 它提供了面向对象的 API 和过程 API。 与原始的mysql
模块相比,它具有一些优点和增强。
PHP 数据对象模块pdo_mysql
是 PHP 应用的数据库抽象层。 如果我们编写可移植的数据库 PHP 脚本,则此模块非常有用。
第一个脚本
以下脚本是一个简单的 PHP 脚本。 如果此小脚本运行正常,则说明我们已安装了所有必需的东西。
我们连接到数据库并获取有关 MySQL 服务器的一些信息。
这是三个变量,分别包含主机名,用户名和密码。 连接到 MySQL 数据库时需要这些变量。
我们使用mysql_connect()
功能连接到数据库。 该函数返回一个布尔值,指示是否成功创建连接。 该功能具有 3 个参数。 第一个是安装服务器的主机。 第二和第三个参数是用户名和用户密码。
现在我们检查$r
变量。 如果它包含布尔值 false,则表示未创建与数据库的连接。 我们调用trigger_error()
函数来生成错误消息。 第一条通用消息发送给用户。 记录通过trigger_error()
功能生成的更具体的错误消息。
mysql_get_server_info()
返回 MySQL 服务器版本。
mysql_close()
功能关闭与数据库的连接。 在本例中,不需要关闭连接,因为在脚本执行结束时,非持久性打开链接会自动关闭。 但是,这是一种好的编程习惯。
在我的系统上,我得到以下输出。
我们有一个类似的脚本。
我们检查 MySQL 数据库的版本。 这次使用 SQL 查询。
这是 SQL SELECT
语句。 它返回数据库的版本。 VERSION()
是内置的 MySQL 函数。
mysql_query()
函数在数据库上执行 SQL 查询。 这是一个 SELECT 查询,因此结果是一个包含一些数据的结果集。
如果发生错误,我们会生成一条错误消息。 否则,我们将打印执行的 SQL 查询。
我们从结果集中获取一行。 $ row 变量是一个包含数据的数组。
我们从数组中打印数据。 根据查询的性质,我们知道数组只有一项,即 MySQL 版本字符串。
脚本在我们系统上的输出。
创建并填充表
接下来,我们将创建一个数据库表并用数据填充它。
在上面的代码示例中,我们创建具有 8 行的Cars
表。
我们创建了一个自定义execute_query()
函数,该函数将为每个INSERT
语句调用。
在使用数据库表之前,我们必须选择一个数据库。 使用mysql_select_db()
功能选择一个数据库。
数据库选择过程的错误处理。
第一个查询将删除Cars
表(如果已存在)。
这是创建Cars
表的 SQL 语句。
一辆汽车被插入桌子。
如果发生错误,我们将打印错误消息并终止脚本。
执行create_fill.php
脚本。
数据插入到Cars
表中。
检索数据
现在我们已经将一些数据插入数据库中,我们想要取回它。
在此示例中,我们从Cars
表中检索五行。
该 SQL 语句从Cars
表中选择 5 行。
我们使用mysql_query()
函数执行查询并检索结果集。
如果查询没有成功,我们将生成一条错误消息。
我们遍历结果集并将数据打印到控制台。 mysql_fetch_assoc()
函数返回与提取的行相对应的字符串关联数组,如果没有更多行,则返回 FALSE。 换句话说,函数调用从结果集中返回一行。 该行采用关联数组的形式。 列名称是关联数组的键。 当结果集中没有更多行时,该函数将返回 FALSE,而 while 循环终止。
这是示例的输出。
在第二个示例中,我们将使用mysql_fetch_row()
函数获取数据。
我们从Cars
表中获得前 5 行。
mysql_num_rows()
函数从结果集中获取行数。
我们使用 for 循环遍历返回的行。 mysql_fetch_row()
函数从结果集中以枚举数组的形式检索行。
输出。
在下面的示例中,我们显示了如何从表中检索特定行。
开发人员在处理用户输入时必须考虑安全性问题。 我们必须始终处理来自外部世界的数据。 检查数据的有效性。
在脚本中,我们检查 Caras 表中是否有“ Volkswagen”。 此值可能来自 XML 文件或 Web 表单。 我们将展示如何检查它。
我们使用sprintf()
函数构建 SQL 语句。 我们使用mysql_real_escape_string()
函数处理$name
变量。 此函数转义字符串中的特殊字符以用于 SQL 语句。 这样可以防止 SQL 注入攻击和数据损坏。 处理完变量后,将其放入 SQL 语句字符串中。
我们使用mysql_fetch_object()
函数获取数据。 该函数获取结果行作为对象。 然后,我们使用对象表示法获取表列。
示例的输出。 我们找到了汽车,并将整行打印到控制台。
转义字符
我们将有一个小示例演示如何转义字符。 有些字符在数据库环境中被认为是不安全的。 其中之一是单引号字符。
对于该示例,我们创建一个Authors
表。
我们在Authors
表中插入一个新作者。 作者的名字叫奥尼尔。 该名称具有不安全的单引号字符。
Thay 就是为什么我们使用mysql_real_escape_string()
功能来转义此字符。
我们创建该语句并执行它。
该名称已成功写入表中。
列标题
接下来,我们将展示如何使用数据库表中的数据打印列标题。
同样,我们将 Writers 表的内容打印到控制台。 现在,我们也包括列的名称。
要获取特定的字段名称,我们利用mysql_fetch_field()
函数。 该函数返回一个包含列信息的对象。
列名称已打印并格式化。 name 属性包含列名。
脚本的输出。
行和列数
以下脚本计算查询返回的字段/列和行数。
我们从Cars
表中选择三行。 我们计算查询返回的行数和列数。
这是要执行的查询。 它从“汽车”表中选择前三行。
mysql_num_fields()
返回查询返回的字段数。
mysql_num_rows()
返回查询返回的行数。
我们打印数组的内容。
运行脚本。
写入图像
有些人喜欢将其图像放入数据库中,有些人则希望将其保留在文件系统中以供其应用使用。 当我们处理大量图像时,会出现技术难题。 图像是二进制数据。 MySQL 数据库具有一种特殊的数据类型来存储称为BLOB
(二进制大对象)的二进制数据。
对于此示例,我们创建一个名为 Images 的新表。
在上面的脚本中,我们读取 JPG 图像并将其插入到Images
表中。
这是我们从文件系统读取并写入数据库的映像名称。 它与脚本名称位于同一目录中。
我们打开并阅读图像。 fread()
函数以字符串形式返回数据。
我们逃避不安全的字符。
我们关闭图像文件的句柄。
我们将数据插入到新创建的 Images 表中。
读取图像
在前面的示例中,我们已将图像插入数据库表中。 现在,我们将从表中读取图像。
我们从Images
表中读取了一张图像。
我们从表中选择一条记录。
我们从结果集中获取一行。 只有一行包含图像数据。
我们将创建一个名为woman2.jpg
的新图像文件。
我们打开一个可写的二进制文件。
我们使用fwrite()
函数将数据写入文件系统。
现在我们在当前目录中应该有一个名为woman2.jpg
的映像。 我们可以检查它是否与我们插入表中的图像相同。
事务支持
事务 是针对一个或多个数据库中数据的数据库操作的基本单位。 事务中所有 SQL 语句的影响可以全部提交给数据库,也可以全部回滚。
MySQL 数据库具有不同类型的存储引擎。 最常见的是 MyISAM 和 InnoDB 引擎。 MyISAM 是默认的。 在数据安全性和数据库速度之间需要权衡。 MyISAM 表的处理速度更快,并且不支持事务。 另一方面,InnoDB 表可以更安全地防止数据丢失。 他们支持事务。 它们处理较慢。
在此脚本中,我们尝试更新三行。 该表的存储引擎是 MyISAM。
在这里,我们要更改第 1 行和第 2 行的作者姓名。
SQL 语句中有错误。 没有 Writer 表。
运行脚本会出现错误。 但是,正如我们所看到的,前两行已经更改。
在本教程的最后一个示例中,我们将重新创建 Writers 表。 这次,该表将为 InnoDB 类型。 InnoDB MySQL 数据库表支持事务。
这是writers.sql
文件。 它用于重新创建Writers
表。
我们可以使用source
命令来加载和执行 SQL 脚本。
现在,我们将执行上面的脚本。 我们要从表中删除三行。 第三个 SQL 语句有一个错误。
START TRANSACTION
语句开始一个新的事务。 必须使用COMMIT
语句将所有更改永久化,或使用ROLLBACK
语句将其忽略。
仅当所有三个 SQL 语句都返回 True 时,才提交语句。 否则,我们将它们回滚。 在我们的情况下,$r3
变量为 False,因此不会使语句成为永久语句,也不会从表中删除行。
在将更改提交到数据库之前,发生了错误。 调用ROLLBACK
语句,并且没有发生删除。
您可能也对 MySQL Python 教程, MySQL Visual Basic 教程或 MySQL PHP 教程,MySQL Java 教程,MySQL Ruby 教程,MySQL C# 教程感兴趣。