應用環境 | 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是一個持久連接,需要手動關閉。