Mysqli擴充套件庫增強—–預處理技術mysqlistmt

科技小能手發表於2017-11-12

該方案防止sql注入

wps_clip_image-1584

注意:這裡只需建立一次連線,以後都是發資料即可!

案例1:利用簡單預處理,往資料庫中執行dml語句插入(更新,刪除同種方法)資訊:preparestatment.php

<?php

//建立mysqli物件

$mysqli=new mysqli(“localhost”,”root”,”123456″,”test”);

//建立預編譯物件

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

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

$mysqli->query(“set names utf8”);

//繫結引數

$name=”張三”;

$password=”zs”;

$email=”zs@163.com”;

$age=26;

//引數繫結->給?賦值,這裡型別和順序要一致!

$mysqli_stmt->bind_param(“sssi”,$name,$password,$email,$age);

$a=$mysqli_stmt->execute();

if(!$a){

die(“操作失敗”.$mysqli_stmt->execute());

}else {

echo ” 操作ok “;

}

//釋放

$mysqli->close();

wps_clip_image-31946

wps_clip_image-10414

用命令增加的新記錄!成功!

如果繼續新增,就不需要再執行$mysqli->prepare()了!

現在是隻發資料,連線也沒斷開,這樣效率會很高!

<?php

//建立mysqli物件

$mysqli=new mysqli(“localhost”,”root”,”123456″,”test”);

//建立預編譯物件

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

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

$mysqli->query(“set names utf8”);

//繫結引數

$name=”張三”;

$password=”zs”;

$email=”zs@163.com”;

$age=26;

//引數繫結->給?賦值,這裡型別和順序要一致!

$mysqli_stmt->bind_param(“sssi”,$name,$password,$email,$age);

$a=$mysqli_stmt->execute();//每一個語句後面都要有一個執行語句!

//繼續新增

$name=”李四”;

$password=”ls”;

$email=”ls@sohu.com”;

$age=”58″;

$mysqli_stmt->bind_param(“sssi”,$name,$password,$email,$age);

$a=$mysqli_stmt->execute();

$name=”王五”;

$password=”ww”;

$email=”ww@sohu.com”;

$age=”109″;

$mysqli_stmt->bind_param(“sssi”,$name,$password,$email,$age);

$a=$mysqli_stmt->execute();

if(!$a){

die(“操作失敗”.$mysqli_stmt->execute());

}else {

echo ” 操作ok “;

}

//釋放

$mysqli->close();

wps_clip_image-26582

wps_clip_image-19472

執行時,一次新增3條記錄!

案例2:用預處理執行dql語句,查詢id>10的使用者,如何預防sql注入

<?php

//建立mysqli物件

$mysqli=new mysqli(“localhost”,”root”,”123456″,”test”);

if(mysqli_connect_error()){

die (mysqli_connect_error());

}

//建立預編譯物件

$sql=”select id,name,email from user where id>?”;

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

$mysqli->query(“set names utf8”);

//繫結引數

$id=10;

//引數繫結->給?賦值,這裡型別和順序要一致!

$mysqli_stmt->bind_param(“i”,$id);

//繫結結果集

$mysqli_stmt->bind_result($id,$name,$email);

//執行

$mysqli_stmt->execute();

//取出繫結的值

while($mysqli_stmt->fetch()){

echo “<br/>–$id–$name–$email—“;

}

//關閉資源

//釋放結果

$mysqli_stmt->free_result();

//關閉預編譯語句

$mysqli_stmt->close();

//關閉連結

$mysqli->close();

wps_clip_image-15295

Id>10的都列出來了!

wps_clip_image-21327

地址引用,所以結果能返回回來!

wps_clip_image-26037

Sql注入的情況:

wps_clip_image-15475

還有一種方式,用limit命令也可導致!

wps_clip_image-722

wps_clip_image-12955

不小心輸入的命令,就可以獲取到更多的資訊,這對開發者來說,是非常危險的漏洞!

wps_clip_image-12928

案例3:

wps_clip_image-32066

<?php

function showtable($table_name){

$mysqli=new mysqli(“localhost”,”root”,”123456″,”test”);

if (mysqli_connect_error()){

die (mysqli_connect_error());

}

$sql=”select * from $table_name”;

$res=$mysqli->query($sql);

echo “共有 行”.$res->num_rows.”–列=”.$res->field_count;

$res->free();

$mysqli->close();

}

showtable(“user”);

wps_clip_image-5405

本文轉自 gjp0731 51CTO部落格,原文連結:http://blog.51cto.com/guojiping/1323190


相關文章