PHP预处理主要是用来防SQL注入的,开发程序的都明白这样一个道理,不能相信用户的任何输入,如果用户输入问题你没有做相应的安全,那么:你的程序是很危险的,很容易被攻击的!预处理:博主只分析两个:mysqli和PDO,因为这两个是PHP开发者用得比较多的;
一、Mysqli预处理防SQL注入
博主讲解了mysqli预处理的全部,包含增、删、改、查的预处理,不过:一般用不上这么多。主要是插入数据做好预处理即可!其它的是否做预处理要根据你的场景来;
- <?php
- $serveraddress='localhost'; //服务器地址
- $user='root'; //用户名
- $password='root'; //密码
- $database='fujieace'; //数据库
- $mysqli = new mysqli ( $serveraddress , $user , $password , $database );
- if ( mysqli_connect_errno ()) {
- printf ( "Connect failed: %s\n" , mysqli_connect_error ());
- exit();
- }
- $mysqli->set_charset( "utf8" ); // 设置字符集
- $catname='www.fujieace.com';
- $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='https://www.fujieace.com';
- $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=fujieace;host=localhost' ;//数据库类型,数据库,主机名
- $user = 'root' ;//用户名
- $password = 'root' ; //密码
- $conn = new PDO ( $dsn , $user , $password );
- $conn->exec("set names utf8"); //设置字符集
- $catname='www.fujieace.com';
- $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='付杰';
- $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......
- */
如果你用的是Mysqli,又想把查询的一条数据或多条数据返回给前端,请查看:
2017年06月08日 19:56:38 沙发
mysqli 还可以远程连接数据库的!
2017年04月20日 11:35:24 板凳
我现在PDO用得最多,因为很多项目都是团队开发,为了兼容不用PDO不行啊!
2017年04月20日 11:10:31 地板
杰哥最帅
2017年04月20日 11:10:14 4楼
mysqli 和 pdo真的是很实用!受教了!