zoukankan      html  css  js  c++  java
  • PHP(Mysqli和PDO)预处理

    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......
     */
  • 相关阅读:
    defence系列的网游不错,我信网游能挣钱了,做得太好了
    关于Debug和Release之本质区别的讨论
    phpmyadmin设置密码,不用登录直接进入
    北京可以备案什么域名
    如何将本地文件复制到远程服务器听语音
    win7 64位wamp2.5无法启动MSVCR110.DLL丢失听语音
    最大连接数:60 iops:150 什么概念?
    about diigo
    Install Microsoft fonts in Ubuntu Linux
    a crawler base on libevent
  • 原文地址:https://www.cnblogs.com/richerdyoung/p/6737725.html
Copyright © 2011-2022 走看看