MySQLi是MySQL增强版扩展。要使用 mysqli 相关的函数, 你必须以启用 mysqli 扩展的方式编译 PHP。
MySQL 8
使用 PHP 7.1.16 之前的版本或者 PHP 7.2(PHP 7.2.4 之前的版本), 需要将 MySQL 服务器的默认密码插件设置为:mysql_native_password。 否则,当你连接的时候就会看到类似这样的错误: The server requested authentication method unknown to the client [caching_sha2_password]。 即使你未使用 caching_sha2_password 也会这样。
发生这种错误的原因是,MySQL 8 服务器默认会使用 caching_sha2_password 扩展, 老版本的 PHP 驱动(mysqlnd)无法识别这个扩展。 所以需要在 MySQL 的配置文件 my.cnf 中,设置 default_authentication_plugin=mysql_native_password。 在后续的 PHP 发行版本中,会提供对 MySQL caching_sha2_password 扩展的支持。 目前只有 mysql_xdevapi 扩展是 支持 MySQL 的 caching_sha2_password 扩展的安装
mysqli扩展在PHP5.0.0中被引入。Mysql Native驱动在PHP5.3.0版本中被引入。
在linux上安装
通用的Unix分发包中会包含PHP可安装的二进制版本。虽然这些二进制版本通常会被构建为支持启用mysql扩展的, 蚕食扩展库自身可能需要依赖其他附加包的安装。因此对包管理的检查会比选择可用的发行版本更重要。
除非你的Unix分发包包含的PHP二进制包的mysqli扩展可用,否则你就需要 从源码构建PHP。如果你希望使用mysql扩展,从PHP源代码构建允许你这样做,并且可以指定每个扩展 使用什么客户端库。
使用Mysql Native Driver 是推荐的选项,会提升性能并且会带来一些Mysql Client Library不允许的访问特性。 什么是Mysql自然驱动器?中对Mysql Native Driver 的优势做了一个简要概述。
/path/to/mysql_config代表了要用来编译mysql客户端/连接mysql服务端的mysql_config程序位置。
PHP 版本 | 默认 | 配置选项: mysqlnd | 配置选项:libmysql | 更新日志 |
---|---|---|---|---|
5.0.x, 5.1.x, 5.2.x | libmysql | 不适用 | --with-mysqli=/path/to/mysql_config | |
5.3.x | libmysql | --with-mysqli=mysqlnd | --with-mysqli=/path/to/mysql_config | mysqlnd is now supported |
5.4.x | mysqlnd | --with-mysqli | --with-mysqli=/path/to/mysql_config | mysqlnd is now the default |
请注意Mysql扩展和客户端库是可以自由混合的。比如,可以使用libmysql这个mysql客户端库来启用Mysql扩展,使用 Mysql Native Driver来配置mysqli扩展。所有的扩展和客户端库的顺序都是可能的。
下面的示例使用Mysql Client Library(libmysql)构建了mysql扩展,并且mysqli和 PDO Mysql扩展使用Mysql Native Dirver(作为客户端库):
./configure --with-mysql=/usr/bin/mysql_config \ --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd [other options]
在windows系统安装
在windows上,PHP通常使用二进制安装包进行安装。
PHP 5.0, 5.1, 5.2
当PHP安装后,如果期望使用则可以通过一些配置来开启mysqli并指定客户端库。
mysqli扩展默认并不会开启,因此php.ini中php_mysqli.dll这个DLL 必须开启。为此你需要找到php.ini文件(通常在c:\php),并且你需要确认删除了[PHP_MYSQLI]部分中的extension=php_mysqli.dll一行行首的注释符号(分号)。
另外,如果你希望使用Mysql client library(libmysql)作为mysqli的驱动器,你需要确保PHP可以访问 客户端库的文件。Mysql Client Library作为文件libmysql.dll包含在windows的PHP分发包中。 这个文件需要在windows系统的PATH环境变量中才可以被成功加载。查看FAQ文档 怎样增加我的PHP目录到Windows的PATH中了解怎样配置环境变量PATH。 把libmysql.dll拷贝到Windows的系统目录(通常是c:\Windows\system)也是适用的, 通常系统目录默认就在系统的PATH环境变量下。然而,我们强烈反对这种做法。
就像开启任何PHP扩展(比如php_mysqli.dll),PHP指令 extension_dir可以被设置为PHP扩展位置的目录路径。 查看windows安装介绍手册。关于此的一个例子是PHP 5中extension_dir指令的值是c:\php\ext。
Note:
如果启动web服务器的时候发生了类似下面这样的错误"Unable to load dynamic library './php_mysqli.dll'", 这就是因为在系统中无法找到php_mysqli.dll或者libmysql.dll。
PHP 5.3.0+
在windows上,对于PHP 5.3或更新版本,mysqli扩展默认开启并使用Mysql Native Driver。 这就是说你不需要担心关于访问libmysql.dll的配置。
In Windows 10 if mysqli is not working in PHP 7.3 you should add PHP directory to the PATH and restart your web server. This behavior was not there in PHP 7.0.27.
Just to note with regards to SSL and compression. MySQLnd and thus extensions using mysqlnd such as mysqli... now supports SSL and compression. Both have been supported inside mysqlnd since PHP 5.3.3 - http://www.php.net/manual/en/mysqlnd.overview.php
>On Windows, PHP is most commonly installed using the binary installer. Once PHP has been installed, some >configuration is required to enable mysqli and specify the client library you want it to use. Basically, if you want to add extensions you can double-click again on the installer file. The installer will find the already installed PHP and will ask if you want to change the installation. When you go through the prompts it will take you back to the list of extensions and you can pick which extensions you want to add. For the mysqli extension the installer also edited php.ini so that the extension was enabled: [PHP_MYSQLI] extension=php_mysqli.dll the installer added those lines to the end of the file.
I kept getting configure errors: /tmp/cc4f2PKd.o: In function `main': /usr/src/php-5.3.0/configure:14287: undefined reference to `yp_get_default_domain' collect2: ld returned 1 exit status configure: failed program was: #line 14270 "configure" #include "confdefs.h" The solution was to configure with mysql native driver as outlined on this page.
On CentOS 6 php-mysqli has been already incorporated into the php-mysql RPM package.
运行时配置
这些函数的行为受php.ini中的设置影响。
名字 | 默认 | 可修改范围 | 更新日志 |
---|---|---|---|
mysqli.allow_local_infile | "1" | PHP_INI_SYSTEM | 自PHP 5.2.4起可用。 |
mysqli.allow_persistent | "1" | PHP_INI_SYSTEM | 自PHP 5.3.0起可用。 |
mysqli.max_persistent | "-1" | PHP_INI_SYSTEM | 自PHP 5.3.0起可用。 |
mysqli.max_links | "-1" | PHP_INI_SYSTEM | 自PHP 5.0.0起可用。 |
mysqli.default_port | "3306" | PHP_INI_ALL | 自PHP 5.0.0起可用。 |
mysqli.default_socket | NULL | PHP_INI_ALL | 自PHP 5.0.0起可用。 |
mysqli.default_host | NULL | PHP_INI_ALL | 自PHP 5.0.0起可用。 |
mysqli.default_user | NULL | PHP_INI_ALL | 自PHP 5.0.0起可用。 |
mysqli.default_pw | NULL | PHP_INI_ALL | 自PHP 5.0.0起可用。 |
mysqli.reconnect | "0" | PHP_INI_SYSTEM | 自PHP 4.3.5起可用。 |
mysqli.rollback_on_cached_plink | TRUE | PHP_INI_SYSTEM | 自 PHP 5.6.0 起可用。 |
mysqli 扩展和持久化连接
从 PHP 5.3mysqli扩展开始支持持久化连接。 持久化连接已经在 PDO MYSQL 和 ext/mysql 中提供支持。 持久化连接的目的在于重用客户端到服务器之间的连接, 而不是每次在需要的时候都重新建立一个连接。 由于持久化连接可以将已经建立的连接缓存起来,以备后续的使用, 所以省去了建立新的连接的开销, 因此可以带来性能上的提升。
不像 mysql 扩展,mysqli 没有提供一个特殊的方法用于打开持久化连接。 需要打开一个持久化连接时,你必须在 连接时在主机名前增加p:。
使用持久化连接也会存在一些风险, 因为在缓存中的连接可能处于一种不可预测的状态。 例如,如果客户端未能正常关闭连接, 可能在这个连接上残留了对库表的锁, 那么当这个连接被其他请求重用的时候,这个连接还是处于 有锁的状态
。 所以,如果要很好的使用持久化连接,那么要求代码在和数据库进行交互的时候, 确保做好清理工作,保证被缓存的连接是一个干净的,没有残留的状态。
mysqli扩展的持久化连接提供了内建的清理处理代码。mysqli所做的清理工作包括:
回滚处于活动状态的事务
关闭并且删除临时表
对表解锁
重置会话变量
关闭预编译 SQL 语句(在PHP中经常发生)
关闭处理程序
释放通过 GET_LOCK() 获得的锁
这确保了将连接返回到连接池的时候, 它处于一种“干净”的状态,可以被其他客户端进程所使用。
mysqli扩展 通过自动调用 C-API 函数mysql_change_user()来完成这个清理工作。
自动清理的特性有优点也有缺点。 优点是程序员不再需要担心附加的清理代码, 因为它们会自动调用。 然而缺点就是 性能可能会慢一点, 因为每次从连接池返回一个连接都需要执行这些清理代码。
这个自动清理的代码可以通过在编译 php 时定义 MYSQLI_NO_CHANGE_USER_ON_PCONNECT
来关闭。
Note:
mysqli扩展在使用 MySQL Native Driver 或 Mysql Client Library(libmysql)时都支持持久化连接。
MySQLi 扩展的功能概述
mysqli 类 | |||
---|---|---|---|
面向对象接口 | 面向过程接口 | 别名 (勿使用) | 描述 |
属性 | |||
$mysqli::affected_rows | mysqli_affected_rows() | N/A | 获取上次 Mysql 操作受影响的行数 |
$mysqli::client_info | mysqli_get_client_info() | N/A | 返回 Mysql 客户端版本信息,类型为 string |
$mysqli::client_version | mysqli_get_client_version() | N/A | 返回 Mysql 客户端版本信息,类型为 integer |
$mysqli::connect_errno | mysqli_connect_errno() | N/A | 返回最后一次连接数据库的错误代码 |
$mysqli::connect_error | mysqli_connect_error() | N/A | 返回最后一次连接数据库的错误描述,类型为字符串 |
$mysqli::errno | mysqli_errno() | N/A | 返回最近一次函数调用所产生的错误代码 |
$mysqli::error | mysqli_error() | N/A | 返回最近一次错误代码的描述,类型是字符串 |
$mysqli::field_count | mysqli_field_count() | N/A | 返回最近一次查询中,包含的列的数量 |
$mysqli::host_info | mysqli_get_host_info() | N/A | 返回字符串,表示数据库连接所使用的类型 |
$mysqli::protocol_version | mysqli_get_proto_info() | N/A | 返回使用的 MySQL 协议的版本信息 |
$mysqli::server_info | mysqli_get_server_info() | N/A | 返回 MySQL 服务器的版本 |
$mysqli::server_version | mysqli_get_server_version() | N/A | 返回 MySQL 服务器的版本,类型为 integer |
$mysqli::info | mysqli_info() | N/A | 获取最近一次数据库查询的信息 |
$mysqli::insert_id | mysqli_insert_id() | N/A | 返回上次查询中所使用的自动生成的 ID |
$mysqli::sqlstate | mysqli_sqlstate() | N/A | 返回上次 MySQL 操作的数据库状态错误(SQLSTATE error) |
$mysqli::warning_count | mysqli_warning_count() | N/A | 根据数据库链接,返回最后一次数据库查询内警告的数量 |
Methods | |||
mysqli::autocommit() | mysqli_autocommit() | N/A | 打开或关闭数据库的自动提交(auto-committing)功能 |
mysqli::change_user() | mysqli_change_user() | N/A | 更改指定数据库连接所使用的用户 |
mysqli::character_set_name(), mysqli::client_encoding | mysqli_character_set_name() | mysqli_client_encoding() | 返回数据库连接的默认字符集 |
mysqli::close() | mysqli_close() | N/A | 关闭先前打开的数据库连接 |
mysqli::commit() | mysqli_commit() | N/A | 提交当前的数据库事务 |
mysqli::__construct() | mysqli_connect() | N/A | 打开新连接到 MySQL 服务器[注意:静态方法] |
mysqli::debug() | mysqli_debug() | N/A | 执行调试操作 |
mysqli::dump_debug_info() | mysqli_dump_debug_info() | N/A | 将调试信息转储到日志中 |
mysqli::get_charset() | mysqli_get_charset() | N/A | 返回包含字符集信息的对象 |
mysqli::get_connection_stats() | mysqli_get_connection_stats() | N/A | 返回客户端连接的统计信息。仅可用于 mysqlnd。 |
mysqli::get_client_info() | mysqli_get_client_info() | N/A | 返回 MySQL 客户端版本的字符串信息 |
mysqli::get_client_stats() | mysqli_get_client_stats() | N/A | 返回每个客户端进程的统计信息。 仅可用于 mysqlnd。 |
mysqli::get_cache_stats() | mysqli_get_cache_stats() | N/A | 返回客户端的 Zval 缓存统计信息。 仅可用于 mysqlnd。 |
mysqli::get_server_info() | mysqli_get_server_info() | N/A | 返回 MySQLi 连接上的 MySQL 服务器的版本字符串 |
mysqli::get_warnings() | mysqli_get_warnings() | N/A | 文档暂缺 |
mysqli::init() | mysqli_init() | N/A | 初始化 MySQLi,返回资源类型的值,可供 mysqli_real_connect 使用。 [不要在对象上调用,它返回了 $mysqli 对象] |
mysqli::kill() | mysqli_kill() | N/A | 请求服务器杀死一个 MySQL 线程 |
mysqli::more_results() | mysqli_more_results() | N/A | 检查多语句查询内是否还有更多查询结果 |
mysqli::multi_query() | mysqli_multi_query() | N/A | 在数据库内执行多语句查询 |
mysqli::next_result() | mysqli_next_result() | N/A | 从 multi_query 中准备下一个结果集 |
mysqli::options() | mysqli_options() | mysqli_set_opt() | 设置选项 |
mysqli::ping() | mysqli_ping() | N/A | Ping 服务器链接,如果链接已经断开,尝试重连 |
mysqli::prepare() | mysqli_prepare() | N/A | 准备(prepare)需要执行的 SQL 语句 |
mysqli::query() | mysqli_query() | N/A | 在数据库内执行查询 |
mysqli::real_connect() | mysqli_real_connect() | N/A | 打开一个 MySQL 服务端的连接 |
mysqli::real_escape_string(), mysqli::escape_string() | mysqli_real_escape_string() | mysqli_escape_string() | 转义特殊字符,用于 SQL 语句,该转换会考虑连接中当前的字符集 |
mysqli::real_query() | mysqli_real_query() | N/A | 执行 SQL 查询 |
mysqli::refresh() | mysqli_refresh() | N/A | 刷新表或缓存,或重置复制(replication)服务器信息 |
mysqli::rollback() | mysqli_rollback() | N/A | 回滚当前事务 |
mysqli::select_db() | mysqli_select_db() | N/A | 为数据库查询设置默认数据库 |
mysqli::set_charset() | mysqli_set_charset() | N/A | 设置默认的客户端字符集 |
mysqli::set_local_infile_default() | mysqli_set_local_infile_default() | N/A | 清除用户设置的 load data local infile 命令的处理程序 |
mysqli::set_local_infile_handler() | mysqli_set_local_infile_handler() | N/A | 设置 LOAD DATA LOCAL INFILE 命令执行的回调函数 |
mysqli::ssl_set() | mysqli_ssl_set() | N/A | 使用 SSL 建立安全连接 |
mysqli::stat() | mysqli_stat() | N/A | 获取当前系统状态 |
mysqli::stmt_init() | mysqli_stmt_init() | N/A | 初始化语句并且返回供 mysqli_stmt_prepare 使用的对象 |
mysqli::store_result() | mysqli_store_result() | N/A | 传输最后一个查询的结果集 |
mysqli::thread_id() | mysqli_thread_id() | N/A | 返回当前连接的线程ID |
mysqli::thread_safe() | mysqli_thread_safe() | N/A | 返回是否设定了线程安全 |
mysqli::use_result() | mysqli_use_result() | N/A | 初始化一个结果集的取回 |
MySQL_STMT | |||
---|---|---|---|
面向对象接口 | 面向过程接口 | 别名 (勿使用) | 描述 |
属性 | |||
$mysqli_stmt::affected_rows | mysqli_stmt_affected_rows() | N/A | 返回受上次执行语句影响的总行数:修改、删除或插入 |
$mysqli_stmt::errno | mysqli_stmt_errno() | N/A | 返回最近一次语句调用的错误代码 |
$mysqli_stmt::error | mysqli_stmt_error() | N/A | 返回最后一条语句错误的字符串描述 |
$mysqli_stmt::field_count | mysqli_stmt_field_count() | N/A | 返回语句内的字段数量 - 文档暂缺 |
$mysqli_stmt::insert_id | mysqli_stmt_insert_id() | N/A | 获取上次 INSERT 操作生成的ID |
$mysqli_stmt::num_rows | mysqli_stmt_num_rows() | N/A | 返回语句结果集中的行数 |
$mysqli_stmt::param_count | mysqli_stmt_param_count() | mysqli_param_count() | 返回语句中参数的数量 |
$mysqli_stmt::sqlstate | mysqli_stmt_sqlstate() | N/A | 返回上次执行 SQL 语句的 SQLSTATE 错误代码 |
方法 | |||
mysqli_stmt::attr_get() | mysqli_stmt_attr_get() | N/A | 用于获取语句属性的当前值 |
mysqli_stmt::attr_set() | mysqli_stmt_attr_set() | N/A | 用于修改 prepared 语句的行为 |
mysqli_stmt::bind_param() | mysqli_stmt_bind_param() | mysqli_bind_param() | 绑定变量参数到 prepared 语句 |
mysqli_stmt::bind_result() | mysqli_stmt_bind_result() | mysqli_bind_result() | 绑定变量参数到 prepared 语句,用于结果存储 |
mysqli_stmt::close() | mysqli_stmt_close() | N/A | 关闭 prepared 语句 |
mysqli_stmt::data_seek() | mysqli_stmt_data_seek() | N/A | 定位到结果集中的任意行 |
mysqli_stmt::execute() | mysqli_stmt_execute() | mysqli_execute() | 执行 prepared 查询 |
mysqli_stmt::fetch() | mysqli_stmt_fetch() | mysqli_fetch() | 获取 prepared 语句中的结果,到指定变量中 |
mysqli_stmt::free_result() | mysqli_stmt_free_result() | N/A | 释放给定语句处理存储的结果集所占内存 |
mysqli_stmt::get_result() | mysqli_stmt_get_result() | N/A | 获取 prepared 语句中的结果。 仅可用于 mysqlnd。 |
mysqli_stmt::get_warnings() | mysqli_stmt_get_warnings() | N/A | 暂无文档 |
mysqli_stmt::more_results() | mysqli_stmt_more_results() | N/A | 检查多语句查询中是否还有更多结果 |
mysqli_stmt::next_result() | mysqli_stmt_next_result() | N/A | 读取多语句查询中下一条结果 |
mysqli_stmt::num_rows() | mysqli_stmt_num_rows() | N/A | 参见 $mysqli_stmt::num_rows 中的属性 |
mysqli_stmt::prepare() | mysqli_stmt_prepare() | N/A | 准备执行 SQL 语句 |
mysqli_stmt::reset() | mysqli_stmt_reset() | N/A | 重置 prepare 语句 |
mysqli_stmt::result_metadata() | mysqli_stmt_result_metadata() | mysqli_get_metadata() | 返回 prepare 语句结果集内的元数据 |
mysqli_stmt::send_long_data() | mysqli_stmt_send_long_data() | mysqli_send_long_data() | 以块形式发送数据 |
mysqli_stmt::store_result() | mysqli_stmt_store_result() | N/A | 从 prepare 语句中传输储存结果集 |
mysqli_result | |||
---|---|---|---|
面向对象接口 | 面向过程接口 | 别名 (勿使用) | 描述 |
属性 | |||
$mysqli_result::current_field | mysqli_field_tell() | N/A | 获取当前字段在结果集指针中的开始位置 |
$mysqli_result::field_count | mysqli_num_fields() | N/A | 获取结果中字段数量 |
$mysqli_result::lengths | mysqli_fetch_lengths() | N/A | 返回结果集中当前行的列长度 |
$mysqli_result::num_rows | mysqli_num_rows() | N/A | 获取结果中行的数量 |
方法 | |||
mysqli_result::data_seek() | mysqli_data_seek() | N/A | 将结果中的结果指针调整到任意行 |
mysqli_result::fetch_all() | mysqli_fetch_all() | N/A | 抓取所有的结果行并且以关联数据,数值索引数组,或者两者皆有的方式返回结果集。 仅可用于 mysqlnd。 |
mysqli_result::fetch_array() | mysqli_fetch_array() | N/A | 以一个关联数组,数值索引数组,或者两者皆有的方式抓取一行结果 |
mysqli_result::fetch_assoc() | mysqli_fetch_assoc() | N/A | 以一个关联数组方式抓取一行结果 |
mysqli_result::fetch_field_direct() | mysqli_fetch_field_direct() | N/A | 抓取一个单字段的元数据 |
mysqli_result::fetch_field() | mysqli_fetch_field() | N/A | 返回结果集中的下一个字段 |
mysqli_result::fetch_fields() | mysqli_fetch_fields() | N/A | 返回一个代表结果集字段的对象数组 |
mysqli_result::fetch_object() | mysqli_fetch_object() | N/A | 以一个对象的方式返回一个结果集中的当前行 |
mysqli_result::fetch_row() | mysqli_fetch_row() | N/A | 以一个枚举数组方式返回一行结果 |
mysqli_result::field_seek() | mysqli_field_seek() | N/A | 设置结果指针到特定的字段开始位置 |
mysqli_result::free(), mysqli_result::close, mysqli_result::free_result | mysqli_free_result() | N/A | 释放与一个结果集相关的内存 |
MySQL_Driver | |||
---|---|---|---|
面向对象接口 | 面向过程接口 | 别名 (勿使用) | 描述 |
属性 | |||
N/A | |||
方法 | |||
mysqli_driver::embedded_server_end() | mysqli_embedded_server_end() | N/A | 文档暂缺 |
mysqli_driver::embedded_server_start() | mysqli_embedded_server_start() | N/A | 文档暂缺 |
Note:
提供函数的别名,目的仅为向下兼容。不要在新项目中使用!