PHP 手册
后退 |  | 前进

# LXXXIV. MySQL 函数

# 简介

可以使用本类函数访问 MySQL 数据库服务器。有关 MySQL 的详细信息可以到 http://www.mysql.com/ 查询。

MySQL 的文档可以在 http://dev.mysql.com/doc/ 找到。

# 需求

为了能够顺利的使用本类函数，必须在编译 PHP 的时候添加 MySQL 的支持。

# 安装

编译时，只要使用 --with-mysql[=DIR] 配置选项即可，其中可选的 [DIR] 指向 MySQL 的安装目录。

本 MySQL 扩展库不支持 MySQL 4.1.0 以上版本全部功能。对此，可用 MySQLi。

如果要同时安装 mysql 扩展库和 mysqli 扩展库，必须使用同一个客户端库以避免任何冲突。

## 在 Linux 系统下安装

### PHP 4

默认开启了 --with-mysql 选项。此默认行为可以用 --without-mysql 配置选项来禁止。如果启用 MySQL 而不指定安装目录的话，PHP 将使用绑定的 MySQL 客户端连接库。

还有其它应用程序使用 MySQL（例如 auth-mysql）的用户不要用绑定的库，而要指定 MySQL 的安装目录，如这样：--with-mysql=/path/to/mysql。这将强制 PHP 使用随 MySQL 安装的客户端连接库，就可以避免任何冲突。

### PHP 5+

MySQL 默认未启用，也没有绑定的 MySQL 库。其原因见此 FAQ。使用 --with-mysql[=DIR] 配置选项来加入 MySQL 的支持。可以从 MySQL 下载头文件和库。

## 在 Windows 系统下安装

### PHP 4

PHP MySQL 扩展已经编译入 PHP。

### PHP 5+

MySQL 默认未启用，因此必须在 `php.ini` 中激活 `php_mysql.dll` 动态连接库。此外，PHP 还需要访问 MySQL 客户端连接库。PHP 的 Windows 发行版包括了一个 `libmysql.dll`，为了让 PHP 能和 MySQL 对话，此文件必须放在 Windows 的系统路径 PATH 中。怎样做见 FAQ 中的“怎样把 PHP 目录加入到 Windows 路径中”。尽管将 `libmysql.dll` 拷贝到 Windows 系统目录中也可以（因为系统目录默认在系统路径 PATH 中），但不推荐这样做。

要激活任何 PHP 扩展库（例如 `php_mysql.dll`），PHP 指令 extension_dir 要被设为 PHP 扩展库所在的目录。参见手工 Windows 安装指南。PHP 5 下 extension_dir 取值的一个例子是 c:\php\ext。

> 注: 如果启动 web 服务器时出现类似如下的错误："Unable to load dynamic library './php_mysql.dll'"，这是因为系统找不到 `php_mysql.dll` 和／或 `libmysql.dll`。

## MySQL 安装注意事项

警告
当同时加在本扩展库和 recode 扩展库时 PHP 可能会崩溃。更多信息见 recode 扩展库。

> 注: 如果需要不同于 latin（默认值）的字符集，必须安装外部的（非绑定的）已编译入所需字符集支持的 libmysql。

# 运行时配置

这些函数的行为受 `php.ini` 的影响。

表格 1. MySQL 配置选项

选项名称 | 默认值 | 可修改范围 | 更新记录
--- | --- | --- | ---
mysql.allow_persistent | "1" | PHP_INI_SYSTEM |
mysql.max_persistent | "-1" | PHP_INI_SYSTEM |
mysql.max_links | "-1" | PHP_INI_SYSTEM |
mysql.trace_mode | "0" | PHP_INI_ALL | 自 PHP 4.3.0 起可用
mysql.default_port | NULL | PHP_INI_ALL |
mysql.default_socket | NULL | PHP_INI_ALL | 自 PHP 4.0.1 起可用
mysql.default_host | NULL | PHP_INI_ALL |
mysql.default_user | NULL | PHP_INI_ALL |
mysql.default_password | NULL | PHP_INI_ALL |
mysql.connect_timeout | "60" | PHP_INI_ALL | 自 PHP 4.3.0 起可用。在 PHP <= 4.3.2 时为 PHP_INI_SYSTEM

有关 PHP_INI_* 常量进一步的细节与定义参见附录 G。

