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 相关文章推荐
在WIN98下以apache模块方式安装php
Oct 09 PHP
用PHP和ACCESS写聊天室(七)
Oct 09 PHP
PHP采集腾讯微博的实现代码
Jan 19 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
php单一接口的实现方法
Jun 20 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
Oct 10 PHP
基于PHP如何把汉字转化为拼音
Dec 11 PHP
开启PHP的伪静态模式
Dec 31 PHP
Joomla调用系统自带编辑器的实现方法
May 05 PHP
PHP获取访问页面HTTP状态码的实现代码
Nov 03 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 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过滤★等特殊符号的正则
2014/01/27 PHP
php多文件上传下载示例分享
2014/02/20 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
javascript 类方法定义还是有点区别
2009/04/15 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
原生JS写Ajax的请求函数功能
2017/12/22 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
使用css3绘制出各种几何图形
2016/08/17 HTML / CSS
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
Burt’s Bees英国官网:世界领先的天然个人护理品牌
2020/08/17 全球购物
写一个方法1000的阶乘
2012/11/21 面试题
公司部门司机岗位职责
2014/01/03 职场文书
教师网络培训感言
2014/03/09 职场文书
《生命的药方》教学反思
2014/04/08 职场文书
蓝颜请假条
2014/04/11 职场文书
数控机床专业自荐信
2014/05/19 职场文书
群众路线个人剖析材料
2014/10/07 职场文书
中学生检讨书1000字
2014/10/28 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
Nginx下配置Https证书详细过程
2021/04/01 Servers
python控制台打印log输出重复的解决方法
2021/05/14 Python
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技