PDO的安全处理与事物处理方法


Posted in PHP onOctober 31, 2016

事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行,并且在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操作. 如果执行成功, 那么这一系列操作都会永久有效. 事务很好的解决了在操作数据库的时候不同步的问题. 同时, 通过事务去执行大数据量的时候, 执行效率可以提高很多很多.

事务处理具有四个特性:原子性、一致性、独立性、持久性。并不是所有的数据库都支持事务处理的,PDO 为能够执行事务处理的数据库提供事务支持。

一.PDO异常处理
PDO::ATTR_ERRMODE

1) PDO::ATTR_ERRMODE//不报错误(忽略)(0)

2) PDO::ERRMODE_WARNING
//以警告的方式报错(1)

3) PDO::ERRMODE_EXCEPTION  //以异常的方式报错(2)

<?php 
//默认是PDO::ATTR_ERRMODE 不报错误(忽略)(0),需要用errorCode()、errorInfo() 
try{ 
  $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); 
//  $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); 
  $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
}catch (PDOException $e){ 
  die("fail to connect db".$e->getMessage()); 
} 
$sql="INSERT INTO user VALUES(null,'dabao','26')"; 
try{ 
  $res=$pdo->exec($sql); 
}catch (PDOException $e){ 
  echo $e->getMessage(); 
} 
//$res=$pdo->exec($sql); 
//if($res){ 
//  echo 'OK'; 
//}else{ 
//  echo $pdo->errorCode(); 
//  echo '<br/>'; 
//  print_r($pdo->errorInfo()); 
//}

二.PDO预处理方法

1) prepare()    //用于执行查询SQL语句,返回PDOStatement对象

2) bindValue()  //将值绑定到对应的一个参数,返回布尔值

3) bindParam()  //将参数绑定到相应的查询占位符上,返回布尔值

4) bindColumn() //用来匹配列名和一个指定的变量名

5) execute()    // 执行一个准备好了的预处理语句,返回布尔值

6) rowCount() // 返回使用增、删、改、查操作语句后受影响的行总数

<?php 
/** 
 * ?号式的预处理语句,共有三种绑定方式 
 */ 
 
//1.连接数据库 
try{ 
  $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); 
}catch (PDOException $e){ 
  die("fail to connect db".$e->getMessage()); 
} 
 
//2.预处理的SQL语句 
$sql="INSERT INTO users(id,name,age) VALUES(?,?,?)"; 
$stmt=$pdo->prepare($sql); 
 
//3.对?号的参数进行绑定 
$id=null; 
$name="test103"; 
$age=103; 
 
//第一种绑定方式 
//$stmt->bindValue(1,$id); 
//$stmt->bindValue(2,$name); 
//$stmt->bindValue(3,$age); 
 
//第二种绑定方式 
//$stmt->bindParam(1,$id); 
//$stmt->bindParam(2,$name); 
//$stmt->bindParam(3,$age); 
 
//4.执行 
//$stmt->execute(); 
//第三种绑定方式:直接执行数组 
$stmt->execute(array($id,$name,$age)); 
echo $stmt->rowCount();
<?php 
/** 
 * 别名式的预处理语句,共有三种绑定方式 
 */ 
 
//1.连接数据库 
try{ 
  $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); 
}catch (PDOException $e){ 
  die("fail to connect db".$e->getMessage()); 
} 
 
//2.预处理的SQL语句 
$sql="INSERT INTO users(id,name,age) VALUES(:id,:name,:age)"; 
$stmt=$pdo->prepare($sql); 
 
//3.参数进行绑定 
$id=null; 
$name="test203"; 
$age=23; 
 
//第一种绑定方式 
//$stmt->bindValue("id",$id); 
//$stmt->bindValue("name",$name); 
//$stmt->bindValue("age",$age); 
 
//第二种绑定方式 
//$stmt->bindParam("id",$id); 
//$stmt->bindParam("name",$name); 
//$stmt->bindParam("age",$age); 
 
