欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PDO的安全处理与事物处理方法

程序员文章站 2024-03-02 23:52:46
事务 (transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 sql 语句, 然后一起执行,并且在执行的过程中, 如果其中的某条执行...

事务 (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(); 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。