• 2019-07-25 PDO


    PDO是什么?

    pdo是php数据对象,即php data object 。使用pdo是为了让我们能够使用相同的代码连接不同的数据库。PDO扩展是以面向对象的方式来进行封装,也就是说,我们的PDO扩展实际上就是指封装好的PDO类。

    如何检测是否有pdo?


    建立php页面,echo phpinfo()在页面中就会有关于php的详细信息。类似于下图,然后向下滑动或CTRL+F键直接搜索PDO,就会出现相关信息,对照一下就可以了。

    PDO的基本语法

    //用pdo连接数据库
    $dsn = 'mysql:host=127.0.0.1;port=3306;charset=utf8;dbname=news';
    //实例化PDO
    $pdo = new PDO($dsn,'root','root');

    上面的代码中,host代表主机地址,port代表端口号,charset代表字符集,dbname代表我们要连接的数据库名。注意他们所有的值都不能用引号包裹,否则会报错。在实例化PDO时,要把参数传到类中的构造函数内,后两个root代表数据库账户名和密码。写到上述代码后,PDO连接数据库就完成了,那么我们怎么用PDO方式写增删改查呢?其实并不难理解。

    //sql语句 查询 不对数据进行改变 用query
    $sql = "select * from news";
    $res = $pdo->query($sql);

    我们在查询时,并没有对数据库中的数据进行修改,所以我们用$pdo这个对象去调用query方法,执行sql语句即可。

    除了调用query是执行代码外,还有其他命令:

    PDO::beginTransaction — 启动一个事务
    PDO::commit — 提交一个事务
    PDO::__construct — 创建一个表示数据库连接的 PDO 实例
    PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE
    PDO::errorInfo — 返回最后一次操作数据库的错误信息
    PDO::exec — 执行一条 SQL 语句,并返回受影响的行数
    PDO::getAttribute — 取回一个数据库连接的属性
    PDO::getAvailableDrivers — 返回一个可用驱动的数组
    PDO::inTransaction — 检查是否在一个事务内
    PDO::lastInsertId — 返回最后插入行的ID或序列值
    PDO::prepare — 备要执行的SQL语句并返回一个 PDOStatement 对象
    PDO::query — 执行 SQL 语句,返回PDOStatement对象,可以理解为结果集
    PDO::quote — 为SQL语句中的字符串添加引号。
    PDO::rollBack — 回滚一个事务
    PDO::setAttribute — 设置属性

    此时我们打印$res,会得到PDOStatement Object ( [queryString] => select * from news )这样的一个类对象,我们可以把它理解为结果集,需要把它进行转换才能得到我们想要的数据,在之前我们使用的是mysql_fetch_assoc()这个函数,在这里用什么呢?

    //多条数据 用fetchALL
    $row = $res->fetchALL(PDO::FETCH_ASSOC);
    
    //单条数据用fetch
    $rowone = $res->fetch(PDO::FETCH_ASSOC);

    可以看到,如果我们想要得到多条结果要用fechALL(PDO::FETCH_ASSOC)如果想要得到单条数据用fechALL(PDO::FETCH_ASSOC)即可。如果我们想知道总共有多少条数据怎么办呢?

    //用rowCount()查询共有多少个数据
    print_r($res->rowCount());

     结果集除了fetch 和fetchALL外也有很多方法:

    PDOStatement::bindColumn — 绑定一列到一个 PHP 变量
    PDOStatement::bindParam — 绑定一个参数到指定的变量名
    PDOStatement::bindValue — 把一个值绑定到一个参数
    PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。
    PDOStatement::columnCount — 返回结果集中的列数
    PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令
    PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE
    PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息
    PDOStatement::execute — 执行一条预处理语句
    PDOStatement::fetch — 从结果集中获取下一行
    PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
    PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。
    PDOStatement::fetchObject — 获取下一行并作为一个对象返回。
    PDOStatement::getAttribute — 检索一个语句属性
    PDOStatement::getColumnMeta — 返回结果集中一列的元数据
    PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集
    PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
    PDOStatement::setAttribute — 设置一个语句属性
    PDOStatement::setFetchMode — 为语句设置默认的获取模式。

    //sql语句 增加 对数据改变了要用exec
    $time = time();
    $sql1 = "insert into news values (null,'1234','1234','$time','1')";
    $res1 = $pdo->exec($sql1);

    增加我们对数据表进行了改变,所以这里不能用query,要用exec,执行完代码后他返回的是受影响的行数。如果你打印$res1的话会发现结果是1。

    修改和删除

    //修改
    $sql2 = "update news set title ='234' where id='4'";
    $res2 = $pdo->exec($sql2);
    
    
    //删除
    $sql3 = "delete from news where id='1'";
    $res3 = $pdo->exec($sql3);

    修改与删除都对数据表进行了改变,因此都要用exec,执行完代码返回结果也是受影响的行数。

    try cache 当数据库连接失败时 抓取错误

    try{
        $dsn = 'mysql:host=127.0.0.1;port=3306;charset=utf8;dbname=nes';
        $pdo = new PDO($dsn,'root','root');
    }catch(PDOException $e){
        die("数据库连接失败".$e->getMessage());
        }

    上面我们把数据库名news写成了nes,是错误的如果按照如上代码,会在页面中输出一个错误提示:数据库连接失败SQLSTATE[HY000] [1049] Unknown database 'nes'。

  • 相关阅读:
    新建安卓项目后,manifest.xml中会出现大段的黄色警告
    TextView设置setCompoundDrawables不生效解决办法
    数据结构->队列->顺序循环队列ADT代码
    数据结构->栈->顺序栈ADT代码
    JAVA环境变量的配置
    计算机科学的范围-----18.12.08
    字符串复制
    扔鸡蛋问题和找零钱问题
    动态规划
    最小二乘法
  • 原文地址:https://www.cnblogs.com/zhangxu-fasu/p/11244235.html
Copyright © 2020-2023  润新知