天天看点

Mysqli 扩展库增强-----预处理技术 mysqli stmt

该方案防止sql注入

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_13841503954jm4.png"></a>

注意:这里只需建立一次连接,以后都是发数据即可!

案例1:利用简单预处理,往数据库中执行dml语句插入(更新,删除同种方法)信息:preparestatment.php

&lt;?php

//创建mysqli对象

$mysqli=new mysqli("localhost","root","123456","test");

//创建预编译对象

$sql="insert into user (name,password,email,age) values(?,?,?,?)";

$mysqli_stmt=$mysqli-&gt;prepare($sql) or die($mysqli-&gt;error);

$mysqli-&gt;query("set names utf8");

//绑定参数

$name="张三";

$password="zs";

$email="[email protected]";

$age=26;

//参数绑定-&gt;给?赋值,这里类型和顺序要一致!

$mysqli_stmt-&gt;bind_param("sssi",$name,$password,$email,$age);

$a=$mysqli_stmt-&gt;execute();

if(!$a){

die("操作失败".$mysqli_stmt-&gt;execute());

}else {

echo " 操作ok ";

}

//释放

$mysqli-&gt;close();

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_1384150396BO6k.png"></a>

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_1384150398pChD.png"></a>

用命令增加的新记录!成功!

如果继续添加,就不需要再执行$mysqli-&gt;prepare()了!

现在是只发数据,连接也没断开,这样效率会很高!

$a=$mysqli_stmt-&gt;execute();//每一个语句后面都要有一个执行语句!

//继续添加

$name="李四";

$password="ls";

$email="[email protected]";

$age="58";

$name="王五";

$password="ww";

$email="[email protected]";

$age="109";

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_1384150399uo3a.png"></a>

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_1384150400n4Iy.png"></a>

执行时,一次添加3条记录!

案例2:用预处理执行dql语句,查询id&gt;10的用户,如何预防sql注入

if(mysqli_connect_error()){

die (mysqli_connect_error());

$sql="select id,name,email from user where id&gt;?";

$id=10;

$mysqli_stmt-&gt;bind_param("i",$id);

//绑定结果集

$mysqli_stmt-&gt;bind_result($id,$name,$email);

//执行

$mysqli_stmt-&gt;execute();

//取出绑定的值

while($mysqli_stmt-&gt;fetch()){

echo "&lt;br/&gt;--$id--$name--$email---";

//关闭资源

//释放结果

$mysqli_stmt-&gt;free_result();

//关闭预编译语句

$mysqli_stmt-&gt;close();

//关闭链接

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_1384150401hftU.png"></a>

Id&gt;10的都列出来了!

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_13841504024WxN.png"></a>

地址引用,所以结果能返回回来!

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_1384150402O3mq.png"></a>

Sql注入的情况:

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_1384150404Xwyn.png"></a>

还有一种方式,用limit命令也可导致!

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_13841504058ufw.png"></a>

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_1384150407AZ9F.png"></a>

不小心输入的命令,就可以获取到更多的信息,这对开发者来说,是非常危险的漏洞!

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_1384150409nAU2.png"></a>

案例3:

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_1384150410T8QP.png"></a>

function showtable($table_name){

if (mysqli_connect_error()){

$sql="select * from $table_name";

$res=$mysqli-&gt;query($sql);

echo "共有 行".$res-&gt;num_rows."--列=".$res-&gt;field_count;

$res-&gt;free();

showtable("user");

<a href="http://guojiping.blog.51cto.com/attachment/201311/11/5635432_1384150411OBA8.png"></a>

本文转自 gjp0731 51CTO博客,原文链接:http://blog.51cto.com/guojiping/1323190