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