mysqli 预处理详解
2016-04-20 15:16
609 查看
预处理语句及绑定参数
预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。预处理语句的工作原理如下:
预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出
执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。
原理图:
相比于直接执行SQL语句,预处理语句有两个主要优点:
预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)
绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句
预处理语句针对SQL注入是非常有用的,因为 参数值发送后使用不同的协议,保证了数据的合法性。
实例:
<?php $servername = "localhost"; $username = "root"; $password = "111111"; $dbname = "test"; // 创建连接 $mysqli = new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($mysqli->connect_error) { die("Connection failed: " . $mysqli->connect_error); } // 创建预编译对象 $stmt = $mysqli->prepare("INSERT INTO test (id, name) VALUES(?, ?)"); //参数绑定->给?号赋值 这里类型和顺序要一致,类型、赋值和??的顺序要一致 //参数有以下四种类型: //i - integer(整型) //d - double(双精度浮点型) //s - string(字符串) //b - BLOB(binary large object:二进制大对象) $stmt->bind_param("is", $id, $name); // 设置参数 $id = "1"; $name = "Doe"; // 执行 $stmt->execute(); $id = "2"; $name = "asd"; $stmt->execute(); $id = "3"; $name = "gfh"; $stmt->execute(); //关闭预编译 $stmt->close(); //关闭数据库连接 $mysqli->close(); ?>
mysqli_stmt 类说明:
如下所示,创建预编译(mysqli_stmt )对象
$stmt
$stmt = $mysqli->prepare($sql);
mysqli_stmt 属性:
1、int $stmt->affected_rows;
返回上次sql语句执行所影响的行数
2、int $stmt->errno;
返回最近执行的sql语句的错误代码
3、array $stmt->error_list;
最近调用函数的错误列表。每个错误都是一个带有
errno(错误代码)、error(错误文本)和 sqlstate 的关联数组
4、string $stmt->error;
5、int $stmt->field_count;
返回给定语句查询结果集的字段数目
6、int $stmt->insert_id;
获取从先前插入操作生成的标识id
7、int $stmt->num_rows;
返回语句结果集中的行数
8、int $stmt->param_count;
返回执行的sql语句的参数个数
9、string $stmt->sqlstate;
mysqli_stmt
方法:
int mysqli_stmt::attr_get ( int
$attr)
bool mysqli_stmt::attr_set ( int
$attr, int
$mode)
bool mysqli_stmt::bind_param ( string
$types, mixed
&$var1[, mixed
&$...]
)
bool mysqli_stmt::bind_result ( mixed
&$var1[, mixed
&$...]
)
bool mysqli_stmt::close ( void )
void mysqli_stmt::data_seek ( int
$offset)
bool mysqli_stmt::execute ( void )
bool mysqli_stmt::fetch ( void )
void mysqli_stmt::free_result ( void )
mysqli_result mysqli_stmt::get_result ( void )
object mysqli_stmt::get_warnings ( mysqli_stmt
$stmt)
public bool mysqli_stmt::more_results ( void )
public bool mysqli_stmt::next_result ( void )
mixed mysqli_stmt::prepare ( string
$query)
bool mysqli_stmt::reset ( void )
mysqli_result mysqli_stmt::result_metadata ( void )
bool mysqli_stmt::send_long_data ( int
$param_nr, string
$data)
bool mysqli_stmt::store_result ( void )
相关文章推荐
- 解决MySQL Sending data导致查询很慢问题的方法与思路
- MySQL(一)
- 如何恢复MySQL主从数据一致性
- mysql不能启动:Unit mysql.service failed to load: No such file or directory的解决办法
- yum安装mysql,迅速上手
- jsp-MySQL连接池
- host ... is not allowed to connect to this MySql server 开放mysql远程连接
- MySQL 读写分离介绍及搭建
- MySQL 读写分离介绍及搭建
- 快速实现MySQL的部署以及一机多实例部署
- 查询分析mysqldumpslow
- MySQL的root密码忘记怎么办 修改root密码的方式
- mysql表大小写问题
- mysql 数据库备份
- mysql 存储过程
- Mysql 优化
- Mac下忘记MySQL初始密码导致Navicat连接失败的解决方法
- Mac下忘记MySQL初始密码导致Navicat连接失败的解决方法
- mysql开启慢查询日志及查询--windows
- mysql之判断数据存在