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