//4.执行 
//$stmt->execute(); 
//第三种绑定方式:直接执行数组 
$stmt->execute(array("id"=>$id,"name"=>$name,"age"=>$age)); 
echo $stmt->rowCount();
<?php 
/** 
 * 用预处理方式查询数据 
 */ 
//1.连接数据库 
try{ 
  $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); 
}catch (PDOException $e){ 
  die("fail to connect mysql".$e->getMessage()); 
} 
 
//2.预处理查询 
$sql="SELECT id,name,age FROM users"; 
$stmt=$pdo->prepare($sql); 
//3.执行 
$stmt->execute(); 
foreach($stmt as $val){ 
  echo $val['id']."------".$val['name']."------".$val['age']."<br/>"; 
}

三.事务处理操作方法介绍
1) beginTransaction()     //开启一个事物(做一个回滚点)

2) commit() 
   //提交事务

3) rollBack()            //事务回滚操作

<?php 
//1.连接数据库 
try{ 
  $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); 
  $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
}catch (PDOException $e){ 
  die("fail to connect db".$e->getMessage()); 
} 
//2.执行数据操作 
try{ 
  //开启事物 
  $pdo->beginTransaction(); 
  $sql="insert into users(id,name,age) VALUES(?,?,?)"; 
  $stmt=$pdo->prepare($sql); 
  //传入参数 
  $stmt->execute(array(null,"test1","21")); 
  $stmt->execute(array(null,"test2","22")); 
  $stmt->execute(array(null,"test3","23")); 
  //提交事物 
  $pdo->commit(); 
}catch (PDOException $e){ 
  die("fail to execute".$e->getMessage()); 
  //事物回滚 
  $pdo->roolback(); 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
下载文件的点击数回填
Oct 09 PHP
php学习笔记 数组遍历实现代码
Jun 09 PHP
php 下载保存文件保存到本地的两种实现方法
Aug 12 PHP
ThinkPHP CURD方法之order方法详解
Jun 18 PHP
php实现比较两个字符串日期大小的方法
May 12 PHP
PHP防止刷新重复提交页面的示例代码
Nov 11 PHP
Apache无法自动跳转却显示目录的解决方法
Nov 30 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
php连接sftp的作用以及实例代码
Sep 23 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
Oct 12 PHP
PHP执行linux命令6个函数代码实例
Nov 24 PHP
关于PHP数组迭代器的使用方法实例
Nov 17 PHP
PHP仿微信发红包领红包效果
Oct 30 #PHP
PHPCMS忘记后台密码的解决办法
Oct 30 #PHP
php set_include_path函数设置 include_path 配置选项
Oct 30 #PHP
php 截取utf-8格式的字符串实例代码
Oct 30 #PHP
php mysql like 实现多关键词搜索的方法
Oct 29 #PHP
PHP请求远程地址设置超时时间的解决方法
Oct 29 #PHP
浅谈php处理后端&amp;接口访问超时的解决方法
Oct 29 #PHP
You might like
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
php入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
javascript引用对象的方法代码
2007/08/13 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
JS拖拽插件实现步骤
2015/08/03 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
Python 爬虫多线程详解及实例代码
2016/10/08 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
Python读取图片为16进制表示简单代码
2018/01/19 Python
使用Python进行目录的对比方法
2018/11/01 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
python学生信息管理系统实现代码
2019/12/17 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
python调用百度API实现人脸识别
2020/11/17 Python
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
英国女性时尚鞋类的潮流制造者:Koi Footwear
2018/10/19 全球购物
品学兼优的大学生自我评价
2013/09/20 职场文书
高中毕业自我鉴定
2013/12/22 职场文书
幼儿园大班教学反思
2014/02/10 职场文书
弘扬民族精神演讲稿
2014/05/07 职场文书
云南省召开党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
调任通知
2015/04/21 职场文书