PDO PHP

来源:互联网 发布:移动硬盘与mac连接 编辑:程序博客网 时间:2024/05/18 02:39

       PDO,可以连接不同的数据库,解决应用程序逻辑与数据库通信逻辑之间的耦合。通过这个通用接口传递所有与数据库相关的命令,应用程序就能使用某种数据库解决方案,只要该数据库支持应用程序所需的特性,而且抽象层提供了与该数据库兼容的驱动程序。


       如何使用PDO:

       1)PDO  PDO::__construct(string DSN [ , string username [ , string password [ , array driver_opts ]]])      DNS(数据源名)参数又两项组成:所需的数据库驱动程序名和任何需要必须数据库连接变量名,如主机名、端口和数据库名。username和password 参数分别指定用于连接数据库的用户名和密码。最后,driver_opts数组指定连接所必需(或期望的)所有额外选项。

      2)查询执行   PDO提供了及格执行查询的方法,每个方法都经过调整以尽可能更高效的方式执行一个特定的查询类型。

              A ) 执行没有结果集的查询。当执行INSERT 、UPDATE 和DELETE 等查询时,不返回结果集。在这些情况下,excu()方法将返回查询所影响的行数。

              B )一次执行一个查询。当执行返回结果集的查询时,或者 所影响的行数无关紧要时,应当 使用query()方法。

              C)多次执行一个查询。虽然可以用while循环和query( )方法多次执行一个查询(每次迭代传入不同的列值),但是用准备语句来实现效率会更高。

              

      准备语句介绍:

            每次发送查询给MySQL服务器时,都必须解析该查询的语句,确保结构正确并能够执行。这是这个过程必要的步骤,但也确实带来了一些开销。                           做一次是必要的,但反复滴执行相同的查询,批量插入多行时只改变列值会怎么样呢?准备语句会在服务器上缓存查询的语法和执行过程,而只在服务器和客户         端之间传输有变化的列值,以此来消除额外的开销。准备语句是由两个方法实现的:prepare( )负责准备要执行的查询,execute( )使用一组给定的列参数反复地       执行查询。这些参数可以显示地作为数组传递给execute()方法,也可以使用通过bindParam( )方法指定的绑定参数提供给execute()方法。

             PDOStatement  PDO::prepare(string  query [ , array driver_option ] )  但是,用作准备语句的查询以我们以往使用的查询略有不同,因为对于每次执行迭代中       要改变的值,必须使用占位符而不是具体的列值。例如: INSERT INTO table_name  sku=:sku , name= :name ;或者 INSERT INTO table_name sku =? ,name=?              boolean  PDOStatement::execute( [ array input_parament ] ) 该方法需要每次迭代执行中替换的输入参数 。这个可以通过两种方法实现 :作为数组将值传递给方法,或者通过bindParam( ) 方法把值绑定到查询中相应的变量名或位置偏移 。  $stmt->execut (array ( ':sku'=>'MN87' ,' name'=>'Mikle')) ;xecute()方法中的input_parameters参数是可选的,虽然很方便,但是如果需要传递多个变量时,以这种方式提供数组会很快变得难以处理(当数组元素过多时,也就是当数据表中的列过多时,代码设计会变得特别难以阅读或出错)。使用bindParam()方法可以解决这个问题。

$pdo=new PDO($dsn,$user,$pwd);  // 连接数据库  $query="INSERT INTO tb_chengji SET xuesheng=:xuesheng,yuwen=:yuwen";  $result=$pdo->prepare($query);    $result->execute(array(':xuesheng'=>'赵天平',':yuwen'=>'90'));  // 执行一次  $result->execute(array(':xuesheng'=>'张冬雪',':yuwen'=>'115')); // 再执行一次$pdo=new PDO($dsn,$user,$pwd);  // 连接数据库  $query="INSERT INTO tb_chengji SET xuesheng=:xuesheng,yuwen=:yuwen";  $result=$pdo->prepare($query);      $xuesheng='赵天平';  $yuwen='90';  $result->bindParam(':xuesheng',$xuesheng);  $result->bindParam(':yuwen',$yuwen);  $result->execute();      $xuesheng='张冬雪';  $yuwen='115';  $result->bindParam(':xuesheng',$xuesheng);  $result->bindParam(':yuwen',$yuwen);  $result->execute();  

PDO的数据获取方法与其他数据库扩展都非常类似,只要成功执行SELECT查询,都会有结果集对象产生。不管是使用PDO对象中的query()方法,还是使用prepare()和execute()等方法结合的预处理语句,执行SELECT查询都会得到相同的结果集对象PDOStatement。都需要通过PDOStatement类对象中的方法将数据遍历出来。下面介绍PDOStatement类中常见的几个获取结果集数据的方法。

 1、fetch()方法

PDOStatement类中的fetch()方法可以将结果集中当前的记录以某种方式返回,并将结果集指针移至下一行,当到达结果集末尾时返回FALSE。该方法的原型如下:

mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )

第一个参数fetch_style是可选项,获取一行数据记录中,各列的引用方式取决于这个参数如何设置。可以使用的设置有以下6种。

