您的位置:首页 > 数据库 > MySQL

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 )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: