[TOC] >[success]MySQL增强版扩展,MySQLi 函数允许您访问 MySQL 数据库服务器。MySQLi 扩展被设计用于 MySQL 4.1.13 版本或更新的版本,MySQLi提供面向过程和面向对象两种接口 ## 查看是否支持 通过phpinfo()查看是否成功加载 >[danger]注意:如果没加载,可以去php.ini看是否开启该扩展,如果前面有分号去掉。 注意:如果没有该扩展,百度"php mysqli扩展安装",有很多场景下的解决方案。 ## 操作mysql流程 1. 建立mysql联接 2. 发送查询SQL 3. 从结果集中取出数据 4. 释放资源 5. 关闭数据库连接 ## 面向对象风格使用mysqli ### 实例mysqli对象,建立连接 ~~~ $mysqli = @new mysqli("localhost", "my_user", "my_password", "world"); ~~~ 返回创建后的数据链接对象 ### 错误信息反馈(对象属性) ~~~ int $mysqli->connect_errno返回链接错误代码 string $mysqli->connect_error;返回链接错误文本 int $mysqli->errno返回最近函数调用的错误代码 string $mysqli->error;返回最近函数调用的错误文本 ~~~ ### 发送查询 ~~~ mixed $mysqli->query (string $query ) ~~~ 对数据库执行一次查询 ### 通过结果集取数据 ~~~ mysqli_result::fetch_row() ~~~ 取得一行以索引数组形式返回的数据 ~~~ mysqli_result::fetch_assoc() ~~~ 取得一行以关联数组形式返回的数据 ~~~ mysqli_result::fetch_object() ~~~ 取得一行以对象形式返回的数据 ~~~ mysqli_result::fetch_array($type) ~~~ 参数为返回结果的类型 参数:(MYSQLI_ASSOC 返回关联数组 MYSQLI_NUM 返回索引数组 MYSQLI_BOTH 返回关联不索引数组) ### 释放结果内存 ~~~ mysqli_result::free() ~~~ 从内存中释放结果集 ### 关闭链接 ~~~ mysqli::close() ~~~ 函数关闭非持久的 MySQL 连接。 ### 结果集数量 ~~~ mysqli_result::num_rows ~~~ ### 自增ID ~~~ mixed $mysqli->insert_id ~~~ ### 受影响数量 ~~~ int $mysqli->affected_rows; ~~~ ## MySQLi_STMT类(预准备) ### 预准备语句 每一条SQL的执行过程包括分析、编译、优化查询等操作,如果只是 SQL的参数不同而其他项一样,那么可以想象,数据库做了很多次重 复的分析、编译、优化操作,显然这种执行方式会降低效率。如果使 用预准备方式操作,这种分析、编译、优化的操作只需要执行一次, 以后只是参数的不同,这样效率会更快 先将SQL提交到MySQL服务器,预先解析,事后可以只传递参数到 MySQL服务器,减少解析次数、提高MySQL处理效率。 同时由于参数不是随着SQL一起发送到服务器端,所以屏蔽了SQL 注入等等的危险操作 ### 绑定参数 可以事先在预先解析的SQL上指定占位符?号来为后面传递的值预 留空间位,可以把?想象成函数的形参这样更好理解 ## 常用函数语法 ### 产生预准备对象 ~~~ mysqli_stmt mysqli::stmt_init ( void ) ~~~ 初始化一条语句并返回一个用于mysqli_stmt_prepare(调用)的对象 ~~~ mysqli_stmt mysqli::prepare ( $sql ) ~~~ ### 提交一个要执行的sql ~~~ mixed mysqli_stmt::prepare ( string $query ) ~~~ ### 绑定参数 ~~~ bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] ) ~~~ ### 执行预准备查询 ~~~ bool mysqli_stmt::execute ( void ) ~~~ ### 受影响数量 ~~~ int $mysqli_stmt->affected_rows ~~~ ### 错误代码 ~~~ int $mysqli_stmt->errno ~~~ ### 错误信息 ~~~ int $mysqli_stmt->errno ~~~ ### 最后插入的ID ~~~ int $mysqli_stmt->insert_id ~~~ **完整实例** ~~~ <?php $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world'); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } $stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)"); //?占位符 $stmt->bind_param('sssd', $code, $language, $official, $percent); //sssd,前三个是字符串,最后一个是小数 $code = 'DEU'; $language = 'Bavarian'; $official = "F"; $percent = 11.2; /* execute prepared statement */ $stmt->execute(); printf("%d Row inserted.\n", $stmt->affected_rows); /* close statement and connection */ $stmt->close(); /* Clean up table CountryLanguage */ $mysqli->query("DELETE FROM CountryLanguage WHERE Language='Bavarian'"); printf("%d Row deleted.\n", $mysqli->affected_rows); /* close connection */ $mysqli->close(); ?> ~~~ ## 绑定参数类型参考 <table class=""> <caption><strong>Type specification chars</strong></caption> <thead> <tr> <th>Character</th> <th>Description</th> </tr> </thead><tbody class="tbody"> <tr> <td>i</td> <td>corresponding variable has type integer</td> </tr><tr> <td>d</td> <td>corresponding variable has type double</td> </tr><tr> <td>s</td> <td>corresponding variable has type string</td> </tr><tr> <td>b</td> <td>corresponding variable is a blob and will be sent in packets</td> </tr></tbody></table>