PDO::FETCH_ASSOC          从结果集中获取以列名为索引的关联数组。
       PDO::FETCH_NUM             从结果集中获取一个以列在行中的数值偏移量为索引的值数组。
       PDO::FETCH_BOTH            这是默认值,包含上面两种数组。
       PDO::FETCH_OBJ               从结果集当前行的记录中获取其属性对应各个列名的一个对象。
       PDO::FETCH_BOUND        使用fetch()返回TRUE,并将获取的列值赋给在bindParm()方法中指 定的相应变量。
       PDO::FETCH_LAZY            创建关联数组和索引数组,以及包含列属性的一个对象,从而可以在这三种接口中任选一种。

第二个参数cursor_orientation是可选项,用来确定当对象是一个可滚动的游标时应当获取哪一行。

第三个参数cursor_offset也是可选项,需要提供一个整数值,表示要获取的行相对于当前游标位置的偏移。

在下面的示例中,使用PDO对象中的query()方法执行SELECT查询,获取联系人信息表contactinfo中的信息,并返回PDOStatement类对象作为结果集。然后通过fetch()方法结合while循环遍历数据,并以HTML表格的形式输出。代码如下所示:

1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
<?php
    {
        =PDO(,,);
    catch$eecho.->getMessage();
        ;
     
    '<table border="1" align="center" width=90%>'echo;
    '<tr bgcolor="#cccccc">'echo;
//使用query方式执行SELECT语句,建议使用prepare()和execute()形式执行语句
    =->query();
//以PDO::FETCH_NUM形式获取索引并遍历
    (list(,,,,)=->fetch(PDO::FETCH_NUM)){
        '<tr>'echo..;
        '<td>'$name'</td>'echo..;
        '<td>'$phone'</td>'echo..;
        '</tr>'}
echo;
?>

2、fetchAll()方法

fetchAll()方法与上一个方法fetch()类似,但是该方法只需要调用一次就可以获取结果集中的所有行,并赋给返回的数组(二维)。该方法的原型如下:

  array PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]] )

fetchAll()方法的应用示例如下所示:

1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
31
33
35
try$dbhnew 'mysql:dbname=testdb;host=localhost'$username$passwd}(PDOException){
        '数据库连接失败:'$eexit}
echo;
    '<caption><h1>联系人信息表</h1></caption>'echo;
    '<th>UID</th><th>姓名</th><th>联系地址</th><th>联系电话</th><th>电子邮件</th></tr>' 
    $stmt$dbh"select uid,name,address,phone,email FROM contactinfo"$stmt$allrows$stmt//以关联下标从结果集中获取所有数据
//以PDO::FETCH_NUM形式获取索引并遍历
   (as){
        '<tr>'echo.[].;
        '<td>'$row'name''</td>'echo.[].;
        '<td>'$row'phone''</td>'echo.[].;
        '</tr>'}
echo;
    $stmt$row$stmt//从结果集中获取第二列的所有值
    '所有联系人的姓名:'print_r();
?>

 3、setFetchMode()方法

PDOStatement对象中的fetch()和fetchAll()两个方法,获取结果数据的引用方式默认都是一样的,既按列在行中的数值偏移量(从0开始)索引的值数组,因为它们的默认模式都被设置为PDO::FETCH_BOTH值。如果计划使用其他模式来改变这个默认设置,可以在fetch()或fetchAll()方法中提供需要的模式参数。但如果多次使用这两个方法,在每次调用时都需要设置新的模式来改变默认的模式。这时就可以使用PDOStatement类对象中的setFetchMode()方法,在脚本页面的顶部设置一次模式,以后所有fetch()和fetchAll()方法的调用都将生成相应的结果集,减少了多次在调用fetch()方法时的参数录入。

4、bindColumn()方法

使用该方法可以将一个列和一个指定的变量名绑定,这样在每次使用fetch()方法获取各行记录时,会自动将相应的列值赋给该变量,但必须是在fetch()方法的第一个参数设置为PDO::FETCH_BOTH值时。bindColumn()方法的原型如下所示:

 bool PDOStatement::bindColumn ( mixed $column , mixed &$param [, int $type [, int $maxlen [, mixed $driverdata ]]] )

第一个参数column为必选项,可以使用整数的列偏移位置索引(索引值从1开始),或是列的名称字符串。第二个参数param也是必选项,需要传递一个引用,所以必须提供一个相应的变量名。第三个参数type是可选项,通过设置变量的类型来限制变量值,该参数支持的值和介绍bindparam()方法时提供的一样。该方法的应用示例如下所示:

1
3
5
7
9
11
13
15
17
19
21
23
25
try$dbhnew 'mysql:dbname=testdb;host=localhost'$username$passwd$dbh}(PDOException){
        '数据库连接失败:'$eexit}
$query"select uid,name,,phone,email FROM contactinfo WHERE departmentId=d01'" 
   {
    =->prepare();
    ->execute();
    ->bindColumn(1,);
    ->bindColumn(2,);
    ->bindColumn(,);
    ->bindColumn(,);
while$stmtecho.......;
    }(PDOException){
    $e}
?>

5、获取数据列属性信息

在项目开发中,除了尅通过上面的几种方式获取数据表中的记录信息外,还可以使用PDOStatement类对象的columnCount()方法获取数据表中字段的数量,并且可以通过PDOStatement类对象的getColumnMeta()方法获取具体列的属性信息。