学习PDO啦
通过查找资料对PDO有了一定的了解,PDO(PHP Data Object )为PHP数据对象,为PHP访问数据库提供了一个轻量级的借口,但PDO本生不能实现访问数据库的任何功能,只能通过数据库的PDO驱动来访问数据库。
预定义与常量
常量在编译PHP或在运行时动态载入时可用。
PDO::FETCH_ASSOC
(integer) 指定获取方式——返回关联数组
PDO::FETCH_NUM
(integer)指定获取方式——返回索引数组PDO::FETCH_CLASS 指定获取方式——对象的属性返回
$stmt->fetchAll(PDO::FETCH_CLASS)
连接与管理
连接是通过实例PDO而建立的,也可是它的基类,构造函数参数用于指定数据库源(必填)、用户名、密码。在连接是出错误,将抛出一个PDOException异常对象,如果想处理错误状态,可以捕获异常,或者留给通过set_exception_hander()设置的应用程序全局异常处理程序。
关闭连接可以通过设置 实例对象为 null 即可。
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); $dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
事务与自动提交
通过PDO数据驱动连接上数据库,可以开始事务操作。事务支持四大特性:原子性,持久性,一致性,隔离性(ACID),通俗地讲,在一个事务中执行的任何操作,即使是分阶段执行的,也能保证安全地应用于数据库,并在提交时不会受到来自其他连接的干扰。事务操作也可以根据请求自动撤销(假设还没有提交),这使得在脚本中处理错误更加容易。
事务通常是通过把一批更改“积蓄”起来然后使之同时生效而实现的;这样做的好处是可以大大地提供这些更改的效率。换句话说,事务可以使脚本更快,而且可能更健壮(不过需要正确地使用事务才能获得这样的好处)。
try {
$pdo_obj->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo_obj->beginTransaction();
$pdo_obj->exec("insert into test (user , age) values('wwww' ,1)");
$pdo_obj->exec("insert into test (user , age) values('344' ,2')");
$pdo_obj->commit();
echo 'tansaction iS ok';
}catch (Exception $exception){
$pdo_obj->rollBack();
echo "Failed: " . $exception->getMessage();
}
提醒一句:PDO 仅在驱动层检查是否具有事务处理能力。如果某些运行时条件意味着事务不可用,且数据库服务接受请求去启动一个事务,PDO::beginTransaction() 将仍然返回 TRUE
而且没有错误
预处理与存储过程
预处理语即PDOStatement,很多更成熟的数据库都支持预处理语句的概念。什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。预处理语句可以带来两大好处:
查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因而运行得更快。
提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。
try {
$pdo_obj = new PDO($dsn, $user, $pass);;
$select_sql = "select * from test ";
$stmt = $pdo_obj->prepare($select_sql);
$stmt->execute();
atch(Exception $exception){
echo "Failed: " . $exception->getMessage();
}
在进行拼接SQL语句时可以通过命名占位符或问号占位符,绑定一个PHP变量到预处理SQL语句中,同样也可以通过列明或列号绑定结果集中一列到PHP变量中
$insert_sql = "insert into test (user , age) values(:user ,:age)";
//绑定一个php变量用作预处理的SQL语句中的对应 命名占位符或问号占位符 bindValue()不支持问号占位符
$stmt->bindParam(':user', $name);
$stmt->bindParam(':age', $name);
$stmt = $pdo_obj->prepare($insert_sql);
$stmt->execute(); //绑定结果集中一列到一个PHP变量中
//通过列名绑定
$stmt->bindColumn('user',$name_bind);
//通过列好绑定
$stmt->bindColumn(2,$age_bind);
错误与错误处理
PDO提供了三种不同的处理模式,以满足不同分格的开发:
PDO::ERRMODE_SILENT 默认模式PDO只将设置的错误代码
。
DO::ERRMODE_WARNING 除设置错误码之外,PDO 还将发出一条传统的 E_WARNING 信息。如果只是想看看发生了什么问题且不中断应用程序的流程。
PDO::ERRMODE_EXCEPTION 除设置错误码之外,PDO 还将抛出一个 PDOException 异常类并设置它的属性来反射错误码和错误信息
。
可以通过PDOStatement::setFetchMode(为语句设置默认的获取模式) 和 PDOStatement::setAttribute(设置语句属性)来设置错误处理模式。
PDO查询选择
- int PDO::exec(string
$statement
) 在一个单独的函数调用中执行一条 SQL 语句,返回受此语句影响的行数。不会从一条 SELECT 语句中返回结果。 - public PDOStatement PDO::query(string
$statement
) 对于在程序中只需要发出一次的 SELECT 语句,返回一个PDOStatement object。 - public PDOStatement PDO::prepare(string
$statement
) 对于需要发出多次的语句,可用 PDO::prepare() 来准备一个 PDOStatement 对象并用 PDOStatement::execute() 发出语句。
学习PDO啦的更多相关文章
- 学习PDO中的错误与错误处理模式
在 PDO 的学习过程中,我们经常会在使用事务的时候加上 try...catch 来进行事务的回滚操作,但是大家有没有注意到默认情况下 PDO 是如何处理错误语句导致的数据库操作失败问题呢?今天,我们 ...
- CANopen学习——PDO
查找资料时,发现一个很好的博客,博主剖析的通俗易懂 http://www.cnblogs.com/winshton/p/4897556.html PDO定义: 过程数据对象,用来传输实时数据.因为 ...
- [麦先生]学习PDO循序渐进使用方式
使用方式 特点一:支持跨数据库 1:首先实例化PDO,创建PDO对象的四个必备参数:host(哪一种类型的数据库,mysql/orcal/SQLserver等);dbname(数据库的名称);cha ...
- 【Alpha】Daily Scrum Meeting第十次
一.本次Daily Scrum Meeting主要内容 每个人学习情况 测试的任务的安排 Alpha版本展示的具体内容 二.任务安排 学号尾数 昨天做的任务 今天做的任务 任务用时 612 完成将计时 ...
- PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句
以数据库 msg 为例,说明 PDO 的数据提取.预处理语句: mysql> show tables;+---------------+| Tables_in_msg |+----------- ...
- PHP学习笔记之PDO
1. 何为PDO? PDO(PHP数据对象) 是一个轻量级的.具有兼容接口的PHP数据连接拓展,是一个PHP官方的PECL库,随PHP 5.1发布,需要PHP 5的面向对象支持,因而在更早的版本上无法 ...
- PHP中的PDO操作学习(四)查询结构集
关于 PDO 的最后一篇文章,我们就以查询结果集的操作为结束.在数据库的操作中,查询往往占的比例非常高.在日常的开发中,大部分的业务都是读多写少型的业务,所以掌握好查询相关的操作是我们学习的重要内容. ...
- PHP中的PDO操作学习(三)预处理类及绑定数据
要说 PDO 中最强大的功能,除了为不同的数据库提供了统一的接口之外,更重要的就是它的预处理能力,也就是 PDOStatement 所提供的功能.因为它的存在,才让我们可以安心地去使用而不用操心 SQ ...
- PHP中的PDO操作学习(二)预处理语句及事务
今天这篇文章,我们来简单的学习一下 PDO 中的预处理语句以及事务的使用,它们都是在 PDO 对象下的操作,而且并不复杂,简单的应用都能很容易地实现.只不过大部分情况下,大家都在使用框架,手写的机会非 ...
随机推荐
- wifi文件传输
步骤: 1.下载CocoaHTTPServer 2.解压后,将CocoaHTTPServer-master目录下的Core导入工程. 3.打开Samples/SimpleFileUploadServe ...
- bzoj 3230 相似子串——后缀数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3230 作出后缀数组,从 LCP 看每个位置对于本质不同子串的贡献,而且他们已经按前面部分排好 ...
- BZOJ4755:[JSOI2016]扭动的回文串
浅谈\(Manacher\):https://www.cnblogs.com/AKMer/p/10431603.html 题目传送门:https://lydsy.com/JudgeOnline/pro ...
- oscache源码浅析
oscache作为本地缓存框架,存储模型依然是通用的缓存键值对模型.oscache使用HashTable存放数据,我们看下源码: GeneralCacheAdministrator: /** * Ge ...
- PHP 16 个编程法则
HP是最好的编程语言.对于PHP开发者来说,掌握一些编程法则是十分重要的.而在PHP中,以双下划线(__)开头的方法称为魔术方法,它们扮演着非常重要的角色. 常用的魔术方法包括: -__constru ...
- 洛谷 P3302 [SDOI2013]森林 Lebal:主席树 + 启发式合并 + LCA
题目描述 小Z有一片森林,含有N个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有M条边. 小Z希望执行T个操作,操作有两类: Q x y k查询点x到点y路径上所有的权值中,第k小的权 ...
- 杂项:UN-APP
ylbtech-杂项:APP 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返回顶部 10 ...
- zabbix设置sendmail发送邮件
http://blog.csdn.net/xin_yu_xin/article/details/45115723
- Unity3D版本之我见
关心Unity版本的变化以及了解未来版本的内容是专业做Unity的同学必备的功课,下面我来说一下我对4.0以后版本的一些见解. v4.0: 这个版本比3.5有较大的跳跃,首先最大卖点是新的动作系统Me ...
- 关于学习ios开发的一些笔记
关于方法前的 + - 符号 前置加号(+)的方法为类方法,这类方法是可以直接用类名来调用的,它的作用主要是创建一个实例.相当于是静态的方法. 前置减号(-)的方法为实例方法,必须使用类的实例才可以调用 ...