zoukankan      html  css  js  c++  java
  • PDO概念 分析 练习

    PDO 翻译过来叫做数据访问抽象层

    它是一个数据访问的层面,实际上是一个类,也就是说所有操作数据库的代码,都是通过这个层面完成的

    该图好理解大概就是这样一种模式

     现在考虑的是能不能使用同一个类,上层代码不用动,使用一个类去操作数据库,我可以根据这个类里边给的一些参数,它来自动切换驱动

    所以PDO主要就是用来访问其它数据库

    它的主要功能:

    1.操作其它数据库

    2.事务功能

    3.防止SQL注入攻击

    首先先造PDO对象

    $dsn = "mysql:dbname=mydb;host=localhost";   这是一个数据源

    mysql 代表了驱动的名称

    冒号后边写连接的参数

    写的是数据库名称叫dbname=名称叫mydb

    host 代表了数据库地址

    $dsn = "mysql:dbname=mydb;host=localhost";
    $pdo = new PDO($dsn,"root","123");

    这样PDO对象就造好了

    接着写SQL语句和执行

    $sql = "select * from nation";
    
    $attr = $pdo->query($sql);
    
    $arr = $attr->fetch(PDO::FETCH_ASSOC);//参数不需要加单引号双引号
    var_dump($arr);

    这返回的对象是PDOStatement对象

    ASSOC 代表 关联数组

    NUM 代表 索引的

    BOTH 代表两者都有

    OBJ 返回对象

    如果sql语句不是查询语句,而是增删改

    //添加语句
    $sql = "insert into nation values('n076','数据')";
    
    //$a = $pdo->query($sql); //执行查询
    
    //$a = $pdo->exec($sql);  //执行其它语句

    exec  是指一个单独的函数调用中执行一条SQL语句,返回受此语句影响的行数

             不会从一条SELECT语句中返回结果

    这些就是PDO访问数据库的基本写法

    如果把dsn换掉就可以访问别的数据库了

    接下来了解一下事务功能

    事务:能够控制语句同时成功同时失败,失败时可以回滚

    $dsn = "mysql:dbname=mydb;host=localhost";
    $pdo = new PDO($dsn,"root","123");
    
    $sql1 = "insert into nation values('n079','是删')";
    $sql2 = "insert into nation values('n077','可爱')";
    
    $pdo->exec($sql1);
    $pdo->exec($sql2);

    n079是在数据里没有的,可以进

    n077是在数据里存在的,是失败的,主键重复

    执行的时候,如果单纯的执行,我没有加事务的话,应该是一条成功一条失败

     

    现在我们要加事务让着两条要么一起成功,要么一起失败,并且把错误的找出来,进行回滚

    $dsn = "mysql:dbname=mydb;host=localhost";
    $pdo = new PDO($dsn,"root","123");
    
    //设置异常模式  如果出现错误,会抛出一个异常,一抛异常,catch抓住
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    
    //加事务  
    try{
        //开启事务
        $pdo -> beginTransaction(); //调它开启事务
        
        $sql1 = "insert into nation values('n078','是删')";
        $sql2 = "insert into nation values('n077','数据')";
        
        $pdo->exec($sql1);
        $pdo->exec($sql2);
        
        //提交  走到提交的时候能够把事务结束掉
        $pdo->commit();
    }
    
    catch(Exception $e)     $e就是异常对象
    {
        $e->getMessage(); //获取异常信息
        //回滚
        $pdo->rollBack();
    }
    
    
    ?>

    1.设置异常模式

    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

    如果出现错误,会抛出一个异常,抛出异常后,catch抓住

    2.加事务      try : 试着执行

    try{

            先开启事务

            $pdo -> beginTransaction();   调它开启

            提交  

            $pdo->commit();    走到提交的时候能够把事务结束掉

          

         catch : 抓住try里面出现的问题,抓住后执行下面的内容

    catch(Exception $e)   pdo异常参数   Exception:异常  $e就是异常对象

            {

                   $e->getMessage();   获取异常信息

                   回滚

                   $pdo->rollBack();

             }

    还有一个是final

    是配合着try用的,要么加catch,要么加final,也有可能一起
    final 是 无论以上try代码是否执行成功,是否有错误,都会最终过来执行它

    最后在来看一下  SQL注入攻击

    它的表现方式

    用户在输入内容的时候,它可以自己拼接一个字符串,来改变我们查询的结果

    怎么防范?有几种方式

    1. 过滤用户的输入 通过前端用JS也行,用PHP也行

    2. 写代码的规范

    3. 使用PDO里自带的功能叫预处理语句,来防止SQL注入攻击

    <?php
    $dsn = "mysql:dbname=mydb;host=localhost";
    $pdo = new PDO($dsn,"root","123");
    
    $code ="n001";
    //SQL语句里面需要加占位符  ?
    $sql = "select * from nation where code='{?}'";  
    //怎样把注入攻击规避掉
    //pdo 提供了一种方式叫  prepare-> 准备的意思
    //准备执行,返回PDOStatement对象
    $st = $pdo->prepare($sql);
    
    //调用绑定参数的方法来绑定参数
    $st->bindParam(1,$code);  //1.括号里第一个要写占位符在sql语句里面的位置是几
                              //2.要写参数   这两个是必须要写的
    
    //执行方法
    $st->execute();
    $attr = $st->fetchAll();
    var_dump($attr);
                       
    ?>
  • 相关阅读:
    js中的原生Ajax和JQuery中的Ajax
    this的用法
    static的特性
    时政20180807
    java compiler没有1.8怎么办
    Description Resource Path Location Type Java compiler level does not match the version of the installed Java project facet Unknown Faceted Project Problem (Java Version Mismatch)
    分词器
    [数算]有一个工程甲、乙、丙单独做,分别要48天、72天、96天完成
    一点感想
    解析Excel文件 Apache POI框架使用
  • 原文地址:https://www.cnblogs.com/zqseven/p/6249430.html
Copyright © 2011-2022 走看看