PDO安全处理和事务处理总结

事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行,并且在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操作. 如果执行成功, 那么这一系列操作都会永久有效. 事务很好的解决了在操作数据库的时候不同步的问题. 同时, 通过事务去执行大数据量的时候, 执行效率可以提高很多很多.

事务处理具有四个特性:原子性、一致性、独立性、持久性。并不是所有的数据库都支持事务处理的,PDO 为能够执行事务处理的数据库提供事务支持。

一.PDO异常处理
PDO::ATTR_ERRMODE

1) PDO::ATTR_ERRMODE//不报错误(忽略)(0)

2) PDO::ERRMODE_WARNING 
//以警告的方式报错(1)

3) PDO::ERRMODE_EXCEPTION  //以异常的方式报错(2)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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() // 返回使用增、删、改、查操作语句后受影响的行总数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?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();
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?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();
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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()            //事务回滚操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值