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'。

2019-07-25 PDO的更多相关文章

  1. [2019.03.25]Linux中的查找

    TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...

  2. Alpha冲刺(2/10)——2019.4.25

    所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(2/10)--2019.4.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...

  3. Beta冲刺(4/7)——2019.5.25

    所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(4/7)--2019.5.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...

  4. agentzh 的 Nginx 教程(版本 2019.07.31)

    agentzh 的 Nginx 教程(版本 2019.07.31) agentzh 的 Nginx 教程(版本 2019.07.31) https://openresty.org/download/a ...

  5. 2019.07.05 纪中_B

    今日膜拜:czj大佬orz%%% 2019.07.05[NOIP提高组]模拟 B 组 今天做题的时候大概能判断出题人的考点,可是就是没学过...特别痛苦 T0:栈的定义,模拟就好了T1:感觉像是找规律 ...

  6. 2019.07.09 纪中_B

    错失AK记 2019.07.09[NOIP提高组]模拟 B 组 明明今天的题都很水,可就是没蒟蒻. 写题的时候: T0一眼高精(结果没切)T1看到2啊8啊果断转二进制观察,发现都是左移几位然后空出的位 ...

  7. 2019.07.06 纪中_B

    今天的题看起来都很简单,结果就爆炸了 做题时:怎么都是图论??? 结果最后好多是DP(最恐怖的是还有我没学过的状压DP) 2019.07.06[NOIP提高组]模拟 B 组 做了两题(稍微腐败了一下) ...

  8. [MP3]MP3固件持续分享(2019.1.25)

    转载自我的博客:https://blog.ljyngup.com/archives/179.html/ 所有的固件到我的博客就可以下载哦 最后更新于2019.2.1 前言 这篇文章会持续更新不同型号的 ...

  9. IntelliJ IDEA 2018.3.3配置 Tomcat 9,控制台出现中文乱码 “淇℃伅”(2019/01/25)

    (win10系统) 全新idea配置全新版本Tomcat突遇 “淇℃伅”,网上大部分解决方案均已失效 似乎是idea与Tomcat命令行输出格式不一致所致,千辛万苦在某一小角落发现这个方法,一针见血, ...

  10. 2019.3.25 SQL语句(进阶篇1)

    运算符 基本的加减乘除取余都可以在SQL中使用 新建Employee1表并添加数据 create table Employee1 (eid int primary key auto_increment ...

随机推荐

  1. C# 序列化与反序列化之xml对属性或者字段的子类化的子对象进行序列化的解决方案

    C# 序列化与反序列化之xml对属性或者字段的子类化的子对象进行序列化的解决方案 xml序列化涉及到XmlRoot,XmlInclude,XmlElement,XmlAttribute,XmlType ...

  2. Mac Mini 2014 更换SSD 升级SSD

    将自己的Mac Mini 2014版升级成固态硬盘 亲自动手, 还算顺利, 参考网络教程, 并改进了里面的关键步骤, 下面是原文链接 Mac Mini 2014 升级成SSD Mac Mini 拆机图 ...

  3. Eclipse笔记-sun.misc.BASE64Encoder找不到jar包的解决方法

    从SVN检出新项目,在Eclipse中报错如下: 转: Eclipse笔记-sun.misc.BASE64Encoder找不到jar包的解决方法 2018-01-04 00:36:20 雨临Lewis ...

  4. 搭建npm私服流程

    npm私服必要性 1. 如果公司处于隐私保护的需要,不想将自己封的包推到npm社区,但又急需要一套完整的包管理工具来管理越来越多的组件,模块,项目.对于前端,最熟悉的莫过于npm,bower等,但是b ...

  5. matlab学习笔记11_3高维数组操作 filp, shiftdim, size, permute, ipermute

    一起来学matlab-matlab学习笔记11 11_3 高维数组处理和运算 filp, shiftdim, size, permute, ipermute 觉得有用的话,欢迎一起讨论相互学习~Fol ...

  6. SVM – 回归

    SVM的算法是很versatile的,在回归领域SVM同样十分出色的.而且和SVC类似,SVR的原理也是基于支持向量(来绘制辅助线),只不过在分类领域,支持向量是最靠近超平面的点,在回归领域,支持向量 ...

  7. 更换yum源为阿里云源

    1.复制备份: cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载: wget -O ...

  8. Python线程池及其原理和使用(超级详细)

    系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即 ...

  9. [原]使用kubeadm部署kubernetes(一)

    #######################    以下为声明  ##################### 在公众号  木子李的菜田 输入关键词:   k8s 有系列安装文档 此文档是之前做笔记在 ...

  10. nginx http和https共存

    server { listen 80 default backlog=2048; listen 443 ssl; server_name linuxyan.com; root /var/www/htm ...