封装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);
}
相关文章
相关标签/搜索