mysqli函式庫支援prepared語句的使用。它們對於在執行大量具有不同資料的相同查詢時,可以提高執行速度。它們也可以免受sql注射風格(injection-style)的攻擊。
prepared語句的基本思想是可以向mysql傳送乙個需要執行的查詢模板,然後再單獨傳送資料。我們可以向相同的prepared語句傳送大量的相同資料;這個特性對批量處理的插入操作來說是非常有用的。
例如乙個插入操作,可以使用prepared語句,如下所示:
$query = "insert into books values(?,?,?,?)";
$stmt = $db->prepare($query);
$stmt->bind_param("sssd",$isbn,$author,$title,$price);
$stmt->execute();
echo $stmt->affected_rows.' book inserted into database.';
$stmt->close();
下面,我們逐行分析以上**。
當設定查詢時,不是替換前面已經生成的變數,而是在每一段資料的位置設定問號。在這些問號的周圍,不能再設定問號或其他分界符號。
第二行是呼叫 $db->prepare(),在過程版本中,是通過mysqli_stmt_prepare()函式實現的。這一行將構建乙個語句物件或需要用來完成實際處理的資源。
語句物件有乙個bind_param()方法。(在過程版本中,是mysqli_stmt_bind_param()函式)。
bind_param()的用途是告訴php那些變數應該被問號所替換。第乙個引數是乙個格式化字串,與printf()使用的格式化字串不同。在這裡,所傳遞的值意味著4個引數分別是字串、字串、字串和雙精度。格式化字串中的其他字元還有:i表示整數,b表示blob。在這個引數之後,必須列出與語句中的問號數量相同的變數。他們將依次被替換。
呼叫$stmt->execute()函式(在過程版本中是mysqli_stmt_execute()函式)將真正執行這個查詢。我們可以訪問受影響的行數並關閉這個語句。
那麼prepared語句的作用如何呢?這裡,乙個優點是可以改變著4個繫結變數的值,並且在不用準備的情況下重新執行這個語句。這個功能對於迴圈執行批量插入操作來說是非常有用的。
與繫結引數一樣,也可以繫結結果。對於select型別查詢,可以使用stmt->bind_result()函式(或mysqli_stmt_bind_result()函式)提供希望填充結果列的變數列表。每次呼叫$stmt->fetch()函式(或者mysqli_stmt_fetch()函式)時,結果集下一行的列值將被填充到這些繫結變數中。例如,在前面介紹的圖書搜尋指令碼中,可以使用:
$stmt->bind_result($isbn,$author,$title,$price);
將這四個變數繫結到將通過返回的4列。在呼叫如下語句後:
$stmt->execute();
可以在迴圈中呼叫:
$stmt->fetch();
mysqli的prepare準備語句使用教程
mysqli對prepare的支援對於大訪問量的 是很有好處的,它極大地降低了系統開銷,而且保證了建立查詢的穩定性和安全性。prepare準備語句分為繫結引數和繫結結果,下面將會一一介紹 1 繫結引數 看下面php php 建立連線 mysqli new mysqli localhost root ...
使用mysqli訪問資料
23.5.3 使用mysqli訪問資料 使用mysqli訪問資料也包括物件導向和面向過程兩種方式,在本節我們只討論如何使用物件導向的方式來與mysql互動,關於mysqli擴充套件中使用面向過程方式這裡就不再詳細介紹了,有興趣的讀者可參考官方文件來獲取相關的資料。在mysqli中,執行查詢使用que...
MySQLi擴充套件的使用
1.連線資料庫 mysqli擴充套件為php與資料庫的連線提供了mysqli connect 函式 mysqli mysqli connect string host ini get mysqli.default host 主機名或ip string username ini get mysqli....