以下是配置选项的简要解释。

mysql.allow_persistent boolean

  是否允许 MySQL 的持久连接。

mysql.max_persistent integer

  每个进程中最大的持久连接数目。

mysql.max_links integer

  每个进程中最大的连接数，包括持久连接。

mysql.trace_mode boolean

  跟踪模式。当激活 mysql.trace_mode 时，将会显示 table/index 扫描的警告，未释放的结果集以及 SQL 错误。（PHP 4.3.0 引进）

mysql.default_port string

  指定默认连接数据库的 TCP 端口号。如果没有指定默认端口号，则按顺序从 MYSQL_TCP_PORT 环境变量，`/etc/services` 文件中的 mysql-tcp 项或者编译时指定的 `MYSQL_PORT` 常量中取得。Win32 环境下只会使用 `MYSQL_PORT` 常量。

mysql.default_socket string

  当使用本地连接的时候，默认的 socket 名称。

mysql.default_host string

  默认连接的数据库服务器地址。不适用于 SQL 安全模式。

mysql.default_user string

  默认连接数据库时使用的用户名。不适用于 SQL 安全模式。

mysql.default_password string

  默认连接数据库时使用的密码。不适用于 SQL 安全模式。

mysql.connect_timeout integer

  连接超时秒数。在 Linux 中，此参数设定了等候来自服务器的响应的时长。

# 资源类型

在 MySQL 模块中使用了两种资源类型。第一种是数据库的连接句柄，第二种是 SQL 查询返回的结果集。

# 预定义常量

以下常量由本扩展模块定义，因此只有在本扩展模块被编译到 PHP 中，或者在运行时被动态加载后才有效。

在 PHP 4.3.0 以后的版本中，允许在 mysql_connect() 函数和 mysql_pconnect() 函数中指定更多的客户端标记。下面列出所定义的常量：

表格 2. MySQL 客户端常量

常量 | 描述
--- | ---
MYSQL_CLIENT_COMPRESS | 使用压缩的通讯协议
MYSQL_CLIENT_IGNORE_SPACE | 允许在函数名后留空格位
MYSQL_CLIENT_INTERACTIVE | 允许设置断开连接之前所空闲等候的 interactive_timeout 时间（代替 wait_timeout）。
MYSQL_CLIENT_SSL | 使用 SSL 加密。本标志仅在 MySQL 客户端库版本为 4.x 或更高版本时可用。在 PHP 4 和 Windows 版的 PHP 5 安装包中绑定的都是 3.23.x。

mysql_fetch_array() 函数使用一个常量来表示所返回数组的类型。下面是常量的定义：

表格 3. MySQL fetch 常量

常量 | 描述
--- | ---
MYSQL_ASSOC | 返回的数据列使用字段名作为数组的索引名。
MYSQL_BOTH | 返回的数据列使用字段名及数字索引作为数组的索引名。
MYSQL_NUM | 返回的数据列使用数字索引作为数组的索引名。索引从 0 开始，表示返回结果的第一个字段。

# 注释

> 注: 大多数 MySQL 函数都接受 link_identifier 作为最后一个可选参数。如果未提供此参数，则使用最后一个打开的连接。如果不存在连接，则会用 `php.ini` 中定义的默认参数去尝试建立连接。如果连接不成功，函数返回 `FALSE`。

# 范例

下面的简单例子演示如何连接数据库，执行查询语句，打印返回结果集和断开数据库等一系列基本的 MySQL 操作。

例子 1. MySQL 例子

`<?php
// 连接，选择数据库
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
or die('Could not connect: ' . mysql_error());
echo 'Connected successfully';
mysql_select_db('my_database') or die('Could not select database');
// 执行 SQL 查询
$query = 'SELECT * FROM my_table';
$result = mysql_query($query) or die('Query failed: ' . mysql_error());
// 用 HTML 显示结果
echo "<table>\n";
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
echo "\t<tr>\n";
foreach ($line as $col_value) {
echo "\t\t<td>$col_value</td>\n";
}
echo "\t</tr>\n";
}
echo "</table>\n";
// 释放结果集
mysql_free_result($result);
// 关闭连接
mysql_close($link);
?>`

后退 | 起点 | 前进
muscat_setup | 上一级 | mysql_affected_rows