PDO大数据对象的存取与PDO事务处理

zxh5566  2016-07-17 15:11   Hits: 

在项目开发中,有时会需要在数据库中存储大型数据,大型对象可以是文本的数据,也可以是二进制的图片,电影等,PDO允许在bindParam()或bindColumn()调用中通过使用PDO::PARAM_LOB类型代码来使用大型数据类型,PDO::PARAM_LOB告诉PDO将数据映射为流,所以可以使用PHP中文件处理函数来操纵这样的数据,下面是将上传的图像插入到一个数据库中的示例:
 
<?php
$dbh = new PDO("mysql:dbname=testdb;host=localhost",'user','pwd');
$stmt = $dbh->prepare("insert into contactinfo (contenttyoe,imagedata) values (?,?)");
$fp = fopen($_FILES['file']['tmp_name'],'rb');
$stmt->bindParam(1,$_FILES['file']['type']);
$stmt->bindParam(2,$fp,PDO_PARAM_LOB);
$stmt->execute();
?>
 
事务有4个重要特性,原子性,一致性,独立性,持久性,对于在一个事务中执行的任何工作,即使它是分阶段执行的,也一定可以保证该工作会安全地应用于数据库,并且在工作被提交时,不会受到来自其他连接的影响。
 
并不是每种数据库都支持事务,PDO只为能够执行事务的数据库提供事务服务,所以当第一次打开连接时,PDO需要在自动提交auto-commit模式下运行,如果需要一个事务,那么必须使用PDO对象中的beginTransaction()方法启动一个事务,如果底层驱动程序不支持事务,那么将会抛出一个PDOException异常,在一个事务中,可以使用PDO对象中的commit()方法或rollBack()方法来结束事务,这取决于事务运行的代码是否成功,一个简单的事务处理示例如下:
 
<?php
try{
$dbh = new PDO("mysql:dbname=testdb;host=localhost",'user','pwd');
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERROMDE_EXCEPTION);
$dbh->beginTransaction();
$dbh->exec("insert into staff(id,name,position) values (23,'tom','programmer')");
$dbh->exec("insert into salary(id,amount,changedate) values (23,5000,NOW())");
$dbh->commit();
}catch(PDOException $e){
$dbh->rollBack();
echo '失败'.$e->getMessage();
}
?>
 
在上面的示例中,假设我们为一个新雇员创建一条记录,这个雇员ID号为23,除了输入这个人的基本信息,我们还需要记录雇员薪水,两个更新分别完成起来很简单,但通过将这两个更新包含在beginTransaction()和commit()调用中,就可以保证在更改完成之前,其他人无法看到更改,如果发生错误,catch可以回滚事务开始以来发生的所有更改,并打印出一条错误信息
 
?>
上一篇: PDO获取数据
下一篇:如何设计网页效果图