zoukankan      html  css  js  c++  java
  • PHP的预处理语句的使用

    很多更成熟的数据库都支持预处理语句的概念。
    什么是预处理语句?
    可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。预处理语句可以带来两大好处: 
    •  查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因而运行得更快。  
    •  提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。  

    预处理语句如此有用,以至于它们唯一的特性是在驱动程序不支持的时PDO 将模拟处理。这样可以确保不管数据库是否具有这样的功能,都可以确保应用程序可以用相同的数据访问模式。

    例如:

    <?php
    
    /**
     * 我直接针对PDO的封装类
     * User: seven
     * Date: 2017/7/26
     * Time: 9:43
     */
    class MyPDO
    {
        /** 访问数据库的PDO对象 */
        protected $pdo;
    
        /**
         * 当前类的构造函数
         * 读取数据库配置信息文件(自己设定的),并初始化PDO对象
         */
        function __construct()
        {
            if(file_exists('db.ini')){
                $arr = parse_ini_file('db.ini');
            }else{
                exit('没有找到对应的数据库配置文件信息 ...');
            }
            $dsn = "{$arr['dbms']}:dbname={$arr['dbname']};host={$arr['host']};port={$arr['port']};charset={$arr['charset']}";
            $user = $arr['user'];
            $password = $arr['password'];
            $this->pdo = new PDO($dsn,$user,$password);
        }
    
        /**
         * 销毁自己的操作类时,同时销毁被创建了的PDO对象
         */
        function __destruct()
        {
            $this->pdo = null;
        }
    
        /**
         * 执行DML操作语句
         * @param $sql     需要执行的SQL语句
         * @return int     返回执行语句后受到影响的行数
         */
        public function pdoExec($sql){
            return $this->pdo->exec($sql);
        }
    
        /**
         * 返回结果为数组结构
         * @param $sql        需要执行的SQL语句
         * @param int $var    执行query函数的参数(可选值:PDO::FETCH_BOTH(默认),PDO::FETCH_NUM,PDO::FETCH_ASSOC)
         * @return array      将结果转换为数组并返回,如果没有查询结果则返回一个空数组
         */
        public function arrayByPdoQuery($sql, $var=PDO::FETCH_BOTH){
            $ps = $this->pdo->query($sql, $var);
            if($ps)
                return $ps->fetchAll();
            return array();
        }
    
        /**
         * 获取查询结果并封装为一个对象数组
         * @param $sql                  需要执行的SQL语句
         * @param string $class_name    创建类的名称
         * @param array $ctor_args      此数组的元素被传递给对应类的构造函数
         * @return array                返回组装好的对象数组
         */
        public function objectByPdoQuery($sql, $class_name='stdClass', $ctor_args=array()){
            $ps = $this->pdo->query($sql);
            $arr = array();
            if($ps){
                while ($obj = $ps->fetchObject($class_name, $ctor_args)){
                    array_push($arr, $obj);
                }
            }
            return $arr;
        }
    
        /**
         * 使用PDO预编译语句执行DML操作并返回受影响的行数
         * @param $sql           需要执行的SQL语句(预编译语句写法)
         * @param array $arr     预编译语句需要添加的数据值,数组结构
         * @return int           返回DML执行后受影响的行数
         */
        public function intByPdoPrepare($sql, array $arr=array()){
            $ps =$this->pdo->prepare($sql);
            $ps->execute($arr);
            return $ps->rowCount();
        }
    
        /**
         * 使用PDO预编译语句执行查询操作并返回结果集合
         * @param $sql           需要执行的SQL语句(预编译语句写法)
         * @param array $arr     预编译语句需要添加的数据值,数组结构
         * @return array         转换为数组结构的返回值结果
         */
        public function arrayByPdoPrepare($sql, array $arr=array()){
            $ps =$this->pdo->prepare($sql);
            $ps->execute($arr);
            if($ps)
                return $ps->fetchAll();
            return array();
        }
    
        /**
         * 获取查询结果并封装为一个对象数组
         * @param $sql                  需要执行的SQL语句
         * @param array $arr            预编译语句需要添加的数据值,数组结构
         * @param string $class_name    创建类的名称
         * @param array $ctor_args      此数组的元素被传递给对应类的构造函数
         * @return array                返回组装好的对象数组
         */
        public function objectByPdoPrepare($sql, array $arr=array(), $class_name='stdClass', $ctor_args=array()){
            $ps =$this->pdo->prepare($sql);
            $ps->execute($arr);
            $arr = array();
            if($ps){
                while ($obj = $ps->fetchObject($class_name, $ctor_args)){
                    array_push($arr, $obj);
                }
            }
            return $arr;
        }
    
    }
    
    
    
    
    <?php
    /**
     * Created by PhpStorm.
     * User: seven
     * Date: 2017/7/27
     * Time: 13:18
     */
    
    include_once 'MyPDO.class.php';
    //include_once 'Student.class.php';
    
    $mp = new MyPDO();
    $sex = 'male';
    //$sql = "select * from student where ssex=?";
    //$arr = $mp->objectByPdoQuery($sql, 'Student');
    //var_dump($arr);
    
    $sql = "insert into student values (null,?,?,?,?,?,?)";
    $params = array(
        'xxx','male','xx-xx-xx','xxx','xxxxxxxx','xxxxxxx'
    );
    $num = $mp->intByPdoPrepare($sql, $params);
    echo $num.'<br>';
    
    $sql = "select * from student where ssex=?";
    $arr = $mp->objectByPdoPrepare($sql,array($sex),'Student');
    var_dump($arr);
    

      

    加油,朝着梦想前进
  • 相关阅读:
    两台虚拟机(不同电脑)通信
    虚拟机使用网络助手
    strcpy_s
    线程创建几种方法
    JavaWeb——EL详解
    JavaWeb_EL语法
    JavaWeb_JavaBean
    JavaWeb_HttpSession之验证码
    JavaWeb_HttpSession之表单的重复提交
    JavaWeb——相对路径和绝对路径
  • 原文地址:https://www.cnblogs.com/scmy707248119-/p/7263970.html
Copyright © 2011-2022 走看看