mysqli 预处理详解

预处理语句及绑定参数

预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。

预处理语句的工作原理如下:

  1. 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
  2. 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出
  3. 执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。
原理图:

相比于直接执行SQL语句,预处理语句有两个主要优点:

  • 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)
  • 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句
  • 预处理语句针对SQL注入是非常有用的,因为 参数值发送后使用不同的协议,保证了数据的合法性。

实例:

//创建mysqli对象方式   
$mysqli = @new mysqli('127.0.0.1', 'root', '', 'test');  
  
//只能用函数来判断是否连接成功  
if(mysqli_connect_errno())  
{  
    echo mysqli_connect_error();  
    die;  
}  
  
$mysqli->set_charset('utf8');  
  
$sql = "insert into limove values(?, ?, ?)"; //语句一样值不相同情况  
  
/*  
//获取stmt对象  
$stmt = $mysqli->stmt_init();  
  
//准备一条sql语句,放到服务器端  
$stmt->prepare($sql);  
*/  
  
//mysqli中有直接的方法可用  
$stmt = $mysqli->prepare($sql);  
  
//绑定参数  
$stmt->bind_param('iss', $id, $name, $order); //iss表示类型是Int,string,string  
  
for($i=0;$i<5;$i++){  
    $id = 0;  
    $name = 'name';  
    $order = mt_rand(1, 1000);  
    $stmt->execute();  
  
}  
  
//最后id  
ee($stmt->insert_id);  
  
//影响的行数 注:最后一条执行的  
ee($stmt->affected_rows);  
  
//错误号  
ee($stmt->errno);  
  
//错误信息  
ee($stmt->error);  
  
//stmt对象中可以看到更多的信息  
ee($stmt);  
  
eee($mysqli);  
//创建mysqli对象方式   
$mysqli = @new mysqli('127.0.0.1', 'root', '', 'test');  
  
//只能用函数来判断是否连接成功  
if(mysqli_connect_errno())  
{  
    echo mysqli_connect_error();  
    die;  
}  
  
$mysqli->set_charset('utf8');  
  
$sql = "select * from limove where id<?";  
$stmt = $mysqli->prepare($sql);  
  
$stmt->bind_param('i', $i);  
$stmt->bind_result($a, $b, $c);  
  
$i=40;  
$stmt->execute();  
  
//把结果都取过来  
$stmt->store_result();  
  
//获取字段信息  
$result = $stmt->result_metadata();//只能获取一些字段信息  
while($field = $result->fetch_field())  
{  
    ee($field->name);  
}  
  
//$stmt->data_seek(2); //移动指针的位置,只有执行 store_result 后才能生效  
  
while($stmt->fetch()){  
    ee("{$a}|{$b}|{$c}");  
}  
  
//记录的条数 ,只有执行 store_result 后才能生效  
ee($stmt->num_rows);  
ee($stmt);  
$stmt->free_result();  
$stmt->close();  



发布了86 篇原创文章 · 获赞 70 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/wuxing26jiayou/article/details/80037444
今日推荐