mysqli 预处理

应用环境 mysqli预处理功能(大量数据处理时使用)
步骤  
a)mysqli链接数据库 $conn= new mysqli('localhost','root','123456','apple');
b)设置编码 $conn->set_charset('utf8');
c)发送query语句

使用$conn->prepare($sql)这个方法表示是预处理,若是涉及到取值,必须指定查询字段php

$sql = "select * from product_info where product_id=?";html

$stmt = $conn->prepare($sql);mysql

d)提供条件

好比上句用了?做为不肯定的值,就须要指定sql

$stmt->bind_param('i',$product_id);        用变量绑定?表示的值,i表示整型,d表示浮点型,b表明二进制,s表明其它的全部数据库

  1. //参数绑定->给?号赋值 这里类型和顺序要一致,类型、赋值和??的顺序要一致  
  2. //参数有如下四种类型:  
  3. //i - integer(整型)  
  4. //d - double(双精度浮点型)  
  5. //s - string(字符串)  
  6. //b - BLOB(binary large object:二进制大对象)  

$product_id=$_GET['product_id'];           指定变量的值安全

 

e)绑定结果格式并执行

$stmt->bind_result($product_id,$product_info,$product_trans,$product_price);   绑定结果格式服务器

$stmt->execute();                发送变量,此时服务器的语句已经完整了app

 f)从sql服务器中取回结果  

预处理语句会将结果集保存在sql开辟的内存中,php开辟的内存没法直接使用(count是php函数,不是sql函数,没法直接与sql内存交互),默认状况是每次执行fetch()会从sql内存中取出一行,可是不使用store_result()就没法获取行数.固然若是你的结果只有一行,能够无视这一句.请记住:在mysqli预处理中取出数据,只能使用fetch()这是由于mysqli_stmt类并无其它取值方法函数

$stmt->store_result();     //若是用变量接收的话,会发现成功了显示1,不然显示0(因此用变量接受的值并非结果集)fetch

 g)获取结果集行数  $count = $stmt->num_rows();
 h)输出结果
while($field=$result->fetch_field()){
echo $field->name."--"; //输出数据库字段信息
}
while($stmt->fetch()){
echo "$product_id--$product_info--$product_trans--$product_price"; //输出取出数据信息
}

前面说了,既然要取值,固然前面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/

搭配食用更佳哦 

相关文章
相关标签/搜索