PDO 指南
2016-04-21 11:22
155 查看
简介前面咱已经见过MySQLi了,现在咱一起来看看PDO类。PDO是PHP Data Objects的缩写,它被描述为“在PHP中访问数据库的轻量级,兼容性的接口”。尽管它的名字不咋好听,但PDO是一个在PHP中访问数据库会让人喜爱的方式。与MySQLi的不同MySQLi和PDO很相似,都有两方面主要区别:1.MySQLi只能访问MySQL,但PDO可以访问12种不同的数据库 2.PDO没有普通函数调用(mysqli_*functions) 开始步骤首先,你得确定一下你的PHP是否安装了PDO插件。你可以用$test=new PDO()的结果来测试。如果提示说是参数不匹配,那证明已经安装了PDO插件,如果说是对象不存在,你得先确认一下在pho.ini中php_pdo_yourssqlserverhere.extis是否被注释掉了。如果没有这句话,那你得安装PDO了,这里就不啰嗦了。 | yale8848 翻译于 3年前 1人顶 顶 翻译的不错哦! |
其它翻译版本(1) |
连接现在我们确认服务器已经工作,开始连接数据库吧:? 其他可用的DSN 。 你可以省去DSN的其他额外参数,只需要在数据库驱动后面带个冒号,比如(mysql:)。在这种情况下PDO将会尝试连接到本地数据库。就像当你使用MySQLi时需要在查询中指定数据库名称一样。 最后一件你需要注意的事情就是我们用try-catch块包裹了我们的初始化对象。PDO连接失败的时候将会抛出PDOException异常而不是查询失败的时候。如果你愿意你可以使用下面代码$db=line来选择异常的模式。 ? ? | bigtiger02 翻译于 3年前 1人顶 顶 翻译的不错哦! |
基本查询在PDO中使用query和exec两种方法使得对数据库查询变得非常简单。如果你想得到查询结果的行数exec是非常好用的,因此对SELECT查询语句是非常有用的。现在我们通过下面的一个例子查看这两种方法: ? 行数不足的是,PDO没有提供一个统一的方法去计算返回的行数。PDO Statement包含了一个叫做rowCount的方法,但是这个方法却不能保证在每一个SQL驱动中起作用(幸运的是,它能够在Mysql数据库中起作用)。如果你的SQL驱动不支持这个方法,你也有2个选择:使用二次查询(SELECT COUNT(*))或者使用简单的count($foods)得到行数。 幸运的是对我们的MySQL例子,我们可以使用下面的简单方法来输出正确的行数。 ? | NCThinker 翻译于 3年前 1人顶 顶 翻译的不错哦! |
遍历结果集打印出这些可口的食物一点也不困难:? 转义用户输入(的特殊字符)你可曾听说过(mysqli_)real_escape_string,这是用于确保用户输入安全数据。PDO提供了一个方法叫做quote,这个方法可以把输入字符串中带有引号的地方进行特殊字符转义。? ? exec()正如上面提到的,你可以使用exec()方法实现UPDATE,DELETE和INSERT 操作,执行后它会返回受影响行数的数量:? | NCThinker 翻译于 3年前 1人顶 顶 翻译的不错哦! |
预处理语句尽管exec方法和查询在PHP中仍然被大量使用和支持,但是PHP官网上还是要求大家用预处理语句的方式来替代。为什么呢?主要是因为:它更安全。预处理语句不会直接在实际查询中插入参数,这就避免了许多潜在的SQL注入。然而出于某种原因,PDO实际上并没有真正的使用预处理,它是在模拟预处理方式,在将语句传给SQL服务器之前会把参数数据插入到语句中,这使得某些系统容易受到SQL注入。 如果你的SQL服务器不真正的支持预处理,我们可以很容易的通过如下方式在PDO初始化时传参来修复这个问题: ? ? | bigtiger02 翻译于 3年前 1人顶 顶 翻译的不错哦! |
正如你所见,有两种创建参数的方法,命名的与匿名的(不可以同时出现在一个语句中)。然后你可以使用bindValue来敲进你的输入: ? 现在剩下的唯一要做的事情,就是执行我们的语句: ? ? | super0555 翻译于 3年前 0人顶 顶 翻译的不错哦! |
事务前面我们已经描述过了什么是事务:一个事务就是执行一组查询,但是并不保存他们的影响到数据库中。这样做的好处是如果你执行了4条相互依赖的插入语句,当有一条失败后,你可以回滚使得其他的数据不能够插入到数据库中,确保相互依赖的字段能够正确的插入。你需要确保你使用的数据库引擎支持事务。 开启事务你可以很简单的使用beginTransaction()方法开启一个事务:? ? | NCThinker 翻译于 3年前 1人顶 顶 翻译的不错哦! |
其他有用的选项有几个选项你可以考虑用一下。这些可以作为你的对象初始化时候的第四个参数输入。? PDO::ATTR_DEFAULT_FETCH_MODE你可以选择PDO将返回的是什么类型的结果集,如PDO::FETCH_ASSOC,会允许你使用$result['column_name'],或者PDO::FETCH_OBJ,会返回一个匿名对象,以便你使用$result->column_name你还可以将结果放入一个特定的类(模型),可以通过给每一个单独的查询设置一个读取模式,就像这样: ? PDO::ATTR_ERRMODE上面我们已经解释过这一条了,但喜欢TryCatch的人需要用到:PDO::ERRMODE_EXCEPTION。如果不论什么原因你想抛出PHP警告,就使用PDO::ERRMODE_WARNING。 | super0555 翻译于 3年前 0人顶 顶 翻译的不错哦! |
PDO::ATTR_TIMEOUT
当你为载入时间而着急时,你可以使用此属性来为你的查询指定一个超时时间,单位是秒. 注意,如果超过你设置的时间,缺省会抛出E_WARNING异常, 除非 PDO::ATTR_ERRMODE 被改变.更多属性信息可以在
PHP官网的属性设置 里查看到.
最后的思考
PDO是一个在PHP中访问你的数据库的很棒的方式,可以认为是最好的方式。除非你拒绝使用面向对象的方法或是太习惯 MySQLi 的方法名称,否则没有理由不使用PDO。更好的是完全切换到只使用预处理语句,这最终将使你的生活更轻松!
相关文章推荐
- Struts1、Struts2和SpringMVC
- 内存管理 进程 线程
- Java开发 - 异常 - 抛出异常
- CentOS6.4 配置Tengine(转)
- 前端进阶-让你升级的网络知识
- SQLite数据库总结
- 剑指offerr面试题 调整数组顺序使奇数位于偶数前面
- php设计模式 策略模式。
- Linux常用命令
- shell中条件判断if中的-z到-d的意思
- shell脚本编写
- Web前端优化最佳实践及工具集锦
- java 第三方登录之QQ登录
- Java中的23种设计模式与7大原则概述
- Windows下多个版本Qt的安装配置
- 机器学习中的相似性度量
- string和char*的相互转换
- String字符串进行添加的操作实现换行的实例
- php如何获取error log
- ls 按大小排序 按时间排序