PHP预处理主要是用来防SQL注入的,开发程序的都明白这样一个道理,不能相信用户的任何输入,如果用户输入问题你没有做相应的安全,
那么:你的程序是很危险的,很容易被攻击的!预处理:只分析两个:mysqli和PDO,因为这两个是PHP开发者用得比较多的;
mysql 在PHP 高版本里边已经不支持了。
一、Mysqli预处理防SQL注入
博主讲解了mysqli预处理的全部,包含增、删、改、查的预处理,不过:一般用不上这么多。主要是插入数据做好预处理即可!其它的是否做预处理要根据你的场景来;
<?php $serveraddress='localhost'; //服务器地址 $user='root'; //用户名 $password='root'; //密码 $database='test'; //数据库 $mysqli = new mysqli ( $serveraddress , $user , $password , $database ); if ( mysqli_connect_errno ()) { printf ( "Connect failed: %s " , mysqli_connect_error ()); exit(); } $mysqli->set_charset( "utf8" ); // 设置字符集 $catname='test'; $parentid=12; //mysqli插入 $sql='insert into cat (cat_name,parent_id) values(?,?)'; $stmt=$mysqli->prepare($sql); $stmt->bind_param('si',$catname,$parentid ); /* i 整型integer d 双精度浮点型double s 字符串string b 是一个blob和将发送数据包 */ $stmt->execute(); if($id=$stmt->insert_id){ echo $id; //得到插入返回的ID } $catname='test'; $catid=66; //mysqli修改 $sql='update cat set cat_name=? where cat_id=?'; $stmt=$mysqli->prepare($sql); $stmt->bind_param('si',$catname,$catid ); if($stmt->execute()){ echo '修改成功!'; } $catid=68; //mysqli删除 $sql='delete from cat where cat_id=?'; $stmt=$mysqli->prepare($sql); $stmt->bind_param('i',$catid ); if($stmt->execute()){ echo '删除成功!!'; } $catid=10; //mysqli查询多行 $sql='select cat_name,parent_id from cat where cat_id<?'; $stmt=$mysqli->prepare($sql); $stmt->bind_param('i',$catid ); $stmt->execute(); $stmt -> bind_result ( $name , $code );//这里参数跟你查询的字段显示个数需要对应起来! while ( $stmt -> fetch ()) { echo $name.'=>'.$code; } $catid=12; //mysqli查询一行 $sql='select cat_name,parent_id from cat where cat_id=?'; $stmt=$mysqli->prepare($sql); $stmt->bind_param('i',$catid ); $stmt->execute(); $stmt -> bind_result ( $name , $code ); while ( $stmt -> fetch ()) { echo $name.'=>'.$code; }
二、PDO预处理防SQL注入
PDO面向对象函数有很多,都可以综合运用的,以下是博客有了不同函数实现的效果,一定要明白函数的原理,有很多函数它的作用其实是一样的;你只需要记住几个步骤:
1:连接数据库
2:设置字符集
3:准备SQL语句
4:替换SQL语句
5:发送SQL语句
6:得到SQL结果,可以是值,可以是布尔型,也可以是对象,数组等;
同样,PDO博主也做了它的增、删、改、查,虽然说并不是完全有必要,但是总会有一些项目,它的这些都需要做预处理的;记住:永远不要相信用户的任何输入!
<?php $dsn = 'mysql:dbname=test;host=localhost' ;//数据库类型,数据库,主机名 $user = 'root' ;//用户名 $password = 'root' ; //密码 $conn = new PDO ( $dsn , $user , $password ); $conn->exec("set names utf8"); //设置字符集 $catname='test'; $parentid=66; $sql='insert into cat (cat_name,parent_id) values(:catname,:parentid)'; //PDO插入方法一 $sth=$conn->prepare($sql,array( PDO :: ATTR_CURSOR => PDO :: CURSOR_FWDONLY)); $sth->execute(array(':catname'=>$catname,':parentid'=>$parentid)); if($id=$conn->lastInsertId()){ echo $id; //得到插入返回的ID } //PDO插入方法二 $sth=$conn->prepare($sql); $sth -> bindParam ( ':catname' , $catname , PDO :: PARAM_STR ); $sth -> bindParam ( ':parentid' , $parentid , PDO :: PARAM_INT , 12 );//参数标识,绑定的变量名,参数类型(选填),数据类型长度(选填) $sth -> execute (); if($id=$conn->lastInsertId()){ echo $id; //得到插入返回的ID } $catname='test'; $catid=88; //PDO修改 $sql='update cat set cat_name=? where cat_id=?'; $sth=$conn->prepare($sql); $sth->bindParam(1, $catname); $sth->bindParam(2,$catid); if($sth->execute()){ echo '修改成功!'; } $catid=91; //PDO删除 $sql='delete from cat where cat_id=:catid'; $sth=$conn->prepare($sql); $sth->bindValue(':catid',$catid,PDO::PARAM_INT); if($sth->execute()){ echo '删除成功!'; } $catid=10; //PDO查询多行 $sql='select cat_name,parent_id from cat where cat_id<?'; $sth=$conn->prepare($sql); $sth->bindParam(1,$catid); $sth->execute(); $result=$sth->fetchAll(); //var_dump($result); foreach ($result as $k => $v){ echo $v['cat_name'].'=>'.$v['parent_id']; } $catid=12; //PDO查询一行 $sql='select cat_name,parent_id from cat where cat_id=:catid'; $sth=$conn->prepare($sql); $sth->bindParam(':catid',$catid); $sth->execute(); $result=$sth->fetch(PDO::FETCH_ASSOC); var_dump($result); /* FETCH_ASSOC、FETCH_BOTH、FETCH_BOUND、FETCH_CLASS、FETCH_COLUMN、FETCH_FUNC、GROUP、INTO、KEY_PAIR、LAZY、NAMED、NUM、OBJ、ORI_ABS...... */