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。[注意:请求信息的查询 — SELECTSHOWDESCRIBEEXPLAIN — 返回一个被称为资源的内容。其他类型的查询,操作数据库的查询,则返回 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。

 

外部链接

 

最后修改: 2025年01月10日 星期五 00:14