PHP编程
MySQL
MySQL
MySQL 是最常用的与 PHP 一起使用的数据库。PHP 与 MySQL 的结合展示了服务器端脚本的强大功能。PHP 提供了丰富的 MySQL 函数,通过一个单独的模块来实现。在 PHP5 中,这个模块被移除,必须单独下载。
MySQL 允许用户创建表格,数据可以比存储在数组中的方式更高效地存储。
为了有效使用 MySQL 或一般的数据库,你需要理解 SQL(结构化查询语言)。
请注意,这篇页面使用的是 mysqli 函数,而不是旧的 mysql 函数。
如何一步步进行
连接到 MySQL 服务器
PHP 提供了 mysqli_connect
函数来连接 MySQL 服务器,它处理所有低级别的套接字处理。我们需要提供 4 个参数:第一个是 MySQL 服务器的名称,第二个是 MySQL 用户名,第三个是 MySQL 密码,最后是数据库名称。在此示例中,假设你的服务器是 localhost。如果你在一个系统上运行 Web 服务器,而在另一个系统上运行 MySQL,可以用 MySQL 所在系统的 IP 地址或域名来替换 localhost(确保所有防火墙都配置为开放适当的端口)。mysqli_connect
会返回一个 link_identifier
,我们可以用它来与数据库进行通信。我们将这个连接保存到一个名为 $cxn
的变量中。
<?php
$cxn = mysqli_connect("localhost", "your_user_name", "your_password", "database_name");
?>
执行查询
我们已经连接到 MySQL 服务器并选择了要使用的数据库,现在我们可以对数据库执行 SQL 查询,选择信息,进行插入、更新或删除操作。为此,我们使用 mysqli_query
。它接受两个参数:第一个是我们的 link_identifier
,第二个是 SQL 查询字符串。如果我们执行的是 SELECT 语句,mysqli_query
会生成一个资源或布尔值 false 来表示查询失败。如果我们执行的是 DELETE、INSERT 或 UPDATE,它会生成布尔值 true 或 false,表示操作是否成功。
执行查询的基本代码是 PHP 函数 mysqli_query($cxn, $query)
。其中 $query
是 MySQL 查询语句,$cxn
是数据库连接。例如,要返回查询 SELECT * FROM customers ORDER BY customer_id ASC
,可以写成:
<?php
mysqli_query($cxn, "SELECT * FROM customers ORDER BY customer_id ASC");
?>
然而,由于 MySQL 查询的长度和常常需要在处理返回值时重复查询的原因,这种直接的方法很快会变得繁琐。因此,所有(或几乎所有)查询通常分为两步。首先,查询被赋值给一个变量(通常这个变量命名为 $query
或 $sql_query
,以便统一和容易识别),这允许程序简单地调用 mysqli_query($cxn, $sql_query)
。
$sql_query = "SELECT * FROM customers ORDER BY customer_id ASC";
其次,为了处理查询返回的信息,实际操作中需要将返回的信息也赋值给一个变量。同样,这个变量的命名是约定而非必需(即你可以给它任何名称),通常这个变量被命名为 $result
,并通过赋值变量来调用该函数。
重要的是要理解,这段代码调用了 mysqli_query
函数,并将返回结果赋值给变量 $result
。[注意:请求信息的查询 — SELECT
、SHOW
、DESCRIBE
和 EXPLAIN
— 返回一个被称为资源的内容。其他类型的查询,操作数据库的查询,则返回 TRUE 如果操作成功,或者返回 FALSE 如果失败,或者用户没有权限访问表格。]
捕获错误
为了调试目的,我们可以写出如下代码来捕获错误:
<?php
$result = mysqli_query ($cxn, $sql_query)
or die (mysqli_error () . " The query was:" . $sql_query);
?>
注意:die
语句前的分号是被省略的。
如果 mysqli_query
函数返回 false,PHP 会终止脚本并打印来自 MySQL 的错误报告(例如 "you have an error in your SQL syntax")以及查询语句。
因此,假设数据库连接变量是 $cxn
,我们最终的代码将是:
<?php
$sql_query = "SELECT * FROM customers ORDER BY customer_id ASC";
$result = mysqli_query ($cxn, $sql_query)
or die (mysqli_error () . " The query was:" . $sql_query);
?>
将所有内容结合起来
在前面的章节中,我们介绍了三个命令,但没有讨论如何将它们结合使用。现在让我们来看一下如何从名为 MyTable
的表中选择信息,该表存储在名为 MyDB
的 MySQL 数据库中。
<?php
// 连接到 MySQL 服务器并返回我们的链接标识符
$link = mysql_connect("your_database_host", "your_user_name", "your_password")
or die('Could not connect: ' . mysql_error());
// 选择我们要使用的数据库
mysql_select_db("MyDB", $link) or die('Could not select database');
// 我们的 SQL 查询
$sql_query = "SELECT * FROM MyTable";
// 执行 SQL 查询
$result = mysql_query($sql_query) or die('Query failed: ' . mysql_error());
// 关闭数据库连接
mysql_close($link);
?>
注意:如果没有指定链接标识符,mysql_connect()
打开的最后一个连接将被默认使用。
创建数据库查询
[由 admin@technofranchise.com 提供:我们使用的是最新的 my_sqli
连接器。还有一些教程使用旧的 my_sql
连接器来进行数据库连接(不要混淆,它们不同,我们使用的是最新的连接器)。创建数据库是通过 PHP 脚本访问后端 MySQL 服务器的第一步。这可以通过连接到服务器并创建数据库来完成。]
<?php
$cn = mysqli_connect("localhost", "your_username", "my_password");
// 连接到服务器
if (mysqli_connect_errno()) {
echo "Error in establishing the connection: " . mysqli_connect_error();
}
$sql_query = "CREATE DATABASE MyDB";
if (mysqli_query($cn, $sql_query)) {
echo "Database has been created";
} else {
echo "Error while creating the database: " . mysqli_error($cn);
}
?>
创建表的查询
创建表的过程与创建数据库一样简单。我们只需要使用 mysqli
连接器来执行 CREATE TABLE
查询。
<?php
$cn = mysqli_connect("localhost", "my_username", "my_password", "MyDatabase");
if (mysqli_connect_errno()) {
echo "Connection failed: " . mysqli_connect_error();
}
$sql_query = "CREATE TABLE MyTable(firstName VARCHAR(18), lastName VARCHAR(18), salary DECIMAL(5,4))";
if (mysqli_query($cn, $sql_query)) {
echo "Table created successfully";
} else {
echo "Error encountered while creating the table: " . mysqli_error($cn);
}
?>
使用旧连接器构造器获取 SELECT
查询的信息
那这对我们有什么帮助呢?我们该如何处理 $result
?当我们执行 SELECT
查询时,我们从数据库中选择信息,并返回一个被称为资源的对象,这就是存储在 $result
中的内容,作为资源标识符。资源是 PHP 的一种特殊类型的变量。接下来,我们将看看如何访问这个资源中的信息。
我们可以使用一个名为 mysql_fetch_assoc
的函数,它接受一个参数,即我们的资源标识符 $result
,并生成一个与获取的行对应的关联数组。表中的每一列对应一个相同名称的索引。我们现在可以提取信息并像这样打印出来:
<?php
// 连接到 MySQL 服务器并返回我们的链接标识符
$link = mysql_connect("localhost", "your_user_name", "your_password")
or die('Could not connect: ' . mysql_error());
// 选择我们要使用的数据库
mysql_select_db("MyDB") or die('Could not select database');
// 我们的 SQL 查询
$sql_query = "SELECT * FROM MyTable";
// 执行 SQL 查询
$result = mysql_query($sql_query) or die('Query failed: ' . mysql_error());
// 遍历查询结果
while ($row = mysql_fetch_assoc($result)) {
// 打印出该行的信息
print_r($row);
echo $row['foo'];
// 只打印出 'foo' 列。
}
// 释放结果集(可选)
mysql_free_result($result);
// 关闭 MySQL 链接
mysql_close($link);
?>
使用最新连接器构造器插入记录
<?php
$cn = mysqli_connect("localhost", "your_username", "your_password", "MyDB");
if (mysqli_connect_errno()) {
echo "Connection failed: " . mysqli_connect_error();
}
mysqli_query($cn, "INSERT INTO MyTable(firstName, lastName, salary) VALUES ('George', 'Smith', 55000)");
mysqli_close($cn);
?>
使用最新连接器构造器更新记录
<?php
$cn = mysqli_connect("localhost", "your_username", "your_password", "MyDB");
if (mysqli_connect_errno()) {
echo "Connection failed: " . mysqli_connect_error();
}
mysqli_query($cn, "UPDATE MyTable SET salary = 6000 WHERE firstName = 'George' AND lastName = 'Smith'");
mysqli_close($cn);
?>
删除记录
<?php
$cn = mysqli_connect("localhost", "your_username", "your_password", "MyDB");
if (mysqli_connect_errno()) {
echo "Connection failed: " . mysqli_connect_error();
}
mysqli_query($cn, "DELETE FROM MyTable WHERE firstName = 'George' AND lastName = 'Smith'");
mysqli_close($cn);
?>
PHP + MySQL + Sphinx
一旦你了解了 MySQL 在 PHP 中的基本使用,你可能希望开始学习全文搜索引擎。当你的网站变得越来越大(例如有数百万条数据库记录)时,MySQL 查询将开始变得非常缓慢,特别是当你使用通配符进行文本搜索时:
WHERE content LIKE '%text%'
有很多免费的和付费的解决方案可以解决这个问题。一个好的开源全文搜索引擎是 Sphinx Search。你可以阅读关于如何在 PHP 和 MySQL 中使用 Sphinx 的 WikiBook,它解释了索引如何工作。在阅读官方文档之前,你可能希望先了解这个 WikiBook。
外部链接