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