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 URL编码解码函数代码
Mar 10 PHP
使用迭代器 遍历文件信息的详解
Jun 08 PHP
php读取csv文件并输出的方法
Mar 14 PHP
php curl请求信息和返回信息设置代码实例
Apr 27 PHP
php抽象类用法实例分析
Jul 07 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
Feb 26 PHP
图文详解PHP环境搭建教程
Jul 16 PHP
Docker配置PHP开发环境教程
Dec 21 PHP
Yii2 queue的队列使用详解
Jul 19 PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
php生成动态验证码gif图片
2015/10/19 PHP
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
微信小程序实现带放大效果的轮播图
2020/05/26 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
python 实现堆排序算法代码
2012/06/05 Python
python目录与文件名操作例子
2016/08/28 Python
详解django三种文件下载方式
2018/04/06 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
Python实现京东秒杀功能代码
2019/05/16 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
广告学专业推荐信范文
2013/11/23 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
2014年医生工作总结
2014/11/21 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书
昆虫记读书笔记
2015/06/26 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
创业计划书之电动车企业
2019/10/11 职场文书
HTML+CSS 实现顶部导航栏菜单制作
2021/06/03 HTML / CSS
Python实现位图分割的效果
2021/11/20 Python
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js