應用環境 | 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表明其它的全部數據庫
$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()){ 前面說了,既然要取值,固然前面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/
搭配食用更佳哦