使用mysqli_prepare的好處就是,防止注入
原理大體上就是,在執行mysqli_prepare的時候,產生了一個協議(函數),bind_parms和execute至關於把值做爲參數送入這個函數,因此不管如何都沒法改變代碼的結構,就不會有注入產生。php
看了看網上關於這個資料還挺少的,很多人居然用if語句來判斷參數封裝。簡直了。
AND 有時候咱們要改數據結構,若是綁定結果集會有不小的麻煩,我這裏把結果轉爲了普通mysqli結果集mysql
請注意:mysqli_stmt_get_result 要求mysqli使用mysqlnd的驅動
不喜歡在PHP上用OOP,因此給出的是Procedural style的代碼。sql
function query($sql, $type, $data) { $stmt=mysqli_prepare($link,$sql); //這裏的link是mysqli_connect();得到的 array_unshift($data, $stmt, $type);//準備bind_param的參數,把stmt和type放在第一第二個 call_user_func_array("mysqli_stmt_bind_param",$data);//用這個解決多參數的無問題 if(!mysqli_stmt_execute($stmt)) { halt("MySQL Query Error:", $sql); //出錯的處理 } $result=mysqli_stmt_get_result($stmt);//這裏我返回了mysqli_result,能夠用其餘 mysqli_stmt_close($stmt); return $result; } function fetch($result) { return mysqli_fetch_array($result, MYSQLI_NUM); } function num_rows($result) { return mysqli_num_rows($result); } $myID=1; $myresult=query('SELECT * FROM my_table WHERE `id`=?','i',array(&$myID)); echo num_rows($myresult);//顯示結果記錄數 while($row=fetch($myresult)) { print_r($row); }