PHP 和 MySQL 与 PostgreSQL

介绍

注意:你需要了解 SQL 才能使用 MySQL。你可以在 SQL 书籍中学习它。

PHP 与 MySQL 集成得很好,并且提供了一个包含大量有用函数的库来帮助你使用 MySQL。甚至有许多用 PHP 编写的数据库管理工具。

MySQL 不是运行 PHP 的服务器的一部分,它是一个独立的服务器。MySQL 是许多数据库服务器之一,它是开源的,你可以在这里获得它。

从 PHP5 开始,MySQLi 集成默认没有启用,你需要手动添加,安装说明可以参考此处,PHP4 默认启用。

注意mysql_*() 函数在 PHP 5.6+ 中已废弃,并在 PHP7+ 中移除。应使用 PDO 或 MySQLi 替代。

让我们开始吧!

连接到 MySQL 服务器

要连接到 MySQL 服务器,应该使用 mysqli_connect() 函数或 mysqli() 类。其用法如下:

mysqli_connect(servername, username, password, database);
  • servername:服务器的名称或地址。通常是 'localhost'。
  • username, password:用于登录服务器的用户名和密码。
  • database:你想选择的数据库名称。这个参数是可选的。

多个 MySQL 连接

尽管不常用,但你可以在一个脚本中连接多个数据库服务器。成功连接后,mysqli_connect() 会返回一个指向服务器的引用,你可以将其捕获到一个变量中:

$con = mysqli_connect("localhost", "root", "123");
$con2 = mysqli_connect("http://www.example.com/", "root", "123");

选择数据库

为了执行大多数操作(当然,除了创建、删除和列出数据库),你必须选择一个数据库。若没有在 mysqli_connect() 中定义数据库名称,则使用 mysqli_select_db() 来选择数据库。

mysqli_select_db(db_name);

其中,db_name 是数据库名称。

默认情况下,mysqli_select_db() 会尝试选择最后打开的 MySQL 连接中的数据库。因此,在以下代码中,mysqli_select_db() 会尝试选择 "example.com" 服务器上的数据库:

$con = mysqli_connect("localhost", "root", "123");
$con2 = mysqli_connect("example.com:3306", "root", "123");
mysqli_select_db("database1");

该函数还可以接受第二个可选参数,你可以使用它来选择与最后打开的数据库不同的数据库:

$con = mysqli_connect("localhost", "root", "123");
$con2 = mysqli_connect("example.com:3306", "root", "123");
mysqli_select_db("database1", $con);

执行查询

 

要执行查询,使用 mysqli_query() 函数。例如:

 
mysqli_query($con, "UPDATE table1 SET column1='value1', column2='value2' WHERE column3='value3'");
 

重要提示:

 

mysqli_query() 返回一个资源链接,在某些操作中需要使用此资源。因此,应该将其存储在一个变量中以便后续使用:

 
$query1 = mysqli_query($con, "UPDATE table1 SET column1='value1', column2='value2' WHERE column3='value3'");
 

用于 SELECT 查询的函数

 

执行 SELECT 查询本身很简单,但有时我们可能需要获取查询结果(PHP 开发者通常会这样做)。因此,PHP 提供了一些函数来帮助我们处理查询结果:

 

1. mysqli_fetch_row()

 

此函数返回结果中的下一行,作为一个数组。你可以将它捕获到一个变量中:

 
$query1 = mysqli_query($con, "SELECT id, name, address FROM phone_book");

$person = mysqli_fetch_row($query1);

print_r($person);
 

这将输出类似如下内容:

 
Array
{
    [0] => 1
    [1] => Sharon
    [2] => Helm, 3
}
 

这个函数将一直返回结果中的下一行,直到没有更多的行,返回 false。一个常见的用法是与 while 循环一起使用,例如:

 
$query1 = mysqli_query($con, "SELECT id, name, address FROM phone_book");

while($person = mysqli_fetch_row($query1)) { 
    print_r($person);
    echo "\n";
}
 

这将输出如下内容:

 
Array
{
    [0] => 1
    [1] => Sharon
    [2] => Helm, 3
}
Array
{
    [0] => 2
    [1] => Adam
    [2] => 23rd street, 5
}
Array
{
    [0] => 3
    [1] => Jane
    [2] => Unknown
}
 

2. mysqli_fetch_array()

 

此函数的作用与 mysqli_fetch_row() 相同,不同之处在于它返回一个关联数组,而不是数字索引数组。

 
$query1 = mysqli_query($con, "SELECT id, name, address FROM phone_book");

$person = mysqli_fetch_array($query1);

print_r($person);
 

这将输出:

 
Array
{
    [id] => 1
    [name] => Sharon
    [address] => Helm, 3
}
 

3. mysqli_num_rows()

 

有时我们希望知道查询结果中有多少行。可以使用以下方式:

 
$counter = 0;
$query1 = mysqli_query($con, "SELECT id, name, address FROM phone_book");

while(mysqli_fetch_row($query1)) {
    $counter++;
}
 

此时,$counter 变量会存储从查询中获得的行数,但 PHP 提供了一个更简便的函数来处理这个问题:

 
$query1 = mysqli_query($con, "SELECT id, name, address FROM phone_book"); 
$counter = mysqli_num_rows($query1);
 

$counter 现在存储的值与上面相同,但这样更简洁。

 

用于其他查询的函数

 

以下函数不仅适用于 SELECT 查询,还适用于许多类型的查询。它们在很多情况下都非常有用。

 

1. mysqli_info()

 

此函数返回有关最后执行的查询的信息,或者关于你传入的查询资源的信息:

 
mysqli_info();    // 获取最后执行的查询信息
mysqli_info($query); // 获取指定查询的相关信息
 

返回的是一个字符串,虽然它是模板化的,但通常不用于脚本分析,而是作为输出使用。

 

2. mysqli_affected_rows()

 

此函数返回受查询影响的行数,仅适用于 INSERTUPDATEDELETE 查询:

 
mysqli_affected_rows();       // 获取最后执行的查询影响的行数
mysqli_affected_rows($query); // 获取指定查询影响的行数
 

3. mysqli_insert_id()

 

此函数返回在执行 INSERT 查询后,MySQL 为自动递增列分配的 ID。

 
$result = mysqli_query($con, "INSERT INTO names (firstname) VALUES ('Bob')");
$new_id = mysqli_insert_id();
 

注意:应在执行查询后立即调用 mysqli_insert_id()。如果在调用 mysqli_insert_id() 之前执行了其他语句,它将返回 NULL

 

关闭连接

 

执行完数据库操作后,应使用 mysqli_close() 来关闭 MySQL 连接。通常情况下,这会关闭最后打开的连接,但当然,你也可以传入一个连接标识符来关闭特定的连接:

 
mysqli_close();  // 关闭最后打开的连接
mysqli_close($con); // 关闭指定连接 $con

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