mysqli 预处理
Posted 晨曦时丶梦见兮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysqli 预处理相关的知识,希望对你有一定的参考价值。
应用环境 | mysqli预处理功能(大量数据处理时使用) |
步骤 | |
a)mysqli连接数据库 | $conn= new mysqli(\'localhost\',\'root\',\'123456\',\'apple\'); |
b)设置编码 | $conn->set_charset(\'utf8\'); |
c)发送query语句 |
使用$conn->prepare($sql)这个方法表示是预处理,如果涉及到取值,必须指定查询字段 $sql = "select * from product_info where product_id=?"; $stmt = $conn->prepare($sql); |
d)提供条件 |
比如上句用了?作为不确定的值,就需要指定 $stmt->bind_param(\'i\',$product_id); 用变量绑定?表示的值,i表示整型,d表示浮点型,b代表二进制,s代表其它的所有
$product_id=$_GET[\'product_id\']; 指定变量的值
|
e)绑定结果格式并执行 |
$stmt->bind_result($product_id,$product_info,$product_trans,$product_price); 绑定结果格式 $stmt->execute(); 发送变量,此时服务器的语句已经完整了 |
f)从sql服务器中取回结果 |
预处理语句会将结果集保存在sql开辟的内存中,php开辟的内存无法直接使用(count是php函数,不是sql函数,无法直接与sql内存交互),默认情况是每次执行fetch()会从sql内存中取出一行,但是不使用store_result()就无法获取行数.当然如果你的结果只有一行,可以无视这一句.请记住:在mysqli预处理中取出数据,只能使用fetch()这是因为mysqli_stmt类并没有其它取值方法 $stmt->store_result(); //如果用变量接收的话,会发现成功了显示1,否则显示0(所以用变量接受的值并不是结果集) |
g)获取结果集行数 | $count = $stmt->num_rows(); |
h)输出结果 |
while($field=$result->fetch_field()){ 前面说了,既然要取值,当然前面query指定了查询字段,上句的变量用上了 |
i)关闭mysqli链接 |
$conn->close(); |
!!!!!!!!非常重要,如果一个php块中需要进行多次mysqli预处理语句,在前一个预处理结束后,必须要关闭前一个预处理,才能绑定后一个预处理语句,非常重要!!!否则报错:Fatal error: Call to a member function bind_param() on boolean
原因:mysqli是一个持久连接,需要手动关闭。
前篇转载自 http://www.cnblogs.com/lyf-blog/p/5728341.html
------------------------------------------------------------------------------------------------------ 华丽的分割线 ------------------------------------------------------------------------------------------
跟mysqli和mysqli_result相比:
1.此二者能完成的功能,都可以使用mysqli_stmt完成
2.效率高:如果执行多次相同的SQL语句,只是语句中的数据不同,因为将一条语句在服务器端准备好 ,然后将不同的值传给服务器,再让此语句执行
编译一次,使用多次
3.安全上:防SQL注入(?占位),后期传的值不会当成SQL语句
总的来说,安全,高效,所以推荐使用
<?php
//连接并创建一个stmt对象
$mysqli=new mysqli("localhost","root","snail","mysqldb");
/* 方法一
$stmt=$mysqli->stmt_init();
//准备好一条语句放到服务器中,如insert
$sql="insert into shop(name,price)values(?,?)";
$stmt->prepare($sql);
*/
//方法二:准备好一条语句放到服务器中,如insert,同时创建stmt对象
// $sql="insert into shop(name,price)values(?,?)";
$sql="update shop set name=?,price=? where id=?";
$stmt=$mysqli->prepare($sql);
//给每个占位符?传值(也叫参数绑定) i(整型) d(double) s(string) b(二进制,如图片、声音)
$stmt->bind_param("sdi",$name,$price,$id);
$name="zhangsan11111111";
$price=525.15;
$id=121;
$stmt->execute();
$name="zhangsa2222222";
$price=58.15;
$id=120;
$stmt->execute();
$name="zhangs786733333";
$price=88.15;
$id=119;
$stmt->execute();
echo "最后ID:".$stmt->insert_id."<br>";
echo "影响行数:".$stmt->affected_rows."<br>";
$stmt->close();
?>
处理有结果集的
<?php
//连接并创建一个stmt对象
$mysqli=new mysqli("localhost","root","snail","mysqldb");
$stmt=$mysqli->prepare("select id,name,price from shop where id>?");
$stmt->bind_param("i",$id);
$stmt->bind_result($id,$name,$price);
$id=120;
$stmt->execute();
$stmt->store_result(); //一次性将结果都取出来,然后就可以使用$stmt->data_seek();了
// $stmt->data_seek(2); //在返回的结果集中移动指针
//字段信息
$result=$stmt->result_metadata();
while($field=$result->fetch_field()){
echo $field->name."--";
}
echo "<br>";
while($stmt->fetch()){
echo "$id--$name--$price<br>";
}
echo "记录总数:".$stmt->num_rows;
$stmt->free_result();
$stmt->close();
?>
后篇转载自 http://blog.163.com/info_technology/blog/static/127815054201222135618224/
搭配食用更佳哦
以上是关于mysqli 预处理的主要内容,如果未能解决你的问题,请参考以下文章
报错提示:mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in..的处理方式