封裝mysqli_Prepare的query函數

使用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);
}
相關文章
相關標籤/搜索