msqli 预处理 mysqli_stmt

mysqli_stmt预处理类(推荐使用)

跟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();

posted @ 2017-04-26 11:32  晨曦时丶梦见兮  阅读(326)  评论(0编辑  收藏  举报