PDO抽象数据层

在进度落后的项目中增加人手只会导致进度更加落后。
----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暂时先记录这么多,在以后的学习中我会补充更多。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容

  • pdo类PDO是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,...
    桖辶殇阅读 863评论 0 0
  • pdo基本使用 【PDO是啥】 PDO是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都...
    桖辶殇阅读 1,334评论 0 4
  • Yii提供了强大的数据库编程支持。Yii数据访问对象(DAO)建立在PHP的数据对象(PDO)extension上...
    layjoy阅读 2,612评论 0 6
  • Php:脚本语言,网站建设,服务器端运行 PHP定义:一种服务器端的HTML脚本/编程语言,是一种简单的、面向对象...
    廖马儿阅读 2,120评论 2 38
  • 【一】 都市的十字路口,人车汇流之地,乃是一处奇妙所在,它每天、每时、每刻都在上演着一部流动的、纪实的《都市众生相...
    风羽白阅读 337评论 2 6