美文网首页
第4天 PDO

第4天 PDO

作者: zphphp | 来源:发表于2019-11-02 11:33 被阅读0次

    PDO

    1. PDO概述

    PDO,PHP Data Object,也是PHP操作数据库的一个扩展
    pdo扩展有一个很硬的后台PHP,在数据安全、执行效率方面,做了进一步的优化

    PDO对操作数据库提供一致的接口,不仅可以操作MySQL数据库、SQL Server、Oracle等这些数据库,便于将来数据库的移植(而mysqli扩展只能连接MySQL数据库)


    image.png
    image.png

    2. 开启PDO扩展

    在php.ini配置文件中开启扩展
    在php.ini里面搜索pdo,找到pdo扩展的位置,将前面的;分号去掉即可


    image.png

    测试一下:
    创建phpinfo.php文件,打印一下php的信息即可


    image.png

    3. 实例化PDO对象

    mysql扩展连接数据库:

    1. mysql_conenct();
    2. mysql_select_db(); 选择数据库
    3. mysql_query(); 设置字符集
    4. mysql_query($sql); 执行sql语句,返回结果集对象
    5. fetch 数据处理
      通过pdo连接数据库


      image.png

      注意:
      $dsn=””这里面不要有任何空格

    4. 使用PDO执行SQL语句

    创建一个测试数据库进行测试

    create database php_3 default character set utf8;
    create table user(
    id int primary key auto_increment,
    username varchar(30),
    password varchar(50)
    ) ;
    
    image.png

    (1)query():查询类:查询

    返回PDOStatement对象
    fetchAll() 查询所有的数据,返回二维数组

    image.png

    fetch() 返回一条记录,该记录既有关联类型的数据、索引类型的数据
    我们可以通过参数配置返回结果的格式
    PDO::FETCH_ASSOC 指定返回的结果是关联类型的数据
    PDO::FETCH_NUM 指定返回的结果是索引类型的数据
    PDO::FETCH_BOTH 指定返回的结果是既有关联类型、索引类型


    image.png

    fetchColumn() 查询的是一条记录的某个字段的值,
    注意:参数是字段的索引、序号,而不是字段的名称

    注意:fetchColumn()方法获得的是当前的记录,如果之前没有查询,则返回第一条记录的某个字段,如果fetchColumn之前有查询,数据指针会向后面移动,这个时候,fetchColumn返回的是当前的记录


    image.png

    (2)exec():非查询类:增加、删除、修改

    插入一条数据:


    image.png

    给大家一点时间,大家练习

    更新、删除操作

    5. PDO对象的常用方法

    (1)exec()

    (2)query()

    (3)errorCode()****:****返回错误的代码

    (4)errorInfo()****:****返回错误的信息

    image.png

    (5)quote()****数据转义并使用引号包裹

    举例说明


    image.png
    image.png

    测试一把,我们在用户名输入框输入的内容是:1' or 1 or '


    image.png
    分析原因:
    问题出在哪里?
    image.png

    解决之道:

    pdo对象的quote()方法,对提交的数据(POST、GET、COOKIE等)进行引号转义、并包裹


    image.png
    image.png

    不仅转义、而且使用引号包裹


    image.png

    (6)事务处理:

    是逻辑上的一组操作,组成这组操作的各个单元要么全部成功,要么全部失败
    创建测试数据表,模拟宋江给李逵转账

    CREATE TABLE cash(
    id int primary key auto_increment,name varchar(30),
    mone
    y decimal(7,2)
    )engine innodb default charset=utf8;
    
    image.png

    插入测试数据


    image.png

    使用事务,模拟转账


    image.png image.png

    (7)lastInsertId()

    上次执行插入数据返回的主键值,如果一次增加多条记录,返回的是前面的那条记录的主键


    image.png

    (8)prepare()****预处理sql语句

    举个例子:

    通过下面的练习,我们发现,会将所有数据删除,问题出在 id的值上,删除的时候,将所有满足条件的都删除了


    image.png

    解决之道:

    我们的总体思路就是:id的值,就应该是一个固定的数字,不应该有运算

    使用$pdo对象的prepare方法,进行处理

    1. 先解析SQL语句的结构部分,数据暂时使用占位符代替
    2. 解析SQL语句之后,prepare()之后,再将占位符替换成真实的数据
      bindValue(),第一个?使用1表示,第二个?问号使用2表示,依次类推
      3. 执行:execute()


      image.png

      预处理查询sql语句
      在执行完execute()方法之后,继续执行pdo_statement对象的fetch()系列方法进行查询


      image.png
      image.png

    占位符除了 ? 之外,还有其他的站位符号,例如: :占位符

    image.png

    预处理的优点

    (1)因为在prepare()的时候,已经将SQL语句的结构部分解析处理并保存到pdostatement对象身上,以后的操作仅仅是替换占位符,sql语句就不再解析,所以提高执行效率


    image.png

    (2)因为使用占位符代替真实数据,从而防止非法的数据,进而提高数据的安全

    6. PDOStatement对象的常用方法

    (1)fetch
    (2)fetchAll()
    (3)fetchColumn
    (4)bindValue()
    (5)execute()
    (6)closeCursor() 关闭游标、指针,便于下次查询


    image.png

    (7)errorInfo errorCode 分别获得sql语句错误信息以及错误代码


    image.png
    (8)rowCount()统计受影响的记录数(查询、增加、删除、修改)
    如果是查询语句,返回的是查询的记录数
    image.png

    如果是非查询语句,删除、修改、增加,则返回受影响的记录数


    image.png

    7. 基于PDO再次封装DAO类

    DAOMySQLi.class.php------>操作数据库 Android
    DAOMySQL.class.php------>操作数据 iphone
    DAOPDO.class.php--------->操作数据库 window phone
    提出一个疑问:DAOPDO.class.php类里面的方法能随便定义吗?
    接口的概念,是一个规范,约束一个类有哪些功能、方法
    接口不实现这些方法,而是类去完成这些方法
    通过接口规范了所有功能类的方法,将来我们在切换数据操作类的时候,因为规范都是一样的,所以更加灵活
    如何定义接口呢?
    (1)通过interface关键字定义接口,并在接口中规范有哪些功能


    image.png

    (2)在具体的功能类里面实现接口中规定的方法
    implements


    image.png

    思考:我们在执行数据库的操作时,连接一次数据库就可以了,不需要连接很多次
    如何保证我们的DAOPDO这个类只实例化一个对象呢?
    单例模型

    1. new 构造函数
    2. 静态方法
    3. 克隆
      通过三私一公的方法实现
      私有的构造方法
      私有的静态属性保存对象
      私有的克隆方法
      1个公共的静态方法实例化


      image.png

    通过公共的静态方法获得单例对象


    image.png

    在构造方法中,我们初始化服务器信息以及实现初始化PDO对象


    image.png
    image.png

    到此我们可以获得PDO对象了,接下来我们通过查询所有数据测试一下我们的接口


    image.png

    因为在类中我们只实现了3个方法,为了测试,我们暂时将接口中的其他方法注释


    image.png

    8. 作业

    大家完成接口中定义的如下方法:
    getRow
    getOne
    exec
    affectedRows
    lastInsertId
    escapeData

    相关文章

      网友评论

          本文标题:第4天 PDO

          本文链接:https://www.haomeiwen.com/subject/mbmcbctx.html