PHP数据库抽象层--PDO(PHP Data Object) [一]
1、简介:(PDO数据库访问抽象层,统一各种 数据库的访问接口 )
- PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 注意利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个 具体数据库的 PDO 驱动 来访问数据库服务。
- PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO 不不提供 数据库 抽象层;它不会重写 SQL,也不会模拟缺失的特性。如果需要的话,应该使用一个成熟的抽象层。
- (http://php.net/manual/zh/intro.pdo.php)

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll



1<?php
2// 通过参数形式连接数据库
3try{
4 $dsn ='mysql:host=localhost;dbname=pdotest';
5 $name ='root';
6 $passwd ='root';
7 $pdo =new PDO($dsn, $name, $passwd);
8 var_dump($pdo);
9}catch(PDOException $e){
10 echo $e->getMessage();
11}
12
mysql:dbname=pdotest;host=localhost;
<?php
// 通过参数形式连接数据库
try{
$dsn ='uri:/var/www/html/php-code/pdo/pdo_uri_conn.txt';
$name ='root';
$passwd ='root';
$pdo =new PDO($dsn, $name, $passwd);
var_dump($pdo);
}catch(PDOException $e){
echo $e->getMessage();
}


<?php
......
// 现在运行完成,在此关闭连接
$dbh =null;

1<?php
2// 通过参数形式连接数据库
3try{
4 $dsn ='mysql:host=localhost;dbname=pdotest';
5 $name ='root';
6 $passwd ='root';
7 $pdo =new PDO($dsn, $name, $passwd);
8 $sql =<<<EOF
9 CREATE TABLE IF NOT EXISTS user(
10 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
11 name VARCHAR(20) NOT NULL UNIQUE,
12 passwd VARCHAR(32) NOT NULL,
13 email VARCHAR(30) NOT NULL
14);
15 EOF;
16// exec 对于没有受影响的行数将返回0
17 $res = $pdo->exec($sql);
18 var_dump($res);
19// 现在运行完成,在此关闭连接
20 $pdo =null;
21}catch(PDOException $e){
22 echo $e->getMessage();
23}
24
25
1<?php
2// 通过参数形式连接数据库
3try{
4 $dsn ='mysql:host=localhost;dbname=pdotest';
5 $name ='root';
6 $passwd ='root';
7 $pdo =new PDO($dsn, $name, $passwd);
8 $sql ="
9 INSERT INTO user (name, passwd, email)
10 VALUES('wangxb', MD5('123'), 'wangxb@mail.com'),
11 ('wangxb1', MD5('123'), 'wangxb@mail.com'),
12 ('wangxb2', MD5('123'), 'wangxb@mail.com')
13 ";
14// exec 对于没有受影响的行数将返回0
15 $res = $pdo->exec($sql);
16 var_dump($res);
17// 返回最后插入行的ID或序列值
18 echo $pdo->lastInsertId();
19// 现在运行完成,在此关闭连接
20 $pdo =null;
21}catch(PDOException $e){
22 echo $e->getMessage();
23}
24

0: SQLSTATE error code1: specific error code.2: specific error message
1<?php
2/*
3 * 使用errorCode 和 errorInfo 两个方法显示错误信息
1 <?php
2 /*
3 * 使用errorCode 和 errorInfo 两个方法显示错误信息
4 */
5try{
6 $dsn ='mysql:host=localhost;dbname=pdotest';
7 $name ='root';
8 $passwd ='root';
9 $pdo =new PDO($dsn, $name, $passwd);
10// 我们这里插入的一个没有的表 user123 中
11 $sql ="
12 INSERT INTO user123 (name, passwd, email)
13 VALUES('wangxb', MD5('123'), 'wangxb@mail.com')
14 ";
15//
16 $res = $pdo->exec($sql);
17if(false=== $res){
18// errorCode 获取跟数据库句柄上一次操作相关的 SQLSTATE
19 echo $pdo->errorCode();
20print"\n";
21// errorInfo 返回一个错误信息数据:
22// 0: SQLSTATE error code
23// 1: specific error code.
24// 2: specific error message
25 print_r($pdo->errorInfo());
26returnfalse;
27}
28 var_dump($res);
29// 返回最后插入行的ID或序列值
30 echo "最后一天插入的信息ID:".$pdo->lastInsertId();
31// 现在运行完成,在此关闭连接
32 $pdo =null;
33}catch(PDOException $e){
34 echo $e->getMessage();
35}
36
运行:
我们在mysql客户端执行相同语句
可以看到 errorInfo()返回的信息其实是将mysql错误信息以数组的形式返回
1<?php
2/*
3 * 使用exec方法执行插入语句
4 */
5// 通过参数形式连接数据库
6try{
7 $dsn ='mysql:host=localhost;dbname=pdotest';
8 $name ='root';
9 $passwd ='root';
10 $pdo =new PDO($dsn, $name, $passwd);
11//$sql = "SELECT * FROM user WHERE id=12";
12 $sql ="SELECT * FROM user";
13// query 方法执行将返回一个PDOStatment对象
14 $stmt = $pdo->query($sql);
15if(!$pdo &&!$stmt){
16 var_dump($pdo->errorInof());
17}
18// 对于query返回的PDOStatment对象,我们同样可是使用foreach方法来遍历数据其中的数据
19foreach($stmt as $row){
20 var_dump($row);
21 echo '<hr>';
22}
23
24//
25 echo '-------------------<br>';
26 var_dump($stmt->fetch());
27 echo '-------------------<br>';
28
29// prepare方法是为execute准备一个statmentObj
30 $sth = $pdo -> prepare ("SELECT name, id FROM user");
31 $sth -> execute ();
32 echo '++++++++++++++++++++++++';
33 var_dump($sth->fetch());
34 echo '++++++++++++++++++++++++';
35 var_dump($stmt);
36// 现在运行完成,在此关闭连接
37 $pdo =null;
38}catch(PDOException $e){
39 echo $e->getMessage();
40}
41
42
43
1<?php
2/*
3 * 使用exec方法执行插入语句
4 */
5// 通过参数形式连接数据库
6try{
7 $dsn ='mysql:host=localhost;dbname=pdotest';
8 $name ='root';
9 $passwd ='root';
10 $pdo =new PDO($dsn, $name, $passwd);
11
12/*
13 * 使用prepare和execute方法形式
14 */
15 $id1 =12;
16 $id2 =13;
17// 利用占位符形式
18 $sql ="SELECT * FROM user WHERE id=? OR id=?";
19 $sth = $pdo -> prepare ($sql);
20 $sth -> execute(array($id1, $id2));
21 var_dump($sth->fetchAll(PDO::FETCH_ASSOC));
22
23 echo '<hr>';
24// 使用参数形式
25 $sql_1 ="SELECT id, name FROM user WHERE id= :id";
26 $sth_1 = $pdo -> prepare ($sql_1);
27 $sth_1 -> execute(array('id'=>$id1));
28 var_dump($sth_1->fetchAll(PDO::FETCH_ASSOC));
29
30 echo '<hr>';
31// 使用bindParam方式
32 $sql_2 ="SELECT * FROM user WHERE id=? OR id=?";
33 $sth_2 = $pdo -> prepare ($sql_2);
34 $sth_2->bindParam(1, $id1, PDO::PARAM_INT);
35 $sth_2->bindParam(2, $id2, PDO::PARAM_INT);
36 $sth_2 -> execute();
37 var_dump($sth_2->fetchAll(PDO::FETCH_ASSOC));
38
39// 现在运行完成,在此关闭连接
40 $pdo =null;
41}catch(PDOException $e){
42 echo $e->getMessage();
43}
44

1<?php
2/*
3 * 使用exec方法执行插入语句
4 */
5// 通过参数形式连接数据库
6try{
7 $dsn ='mysql:host=localhost;dbname=pdotest';
8 $name ='root';
9 $passwd ='root';
10 $pdo =new PDO($dsn, $name, $passwd);
11 $sql ="SELECT * FROM user";
12 echo "自动提交:".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
13 echo '<br/>';
14 echo 'PDO默认的错误处理模式:'.$pdo->getAttribute(PDO::ATTR_ERRMODE);
15
16 echo '<br/>';
17//现在我们重设自动提交
18 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
19 echo "重设后的自动提交:".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
20
21// 现在运行完成,在此关闭连接
22 $pdo =null;
23
24// 我们也可以在new一个PDO对象时,利用传递参数中的第四个参数(可省略)来设置我们此次连接数据库时的各项参数
25// (我们可以在这里找到所有的设置项:http://php.net/manual/zh/pdo.constants.php)
26// 就像下面这样
27 $dsn ='mysql:host=localhost;dbname=pdotest';
28 $name ='root';
29 $passwd ='root';
30 $option = array(
31 PDO::ATTR_AUTOCOMMIT => O,
32 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
33);
34 $pdo =new PDO($dsn, $name, $passwd, $option);
35 echo '<hr/>';
36 echo '使用option设置后';
37 echo '<br/>';
38 echo "自动提交:".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
39 echo '<br/>';
40 echo 'PDO错误处理模式:'.$pdo->getAttribute(PDO::ATTR_ERRMODE);
41}catch(PDOException $e){
42 echo $e->getMessage();
43}
44

PHP数据库抽象层--PDO(PHP Data Object) [一]的更多相关文章
- 数据库抽象层PDO
通过数据库抽象层PDO可以访问多个数据库 //数据库抽象层PDO //造DSN:驱动名:dbname=数据库名:host=服务器地址 $dsn = "mysql:dbname=mydb;ho ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 2
18.2 PDO所支持的数据库 使用PHP可以处理各种数据库系统,包括MySQL.PostgreSQL.Oracle.MsSQL等.但访问不同的数据库系统时,其所使用的PHP扩展函数也是不同的.例如 ...
- PHP 数据库抽象层pdo
PDO是PHP数据对象(PHP Data Object)的缩写. pdo就是一个"数据库访问抽象层",作用是统一各种数据库的访问接口,能够轻松地在不同数据库之间进行切换,使得数据库 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 1
现在,如果你已经能熟练地使用MySQL客户端软件来操作数据库中的数据,就可以开始学习如何使用PHP来显示和修改数据库中的数据了.PHP提供了标准的函数来操作数据库.在PHP 5以上的版本中可以使用My ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 5
18.5 使用PDO对象 PDO扩展类库为PHP访问数据库定义了一个轻量级.一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据,大大简化了数据 ...
- 【代码总结】数据库抽象层PDO
一.概述 PDO就是一个"数据库访问抽象层",起作用是统一各种数据库的访问接口,能够轻松的在不同数据库之间进行切换. 二.PDO的安装 编辑php.ini文件 添加 extensi ...
- 数据库抽象层 pdo
一 . PDO的连接 $host = "localhost"; $dbname = "hejuntest"; $username = "root&qu ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 12
18.9 管理表books实例 在Web项目中,几乎所有模块都要和数据表打交道,而对表的管理无非就是增.删.改.查等操作,所以熟练掌握对表进行管理的这些常见操作是十分有必的.本例为了能更好地展示PD ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 9
18.7 PDO的事务处理 事务是确保数据库一致的机制,是一个或一系列的查询,作为一个单元的一组有序的数据库操作.如果组中的所有SQL语句都操作成功,则认为事务成功,那么事务被提交,其修改将作用于所 ...
随机推荐
- 转载:canal数据库同步redis
ref: http://blog.csdn.net/tb3039450/article/details/53928351
- Axel与Wget下载工具
Axel工具是linux下的http/ftp中强大下载工具,支持多线程和断点续传下载.且可以从多个地址或者从一个地址的多个连接来下载同一个文件. 常用的选项: [root@wjoyxt ~]# axe ...
- linux多路径配置
一.什么是多路径 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块网卡及IP来 ...
- git 使用备忘
git首次安装后的设置: 首先打开hash.exe输入用户名和邮箱 1 2 $ git config --global user.name "Your Name" $ git co ...
- java开源项目jremoting
https://github.com/jremoting/jremoting jremoting是一个类似dubbo的rpc服务治理框架,并且可以与dubbo相互调用.jremoting的实现是参考了 ...
- zookeeper集群搭建 windows
本次zk测试部署版本为3.4.6版本,下载地址http://mirrors.cnnic.cn/apache/zookeeper/ 限于服务器个数有限本次测试了两种情况 1.单节点方式:部署在一台服务器 ...
- IE6 PNG不透明问题 (只解决img标签的图片)
<script type='text/javascript' src="/script/ie6.pngfix.js"></script> 会让一些posit ...
- for循环语句个人小结
重新看了一下光盘上的用for循环写一个菱形的答案,发现了其实有几点是可以灵活运用的: 1,当定义行数的时候,也可以用相等的间断的数字隔开,比如 for(int a = 5; a >= 1; a- ...
- 不同的子序列 · Distinct Subsequences
[抄题]: 给出字符串S和字符串T,计算S的不同的子序列中T出现的个数. 子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响.(比如,“ACE”是“ ...
- Spring集成Redis使用注解
转载:http://blog.csdn.net/u013725455/article/details/52129283 使用Maven项目,添加jar文件依赖: <project xmlns=& ...