原文网址:http://www.uncletoo.com/html/application/674.html
在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代码了,首先是连接数据库,看下面的例子:
123456789101112131415 | <?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两个函数。
示例:
12345678910111213141516171819 | <?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已经封装好了,我们只需要调用就可以了。
示例:
12345678910111213 | <?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也还没完全搞明白。如果大家有更好的办法可以拿出来共享一下。
看代码:
123456789101112131415161718192021222324 | <?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的预处理机制用好了,对于程序来说是很不错的。
看下面这段实例代码:
123456789101112131415161718192021222324252627282930313233343536373839 | <?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也不会^_^...)