1. 程式人生 > >mysqli 預處理詳解

mysqli 預處理詳解

預處理語句及繫結引數

預處理語句用於執行多個相同的 SQL 語句,並且執行效率更高。

預處理語句的工作原理如下:

  1. 預處理:建立 SQL 語句模板併發送到資料庫。預留的值使用引數 "?" 標記 。例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
  2. 資料庫解析,編譯,對SQL語句模板執行查詢優化,並存儲結果不輸出
  3. 執行:最後,將應用繫結的值傳遞給引數("?" 標記),資料庫執行語句。應用可以多次執行語句,如果引數的值不一樣。
原理圖:

相比於直接執行SQL語句,預處理語句有兩個主要優點:

  • 預處理語句大大減少了分析時間,只做了一次查詢(雖然語句多次執行)
  • 繫結引數減少了伺服器頻寬,你只需要傳送查詢的引數,而不是整個語句
  • 預處理語句針對SQL注入是非常有用的,因為 引數值傳送後使用不同的協議,保證了資料的合法性。

例項:

//建立mysqli物件方式   
$mysqli = @new mysqli('127.0.0.1', 'root', '', 'test');  
  
//只能用函式來判斷是否連線成功  
if(mysqli_connect_errno())  
{  
    echo mysqli_connect_error();  
    die;  
}  
  
$mysqli->set_charset('utf8');  
  
$sql = "insert into limove values(?, ?, ?)"; //語句一樣值不相同情況  
  
/*  
//獲取stmt物件  
$stmt = $mysqli->stmt_init();  
  
//準備一條sql語句,放到伺服器端  
$stmt->prepare($sql);  
*/  
  
//mysqli中有直接的方法可用  
$stmt = $mysqli->prepare($sql);  
  
//繫結引數  
$stmt->bind_param('iss', $id, $name, $order); //iss表示型別是Int,string,string  
  
for($i=0;$i<5;$i++){  
    $id = 0;  
    $name = 'name';  
    $order = mt_rand(1, 1000);  
    $stmt->execute();  
  
}  
  
//最後id  
ee($stmt->insert_id);  
  
//影響的行數 注:最後一條執行的  
ee($stmt->affected_rows);  
  
//錯誤號  
ee($stmt->errno);  
  
//錯誤資訊  
ee($stmt->error);  
  
//stmt物件中可以看到更多的資訊  
ee($stmt);  
  
eee($mysqli);  
//建立mysqli物件方式   
$mysqli = @new mysqli('127.0.0.1', 'root', '', 'test');  
  
//只能用函式來判斷是否連線成功  
if(mysqli_connect_errno())  
{  
    echo mysqli_connect_error();  
    die;  
}  
  
$mysqli->set_charset('utf8');  
  
$sql = "select * from limove where id<?";  
$stmt = $mysqli->prepare($sql);  
  
$stmt->bind_param('i', $i);  
$stmt->bind_result($a, $b, $c);  
  
$i=40;  
$stmt->execute();  
  
//把結果都取過來  
$stmt->store_result();  
  
//獲取欄位資訊  
$result = $stmt->result_metadata();//只能獲取一些欄位資訊  
while($field = $result->fetch_field())  
{  
    ee($field->name);  
}  
  
//$stmt->data_seek(2); //移動指標的位置,只有執行 store_result 後才能生效  
  
while($stmt->fetch()){  
    ee("{$a}|{$b}|{$c}");  
}  
  
//記錄的條數 ,只有執行 store_result 後才能生效  
ee($stmt->num_rows);  
ee($stmt);  
$stmt->free_result();  
$stmt->close();