PDO的安全处理与事物处理方法
事务(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=newPDO("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("failtoconnectdb".$e->getMessage()); } $sql="INSERTINTOuserVALUES(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=newPDO("mysql:host=localhost;dbname=myapp","root",""); }catch(PDOException$e){ die("failtoconnectdb".$e->getMessage()); } //2.预处理的SQL语句 $sql="INSERTINTOusers(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=newPDO("mysql:host=localhost;dbname=myapp","root",""); }catch(PDOException$e){ die("failtoconnectdb".$e->getMessage()); } //2.预处理的SQL语句 $sql="INSERTINTOusers(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=newPDO("mysql:host=localhost;dbname=myapp","root",""); }catch(PDOException$e){ die("failtoconnectmysql".$e->getMessage()); } //2.预处理查询 $sql="SELECTid,name,ageFROMusers"; $stmt=$pdo->prepare($sql); //3.执行 $stmt->execute(); foreach($stmtas$val){ echo$val['id']."------".$val['name']."------".$val['age']."<br/>"; }
三.事务处理操作方法介绍
1)beginTransaction() //开启一个事物(做一个回滚点)
2)commit()
//提交事务
3)rollBack() //事务回滚操作
<?php //1.连接数据库 try{ $pdo=newPDO("mysql:host=localhost;dbname=myapp","root",""); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); }catch(PDOException$e){ die("failtoconnectdb".$e->getMessage()); } //2.执行数据操作 try{ //开启事物 $pdo->beginTransaction(); $sql="insertintousers(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("failtoexecute".$e->getMessage()); //事物回滚 $pdo->roolback(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。