mysqli 預處理詳解
阿新 • • 發佈:2019-02-14
預處理語句及繫結引數
預處理語句用於執行多個相同的 SQL 語句,並且執行效率更高。
預處理語句的工作原理如下:
- 預處理:建立 SQL 語句模板併發送到資料庫。預留的值使用引數 "?" 標記 。例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
- 資料庫解析,編譯,對SQL語句模板執行查詢優化,並存儲結果不輸出
- 執行:最後,將應用繫結的值傳遞給引數("?" 標記),資料庫執行語句。應用可以多次執行語句,如果引數的值不一樣。
相比於直接執行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();