• 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);
                       
    ?>
  • 相关阅读:
    精算师的前世今生
    失落的C语言结构体封装艺术
    关于联合的一些介绍
    变量的声明和定义
    C/C++内存分配区
    探寻周瑜“前世今生”
    SpringBoot中使用AOP
    springBoot中的事物管理
    springBoot整合多数据源
    spingBoot整合mybatis+generator+pageHelper
  • 原文地址:https://www.cnblogs.com/zqseven/p/6249430.html
Copyright © 2020-2023  润新知