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/

搭配食用更佳哦 

相關文章
相關標籤/搜索