PDO 用法学习
时间:2015-01-19 14:07 来源:linux.it.net.cn 作者:IT
PDO: php data object
数据库访问抽象层
基于驱动:
1、安装扩展 php_pdo.dll
2、安装驱动 php_pdo_mysql.dll
linux 编译时参数:--with-pdo=mysql=/usr/local/mysql
三个类:
PDO类, 数据库连接有关(连接、执行sql)
PDOStatement 准备语句,处理结果集
PDOException 异常处理类
一些常量
相比mysqli方法少,常量多
dsn:data source name(数据源)
#部分参数可以省略,参数没有顺序
mysql: #最短 会自动调取 php.in 中 mysql.default_host 参数信息
dsn示例:
mysql:host=localhost;port=3307;dbname=testdb
mysql:unix_socket=/tmp/mysql.sock;dbname=testdb
获取pdo对象
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test";
$opts = array(PDO::ATTR_AUTOCOMMIT=>0, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_AUTOCOMMIT=>0 #关闭自动提交, PDO::ATTR_TIMEOUT => 3 #设置超时时间);
$pdo = new PDO($dsn, 'root', '', $opts);
ee($pdo->getAttribute(PDO::ATTR_AUTOCOMMIT)); // setAttribute 可以设置属性
执行sql exec() query() perpare();
1、返回 PDOStatement 对象 query select #PDOStatement是专门用来处理结果集的
2、返回影响行数(int) exec insert delete update
PDO::ERRMODE_SILENT(0) :默认 不提示任何错误
PDO::ERRMODE_WARNING(1) : 警告
PDO::ERRMODE_EXCEPTION(2):异常(推荐使用) 用try catch捕获,也可以手动抛出异常 new PDOException($message, $code, $previous)
#exec用法
try {
$sql = "insert into limove(`id`, `name`, `order`) values(null, 'sjk', 1)";
$rows = $pdo->exec($sql); //影响的条数
$pdo->lastInsertId(); //最后插入的id
} catch (Exception $e) {
ee($pdo->errorInfo());
}
预处理语句(prepare)示例
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test";
$opts = array(PDO::ATTR_AUTOCOMMIT=>0, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_AUTOCOMMIT=>0);
try {
$pdo = new PDO($dsn, 'root', '', $opts);
}catch(PDOException $e){
echo $e->getMessage();
}
/* pdo中有两种占位符号
*
* ? 参数 --- 索引数组, 按索引顺序使用
* 名子参数 ----关联数组, 按名称使用,和顺序无关
*/
//准备好了一条语句,并入到服务器端,也已经编译过来了,就差为它分配数据过来
//同样适用于更新操作
$stmt=$pdo->prepare("insert into limove(`name`, `order`) values(:name,:order)");
//绑定参数,引用方式传递
$stmt->bindParam(":name", $name);
$stmt->bindParam(":order", $order);
// $stmt=$pdo->prepare("insert into limove(`name`, `order`) values(?, ?)"); //所有SQL都可执行
// //绑定参数,引用方式传递
// $stmt->bindParam(1, $name, PDO::PARAM_STR);
// $stmt->bindParam(2, $order, PDO::PARAM_INT);
$name="wwww";
$order = 1;
if($stmt->execute()){
echo "执行成功";
echo "最后插入的ID:".$pdo->lastInsertId();
}else{
echo "执行失败!";
}
还支持执行时绑定
#无序方式
$stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(:name,:price, :num, :desn)");
$stmt->execute(array(":price"=>77, ":name"=>"kkk3", ":num"=>"453", ":desn"=>"aaaaaa3"));
#有序方式
$stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(?, ?, ?, ?)"); //所有SQL都可执行
$stmt->execute(array("myname1", 11.2, 55, "very good"));
获取结果
//获取结果
$stmt = $pdo->prepare("select * from limove where `order` = :order");
$stmt->execute(array(':order'=>8));
//设置获取的方式
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$data = array();
//方式1
//$data = $stmt->fetchAll();
//方式2
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
$data[] = $row;
}
ee($data);
//bindColumn 把取出的值绑定到一个变量上
$stmt->bindColumn('name', $name);
#所有的条数,select insert delete update
$stmp->rowCount();
事务举例:
<?php
try{
$pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456", array(PDO::ATTR_AUTOCOMMIT=>0)); #一定要关闭自动提交
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); #开启异常模式
}catch(PDOException $e){
echo "数据库连接失败:".$e->getMessage();
exit;
}
//执行SQL语句 exec() query() prepare()
//一是有结果集的query(), 执行select语句
//exec()用来执行有影响行数的,update, delete insert, other
//exec()返回的是影响的行数
/*
*
* 事务处理
*
* 张三从李四那里买了一台 2000 元的电脑
*
* 从张三帐号中扣出 2000元
*
* 向李四账号中加入 2000元
*
* 从商品表中减少一台电脑
*
* MyIsAM InnoDB
*
*/
try{
$pdo->beginTransaction();
$price=500;
$sql="update zhanghao set price=price-{$price} where id=1";
$affected_rows=$pdo->exec($sql);
if(!$affected_rows)
throw new PDOException("张三转出失败");
$sql="update zhanghao set price=price+{$price} where id=3";
$affected_rows=$pdo->exec($sql);
if(!$affected_rows) #发现问题手动抛出异常
throw new PDOException("向李四转入失败");
echo "交易成功!";
$pdo->commit();
}catch(PDOException $e){
echo $e->getMessage();
$pdo->rollback(); //只要捕获异常则回滚
}
//不管执行成功还是失败最后都要在关闭自动提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
//设置错误报告模式 ERRMODE_SILENT ERRMODE_WARNING
(责任编辑:IT)
PDO: php data object linux 编译时参数:--with-pdo=mysql=/usr/local/mysql
三个类: 相比mysqli方法少,常量多
dsn:data source name(数据源) dsn示例: mysql:host=localhost;port=3307;dbname=testdb mysql:unix_socket=/tmp/mysql.sock;dbname=testdb 获取pdo对象
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test"; $opts = array(PDO::ATTR_AUTOCOMMIT=>0, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_AUTOCOMMIT=>0 #关闭自动提交, PDO::ATTR_TIMEOUT => 3 #设置超时时间); $pdo = new PDO($dsn, 'root', '', $opts); ee($pdo->getAttribute(PDO::ATTR_AUTOCOMMIT)); // setAttribute 可以设置属性
执行sql exec() query() perpare();
PDO::ERRMODE_SILENT(0) :默认 不提示任何错误
#exec用法 try { $sql = "insert into limove(`id`, `name`, `order`) values(null, 'sjk', 1)"; $rows = $pdo->exec($sql); //影响的条数 $pdo->lastInsertId(); //最后插入的id } catch (Exception $e) { ee($pdo->errorInfo()); }
预处理语句(prepare)示例 $dsn = "mysql:host=127.0.0.1;port=3306;dbname=test"; $opts = array(PDO::ATTR_AUTOCOMMIT=>0, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_AUTOCOMMIT=>0); try { $pdo = new PDO($dsn, 'root', '', $opts); }catch(PDOException $e){ echo $e->getMessage(); } /* pdo中有两种占位符号 * * ? 参数 --- 索引数组, 按索引顺序使用 * 名子参数 ----关联数组, 按名称使用,和顺序无关 */ //准备好了一条语句,并入到服务器端,也已经编译过来了,就差为它分配数据过来 //同样适用于更新操作 $stmt=$pdo->prepare("insert into limove(`name`, `order`) values(:name,:order)"); //绑定参数,引用方式传递 $stmt->bindParam(":name", $name); $stmt->bindParam(":order", $order); // $stmt=$pdo->prepare("insert into limove(`name`, `order`) values(?, ?)"); //所有SQL都可执行 // //绑定参数,引用方式传递 // $stmt->bindParam(1, $name, PDO::PARAM_STR); // $stmt->bindParam(2, $order, PDO::PARAM_INT); $name="wwww"; $order = 1; if($stmt->execute()){ echo "执行成功"; echo "最后插入的ID:".$pdo->lastInsertId(); }else{ echo "执行失败!"; }
还支持执行时绑定 #无序方式 $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(:name,:price, :num, :desn)"); $stmt->execute(array(":price"=>77, ":name"=>"kkk3", ":num"=>"453", ":desn"=>"aaaaaa3")); #有序方式 $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(?, ?, ?, ?)"); //所有SQL都可执行 $stmt->execute(array("myname1", 11.2, 55, "very good"));
获取结果 //获取结果 $stmt = $pdo->prepare("select * from limove where `order` = :order"); $stmt->execute(array(':order'=>8)); //设置获取的方式 $stmt->setFetchMode(PDO::FETCH_ASSOC); $data = array(); //方式1 //$data = $stmt->fetchAll(); //方式2 while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $data[] = $row; } ee($data);
//bindColumn 把取出的值绑定到一个变量上 $stmt->bindColumn('name', $name);
#所有的条数,select insert delete update $stmp->rowCount();
事务举例: <?php try{ $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456", array(PDO::ATTR_AUTOCOMMIT=>0)); #一定要关闭自动提交 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); #开启异常模式 }catch(PDOException $e){ echo "数据库连接失败:".$e->getMessage(); exit; } //执行SQL语句 exec() query() prepare() //一是有结果集的query(), 执行select语句 //exec()用来执行有影响行数的,update, delete insert, other //exec()返回的是影响的行数 /* * * 事务处理 * * 张三从李四那里买了一台 2000 元的电脑 * * 从张三帐号中扣出 2000元 * * 向李四账号中加入 2000元 * * 从商品表中减少一台电脑 * * MyIsAM InnoDB * */ try{ $pdo->beginTransaction(); $price=500; $sql="update zhanghao set price=price-{$price} where id=1"; $affected_rows=$pdo->exec($sql); if(!$affected_rows) throw new PDOException("张三转出失败"); $sql="update zhanghao set price=price+{$price} where id=3"; $affected_rows=$pdo->exec($sql); if(!$affected_rows) #发现问题手动抛出异常 throw new PDOException("向李四转入失败"); echo "交易成功!"; $pdo->commit(); }catch(PDOException $e){ echo $e->getMessage(); $pdo->rollback(); //只要捕获异常则回滚 } //不管执行成功还是失败最后都要在关闭自动提交 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1); //设置错误报告模式 ERRMODE_SILENT ERRMODE_WARNING
(责任编辑:IT) |