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 相关文章推荐
用PHP将数据导入到Foxmail
Oct 09 PHP
PHP生成UTF8文件的方法
May 15 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
Jul 01 PHP
php将数组转换成csv格式文件输出的方法
Mar 14 PHP
微信公众平台开发之天气预报功能
Aug 31 PHP
php接口技术实例详解
Dec 07 PHP
ThinkPHP中调用PHPExcel的实现代码
Apr 08 PHP
Yii2第三方类库插件Imagine的安装和使用
Jul 06 PHP
PHP手机短信验证码实现流程详解
May 17 PHP
thinkPHP框架实现的短信接口验证码功能示例
Jun 20 PHP
laravel通用化的CURD的实现
Dec 13 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
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
第五章 php数组操作
2011/12/30 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
php实现小程序支付完整版
2018/10/09 PHP
PHP递归算法的简单实例
2019/02/28 PHP
jquery索引在使用中的一些困惑
2013/10/24 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
详解用场景去理解函数柯里化(入门篇)
2019/04/11 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
分享vim python缩进等一些配置
2018/07/02 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
幼儿园家长会邀请函
2014/01/15 职场文书
幼儿园新年寄语
2014/04/03 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL
Java异常体系非正常停止和分类
2022/06/14 Java/Android