在PHP开发中,mysql或者mysqli是目前大家使用比较多的数据库连接方式。在PHP5中已经开始有PDO支持了,据说在下一个版本PHP6中,PDO将会作为默认的数据库链接工具,不管是不是真的,PDO作为数据库的另一种连接方式在不久的将来也许会普片使用,这里UnceToo就目前掌握的知识,将PDO的使用以实例的方式和大家分享一下,文章部分代码来自网络。
在使用PDO之前首先要设置PHP.INI文件,使PHP支持PDO,因为PHP5默认是不支持的。在PHP安装目录下找到PHP.INI文件,打开并搜索extension=php_pdo.dll 和 extension=php_pdo_mysql.dll,将前面的分号(;)去掉,重启apache即可。
接下来我们就开始写PHP代码了,首先是连接数据库,看下面的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
define(
'DB_NAME'
,
'pdo_test'
);
define(
'DB_USER'
,
'root'
);
define(
'DB_PASSWORD'
,
''
);
define(
'DB_HOST'
,
'localhost'
);
define(
'DB_CHARSET'
,
'utf8'
);
try
{
$DBH
=
new
PDO(
'mysql:host='
.DB_HOST.
';dbname='
.DB_NAME, DB_USER, DB_PASSWORD);
$DBH
->
exec
(
'SET CHARACTER SET '
.DB_CHARSET);
$DBH
->
exec
(
'SET NAMES '
.DB_CHARSET);
}
catch
(PDOException
$e
) {
print
"Error!: "
.
$e
->getMessage() .
"<br/>"
;
die
();
}
?>
|
连接成功后,我们需要对数据库中的数据进行增删改查操作,这里主要用到exec和query两个函数。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php
//增加数据
$sql_insert
=
'Insert INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,'
.time().rand(1,100).
','
.time().rand(1,100).
',\'no\')'
;
$back
=
$DBH
->
exec
(
$sql_insert
);
//返回 bool 的true or fal
$lastInsertId
=
$DBH
->lastInsertId();
//删除数据
$sql_delete
=
'Delete FROM wp_options Where option_id='
.
$lastInsertId
;
$back
=
$DBH
->
exec
(
$sql_delete
);
//返回 bool 的true or fal
$lastInsertId
=
$DBH
->lastInsertId();
//更新数据
$sql_update
=
'Update wp_options SET option_name = \''
.time().rand(1,100).
'\' Where option_id='
.
$lastInsertId
;
$lastUpdateId
=
$DBH
->lastInsertId();
//返回的对应的操作的id
//查询数据
$sql_select
=
'Select option_id FROM wp_options orDER BY option_id DESC LIMIT 4 '
;
$back
=
$DBH
->query(
$sql_select
);
//返回一个对象 这个对象可以用foreach 直接遍历循环 循环的为查询的结果集
$back
=
$DBH
->query(
$sql_select
)->fetch();
//返回一条数据结果 这个对象可以用foreach 直接遍历循环 循环的为查询的结果集
$back
=
$DBH
->query(
$sql_select
)->fetchAll();
//返回一个数组 这个对象可以用foreach 直接遍历循环 循环的为查询的结果集
$back
=
$DBH
->query(
$sql_select
)->fetchColumn(0);
//返回一个字段字符串,这个字符串是返回的记录的第一条记录的第一个字段
?>
|
到这里,PDO的基本操作基本上结束了。对于一般的企业网站,小型的管理系统基本上能满足了,但是,如果我们开发大型网站或者逻辑较复杂的管理系统,仅仅靠数据的读写是远远不够的,我们可能还需要对数据库的存储过程、事务等对象进行操作,下面我们继续看看用PDO是如何实现的。
对于事务,PDO已经封装好了,我们只需要调用就可以了。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php
try
{
$DBH
->beginTransaction();
//开启一个事务
//Sql 执行的内容 ......................
$DBH
->
exec
(
$sql_insert
);
//执行一系列的操作
$DBH
->
exec
(
$sql_update
);
$DBH
->
exec
(
$sql_delete
);
//等等
$DBH
->commit();
//如果正确执行完成 那么确认 commit
}
catch
(Exception
$e
) {
$DBH
->rollBack();
//如果执行中有错误的情况下 回滚
}
?>
|
这里重点说明一下,在使用事务时,一定要使用try..catch语句,当返回错误时事务不会提交。
PDO在执行存储过程时这里还是运用了比较老的方法,因为这一块UncleToo也还没完全搞明白。如果大家有更好的办法可以拿出来共享一下。
看代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php
$sql_procedure
= '
Create PROCEDURE inout_test(
IN in_option_id INT,
OUT out_option_name VARCHAR(255),
OUT out_option_value TEXT
)
BEGIN
Select option_name INTO out_option_name FROM wp_options Where option_id = in_option_id;
Select option_value INTO out_option_value FROM wp_options Where option_id = in_option_id;
END
;
';
try
{
$sql_drop_procedure
=
'Drop PROCEDURE inout_test'
;
$back
=
$DBH
->
exec
(
$sql_procedure
);
$sql_call_procedure
=
'CALL inout_test(100,@out_option_name,@out_option_value)'
;
$DBH
->
exec
(
$sql_call_procedure
);
$sql_select_procedure
=
'Select @out_option_name,@out_option_value'
;
$back
=
$DBH
->query(
$sql_select_procedure
)->fetch();
$back
=
$DBH
->
exec
(
$sql_drop_procedure
);
}
catch
(Exception
$e
){
echo
$e
->getMessage();
}
?>
|
另外UncleToo再给大家介绍一点关于PDO预处理方面的知识。预处理机制有很多好处,他可以使sql语句重复使用,而且执行效率比直接执行来的更高,所以,如果我们把PDO的预处理机制用好了,对于程序来说是很不错的。
看下面这段实例代码:
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
37
38
39
|
<?php
$stmt
=
$DBH
->prepare(
'Insert INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,:option_name,:option_value,\'no\')'
);
$option_name
=
$option_value
=
''
;
$stmt
->bindParam(
':option_name'
,
$option_name
);
//
$stmt
->bindParam(
':option_value'
,
$option_value
);
// 插入一条数据A
$option_name
=
'name'
.time();
$option_value
=
'value'
.time();
$stmt
->execute();
// 插入另一条不同的数据B
$option_name
=
'name_'
.time();
$option_value
=
'value_'
.time();
$stmt
->execute();
$stmt
=
$DBH
->prepare(
'Insert INTO wp_options(blog_id,option_name,option_value,autoload) VALUES (0,?,?,\'no\')'
);
$option_name
=
$option_value
=
''
;
$stmt
->bindParam(
'1'
,
$option_name
);
//
$stmt
->bindParam(
'2'
,
$option_value
);
// 这里我们还可以插入A数据
$option_name
=
'name'
.time();
$option_value
=
'value'
.time();
$stmt
->execute();
// 这里我们同样还可以插入B数据
$option_name
=
'name_'
.time();
$option_value
=
'value_'
.time();
$stmt
->execute();
$stmt
=
$DBH
->prepare(
"Select * FROM wp_options where option_id = ?"
);
if
(
$stmt
->execute(
array
(@
$_GET
[
'option_id'
]))) {
while
(@
$row
=
$stmt
->fetch()) {
print_r(
$row
);
}
}
?>
|
上面介绍的这些都是PDO的基础,基本能满足我们在开发过程中的需要,对于其他功能,比如PDO大对象,错误处理,游标等功能大家可以参考PHP官方手册,这里就不在说明了(其实UncleToo也不会^_^...)