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桌面中心(二) 数据库写入
Mar 11 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
Oct 03 PHP
php导入导出excel实例
Oct 25 PHP
php实现encode64编码类实例
Mar 24 PHP
php实现在服务器端调整图片大小的方法
Jun 16 PHP
php接口技术实例详解
Dec 07 PHP
PHP isset()与empty()的使用区别详解
Feb 10 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
PHP+JS实现的实时搜索提示功能
Mar 13 PHP
php压缩文件夹最新版
Jul 18 PHP
PHP的mysqli_set_charset()函数讲解
Jan 23 PHP
Laravel validate error处理,ajax,json示例
Oct 25 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保存session的方法
2014/08/23 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
javascript获取隐藏dom的宽高 具体实现
2013/07/14 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
结合axios对项目中的api请求进行封装操作
2020/09/21 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
angular *Ngif else用法详解
2020/12/15 Javascript
Python排序搜索基本算法之归并排序实例分析
2017/12/08 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
python3.6根据m3u8下载mp4视频
2019/06/17 Python
Python中turtle库的使用实例
2019/09/09 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
基于Python实现简单学生管理系统
2020/07/24 Python
python字符串拼接+和join的区别详解
2020/12/03 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
CSS3 简写animation
2012/05/10 HTML / CSS
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
六五普法学习心得体会
2016/01/21 职场文书
Python实现简繁体转换
2021/06/07 Python