• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 位置: php 中文手册 -> php 外部扩展库

    MySQLi数据库

    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程序位置。

    mysqli 编译时支持表
    PHP 版本默认配置选项: mysqlnd配置选项:libmysql更新日志
    5.0.x, 5.1.x, 5.2.xlibmysql不适用--with-mysqli=/path/to/mysql_config
    5.3.xlibmysql--with-mysqli=mysqlnd--with-mysqli=/path/to/mysql_configmysqlnd is now supported
    5.4.xmysqlnd--with-mysqli--with-mysqli=/path/to/mysql_configmysqlnd 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.iniphp_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配置选项
    名字默认可修改范围更新日志
    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_socketNULLPHP_INI_ALL自PHP 5.0.0起可用。
    mysqli.default_hostNULLPHP_INI_ALL自PHP 5.0.0起可用。
    mysqli.default_userNULLPHP_INI_ALL自PHP 5.0.0起可用。
    mysqli.default_pwNULLPHP_INI_ALL自PHP 5.0.0起可用。
    mysqli.reconnect"0"PHP_INI_SYSTEM自PHP 4.3.5起可用。
    mysqli.rollback_on_cached_plinkTRUEPHP_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 类
    面向对象接口面向过程接口别名 (勿使用)描述
    属性
    $mysqli::affected_rowsmysqli_affected_rows()N/A获取上次 Mysql 操作受影响的行数
    $mysqli::client_infomysqli_get_client_info()N/A返回 Mysql 客户端版本信息,类型为 string
    $mysqli::client_versionmysqli_get_client_version()N/A返回 Mysql 客户端版本信息,类型为 integer
    $mysqli::connect_errnomysqli_connect_errno()N/A返回最后一次连接数据库的错误代码
    $mysqli::connect_errormysqli_connect_error()N/A返回最后一次连接数据库的错误描述,类型为字符串
    $mysqli::errnomysqli_errno()N/A返回最近一次函数调用所产生的错误代码
    $mysqli::errormysqli_error()N/A返回最近一次错误代码的描述,类型是字符串
    $mysqli::field_countmysqli_field_count()N/A返回最近一次查询中,包含的列的数量
    $mysqli::host_infomysqli_get_host_info()N/A返回字符串,表示数据库连接所使用的类型
    $mysqli::protocol_versionmysqli_get_proto_info()N/A返回使用的 MySQL 协议的版本信息
    $mysqli::server_infomysqli_get_server_info()N/A返回 MySQL 服务器的版本
    $mysqli::server_versionmysqli_get_server_version()N/A返回 MySQL 服务器的版本,类型为 integer
    $mysqli::infomysqli_info()N/A获取最近一次数据库查询的信息
    $mysqli::insert_idmysqli_insert_id()N/A返回上次查询中所使用的自动生成的 ID
    $mysqli::sqlstatemysqli_sqlstate()N/A返回上次 MySQL 操作的数据库状态错误(SQLSTATE error)
    $mysqli::warning_countmysqli_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_encodingmysqli_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/APing 服务器链接,如果链接已经断开,尝试重连
    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初始化一个结果集的取回
    mysqli_stmt 的方法概述
    MySQL_STMT
    面向对象接口面向过程接口别名 (勿使用)描述
    属性
    $mysqli_stmt::affected_rowsmysqli_stmt_affected_rows()N/A返回受上次执行语句影响的总行数:修改、删除或插入
    $mysqli_stmt::errnomysqli_stmt_errno()N/A返回最近一次语句调用的错误代码
    $mysqli_stmt::errormysqli_stmt_error()N/A返回最后一条语句错误的字符串描述
    $mysqli_stmt::field_countmysqli_stmt_field_count()N/A返回语句内的字段数量 - 文档暂缺
    $mysqli_stmt::insert_idmysqli_stmt_insert_id()N/A获取上次 INSERT 操作生成的ID
    $mysqli_stmt::num_rowsmysqli_stmt_num_rows()N/A返回语句结果集中的行数
    $mysqli_stmt::param_countmysqli_stmt_param_count()mysqli_param_count()返回语句中参数的数量
    $mysqli_stmt::sqlstatemysqli_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
    面向对象接口面向过程接口别名 (勿使用)描述
    属性
    $mysqli_result::current_fieldmysqli_field_tell()N/A获取当前字段在结果集指针中的开始位置
    $mysqli_result::field_countmysqli_num_fields()N/A获取结果中字段数量
    $mysqli_result::lengthsmysqli_fetch_lengths()N/A返回结果集中当前行的列长度
    $mysqli_result::num_rowsmysqli_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_resultmysqli_free_result()N/A释放与一个结果集相关的内存
    mysqli_driver 的方法概述
    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:

    提供函数的别名,目的仅为向下兼容。不要在新项目中使用!