使用mysqli_prepare的好处就是,防止注入
原理大致上就是,在执行mysqli_prepare的时候,产生了一个协议(函数),bind_parms和execute相当于把值作为参数送入这个函数,所以无论如何都无法改变代码的结构,就不会有注入产生。

看了看网上关于这个资料还挺少的,不少人竟然用if语句来判断参数封装。简直了。
AND 有时候我们要改数据结构,如果绑定结果集会有不小的麻烦,我这里把结果转为了普通mysqli结果集

请注意:mysqli_stmt_get_result 要求mysqli使用mysqlnd的驱动
不喜欢在PHP上用OOP,所以给出的是Procedural style的代码。

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);
}

maozhenyu
125 声望1 粉丝