美文网首页
PDO抽象数据层

PDO抽象数据层

作者: 做梦枯岛醒 | 来源:发表于2017-08-12 19:58 被阅读31次

    在进度落后的项目中增加人手只会导致进度更加落后。
    ----Fred Brooks

    什么是PDO?

    PDO全称Php Data Object(php数据对象),他是一个支持丰富数据库的访问接口,也就是说,有了PDO,我们不必要使用php提供的相关函数来访问数据库,而是通过PDO提供的接口来访问

    PDO的特点

    • PDO是一个数据库访问抽象层,作用是统一各种数据库的访问接口,PDO相比其他方式来说更高效。
    • PDO通过轻巧,清晰,方便的函数,统一数据库操作
    • PDO吸取数据库交互的教训,结合Php5的新特性,来进行方便的数据库操作
    • PDO是模块化的,能够在需要的时候为用户数据库后端加载驱动程序,而不必重新编译或安装整个应用程序

    下面我们直接进行pdo的使用(注意这里我用的新版的php,所以默认为开启状态,否则需要更改配置php.ini),具体的配置情况我们可以通过phpinfo()查看

    链接数据库

    //数据库种类
    $dbms = 'mysql';
    //数据库名
    $dbname = "surine";
    //主机
    $host = 'localhost';
    //配置dsn参数(可以看到格式比较奇怪)
    $dsn = "$dbms:host=$host;dbname = $dbname";
    try {
       //进行链接
        $pdo = new PDO($dsn, "root", "");
        echo "MySql链接成功";
    } catch (Exception $e) {
        echo "错误日志".$e->getMessage();
    }
    

    这里PDO构造是接受4个参数,第4个是访问配置选项,暂时不考虑

    SQL语句

    PDO中可以通过3种方法来执行SQL语句

    1.exec()

    通过这个函数来执行一些语句,来实现对数据库的操作

    try {
        $pdo = new PDO('mysql:host=localhost;dbname=surine', "root", "");
        echo "MySql链接成功";
        $aff = $pdo->exec("delete from users WHERE user = '1'");
        echo "输出数据,影响行数".$aff;
    } catch (Exception $e) {
        echo "错误日志".$e->getMessage();
    }
    

    这里细心的读者会发现我修改了连接方式,采用 直接写语句的方式把数据库种类,主机名称等传进去,这是因为如果不这么写可能出现找不到数据库的情况,那么当然我们的数据也就没法操作了,如果你遇到显示不了数据的情况,可以采用这种写法,如果不行,可以使用

    $pdo->errorInfo()
    

    这个方法来检查错误信息

    再比如说,插入数据

     $aff = $pdo->exec("insert into users(user,pswd) values('mt','123456')");
    
    2.query()

    query方法返回执行结果后的PDO结果集,那么他的参数也是一个sql语句,下面我们演示一下访问表的例子

     $query="select * from users";//需要执行的sql语句
     $arr = $pdo->query($query)->fetchAll();
        foreach ($arr as $var){
            echo "账号".$var['user'];
            echo "密码".$var['pswd']."<br>";
        }
    

    那么我们可以看到,我们用 $pdo->query($query)查询数据,并且使用fetchAll方法,将查询到的数据转化格式,最后使用foreach语句进行打印

    3.prepare()和execute()

    这是PDO的预处理语句里包含的方法,首先通过prepare()方法查询准备工作,通过execute来执行查询,下面是一个演示

      $query="select * from users";//需要执行的sql语句
        $res=$pdo->prepare($query);//准备查询语句
        $res->execute();
        $result=$res->fetchAll(PDO::FETCH_ASSOC);
            foreach ($result as $var){
            echo "账号".$var['user'];
            echo "密码".$var['pswd']."<br>";
        }
    
    

    这样的打印结果和上面的一致

    4.fetch() , fetchAll()

    终于说到fetch这里了,在前面用到很多次fetchAll方法
    fetch()方法用于获取结果集里的下一行
    那么fetchAll就是所有行,他们的返回值是一个array

    这里还有一个fetchColumn()方法,是获取某一行,那么传入的参数就是一个int值

    错误处理

    我们使用errorcode()方法获取错误码,也可以使用errorInfo()方法获取详细信息,通过这些信息,我们可以得到,代码出现了什么错误。

    事务处理

    事务是保证操作正确进行的一大解决方法,那么PDO也是支持事务的。那么事务分为几个部分。

    //开启事务 
        $pdo->beginTransaction();  
    //提交事务
        $pdo->commit();  
    //事务回滚
     $pdo->rollBack(); 
    

    那么比如说我们添加一条信息到数据库,如果添加失败,防止其产生影响,那么我们可以用回滚来撤销更改,下面是一个例子

    try {
        $pdo = new PDO('mysql:host=localhost;dbname=surine', "root", "");
        echo "MySql链接成功";
    
        $pdo->beginTransaction();  //开启事务
        $query="insert users(user,pswd)values('this','this')";//需要执行的sql语句
        $res=$pdo->prepare($query);//准备查询语句
        $res->execute();
        if($res){
            echo "添加数据成功";
        }else{
            echo "添加数据失败";
        }
        $pdo->commit();  //数据提交
    
    } catch (Exception $e) {
        $pdo->rollBack();  //数据回滚
        echo "错误日志".$e->getMessage();
    }
    

    可以看到,我们写了一个添加语句,然后开启了事务,在执行语句后,提交事务,如果发生问题,我们在catch里也有回滚的操作。

    总结

    关于PDO暂时先记录这么多,在以后的学习中我会补充更多。

    相关文章

      网友评论

          本文标题:PDO抽象数据层

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