ddxiami

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2813|回复: 6

[细说PHP] 第21章数据库抽象层PDO

[复制链接]
发表于 2013-8-8 13:15:43 | 显示全部楼层 |阅读模式
使用PDO::exec()方法

<?php
        try{
                $dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd');
        }catch(PDOException $e){
                echo '数据库连接失败:'.$e->getMessage();
                exit;       
        }
       
        $query = "UPDATE contactInfo SET phone='15801680168' where name='高某某'";
        //使用exec()方法可以执行INSERT、UPDATE和DELETE等
        $affected = $dbh->exec($query);          
       
        if($affected){          
                echo '数据表contactInfo中受影响的行数为:'.$affected; 
        }else{
                print_r($dbh->errorInfo());         
        }


回复

使用道具 举报

 楼主| 发表于 2013-8-8 15:08:04 | 显示全部楼层
使用PDO::query()方法

<?php
        $dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd');  
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
       
        $query = "SELECT name, phone, email FROM contactInfo WHERE departmentId='D01'";       
       
        try {   
                //执行SELECT查询,并返回PDOstatement对象                     
                $pdostatement = $dbh->query($query);         
    echo "一共从表中获取到".$pdostatement->rowCount()."条记录:\n";
                foreach ($pdostatement as $row) {                           //从PDOstatement对象中遍历结果
                       echo $row['name'] . "\t";                             //输出从表中获取到的联系人的名字
                       echo $row['phone'] . "\t";                     //输出从表中获取到的联系人的电话
                echo $row['email'] . "\n";                     //输出从表中获取到的联系人的电子邮件
            }
        } catch (PDOException $e) {          
                echo $e->getMessage();             
        }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 15:46:47 | 显示全部楼层
使用PDO::prepare()和PDOStatement::excute()两个方法

<?php
        try{
                $dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd');
        }catch(PDOException $e){
                echo '数据库连接失败:'.$e->getMessage();
                exit;
        }

        $query = "INSERT INTO contactInfo (name, address, phone) VALUES (?, ?, ?)";
        $stmt = $dbh->prepare($query);            //调用PDO对象中的prepare()方法准备查询

        $stmt->bindParam(1, $name);              //将变量$name绑定到查询中的第一个问号参数中
        $stmt->bindParam(2, $address);            //将变量$address绑定到查询的第二个问号参数中
        $stmt->bindParam(3, $phone);              //将变量$phone绑定到查询的第三个问号参数中
        
        $name = "赵某某";                                                  //声明一个参数变量$name
        $address = "海淀区中关村";                 //声明一个参数变量$address
        $phone = "15801688348";                   //声明一个参数变量$phone

        $stmt->execute();                        //执行参数被绑定值后的准备语句

        $name = "孙某某";                                      //为变量$name重新赋值
        $address = "宣武区";                     //为变量$address重新赋值
        $phone = "15801688698";                 //为变量$phone重新赋值

        $stmt->execute();               //再次执行参数被绑定值后的准备语句,插入第二条语句?>

<?php
        ...
        $query = "INSERT INTO contactInfo (name, address, phone) VALUES (:name, :address, :phone)";
        //调用PDO对象中的prepare()方法准备查询,使用命名参数
        $stmt = $dbh->prepare($query);              

        //传递一个数组为预处理查询中的命名参数绑定值,并执行一次。
        $stmt->execute(array(":name"=>"赵某某",":address"=>"海淀区", ":phone"=>"15801688348"));
        
  //再次传递一个数组为预处理查询中的命名参数绑定值,并执行第二次插入数据。
        $stmt->execute(array(":name"=>"孙某某",":address"=>"宣武区", ":phone"=>"15801688698"));
?>

<?php
        ...
        $query = "INSERT INTO contactInfo (name, address, phone) VALUES (?, ?, ?)";
        $stmt = $dbh->prepare($query);              

        //传递一个数组为预处理查询中的问号参数绑定值,并执行一次。
        $stmt->execute(array("赵某某", "海淀区", "15801688348"));
        
  //再次传递一个数组为预处理查询中的问号参数绑定值,并执行第二次插入数据。
        $stmt->execute(array("孙某某", "宣武区", "15801688698"));
?>





回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 16:00:34 | 显示全部楼层
fetch()方法

<?php 
        try{
                $dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd');
        }catch(PDOException $e){              
                echo '数据库连接失败:'.$e->getMessage();               
                exit;                    
        }
       
        echo '<table border="1" align="center" width=90%>';   
        echo '<caption><h1>联系人信息表</h1></caption>';          
        echo '<tr bgcolor="#cccccc">';            
        echo '<th>UID</th><th>姓名</th><th>联系地址</th><th>联系电话</th><th>电子邮件</th></tr>';

        //使用query方式执行SELECT语句,建议使用prepare()和execute()形式执行语句
        $stmt = $dbh->query("SELECT uid,name,address,phone,email FROM contactInfo");  
       
        //以PDO::FETCH_NUM式获取索引并遍历
        while(list($uid, $name, $address, $phone, $email) = $stmt->fetch(PDO::FETCH_NUM)){
                echo '<tr>';                               //输出每行的开始标记
                echo '<td>'.$uid.'</td>';                       //从结果行数组中获取uid  
                echo '<td>'.$name.'</td>';                                    //从结果行数组中获取name
                echo '<td>'.$address.'</td>';                           //从结果行数组中获取address
                echo '<td>'.$phone.'</td>';                                   //从结果行数组中获取phone
                echo '<td>'.$email.'</td>';                                    //从结果行数组中获取email
                echo '</tr>';                       //输出每行的结束标记
        }
        echo '</table>';                        //输出表格的结束标记




回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 16:02:21 | 显示全部楼层
fetchAll()方法

<?php
        try{
                $dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd');
        }catch(PDOException $e){                     
                echo '数据库连接失败:'.$e->getMessage();                
                exit;                            
        }
       
        echo '<table border="1" align="center" width=90%>';          
        echo '<caption><h1>联系人信息表</h1></caption>';          
        echo '<tr bgcolor="#cccccc">';           
        echo '<th>UID</th><th>姓名</th><th>联系地址</th><th>联系电话</th><th>电子邮件</th></tr>';               

        $stmt = $dbh->prepare("SELECT uid,name,address,phone,email FROM contactInfo");  
        $stmt->execute();                        
        $allRows = $stmt->fetchAll(PDO::FETCH_ASSOC);            //以关联下标从结果集中获取所有数据

        foreach($allRows as $row){                     //遍历获取到的所有行数组$allRows
                echo '<tr>';                                 
                echo '<td>'.$row['uid'].'</td>';                 //从结果行数组中获取uid
                echo '<td>'.$row['name'].'</td>';               //从结果行数组中获取name
                echo '<td>'.$row['address'].'</td>';        //从结果行数组中获取address
                echo '<td>'.$row['phone'].'</td>';         //从结果行数组中获取phone
                echo '<td>'.$row['email'].'</td>';         //从结果行数组中获取email
                echo '</tr>';                          //输出每行结束标记
        }
        echo '</table>';                                      

        /* 以下是在fetchAll()方法中使用两个特别参数的演示示例  */
        $stmt->execute();                           //再次执行一个准备好的SELECT语句
        $row=$stmt->fetchAll(PDO::FETCH_COLUMN, 1);                    //从结果集中获取第二列的所有值
        echo '所有联系人的姓名:';                      //输出提示
        print_r($row);                            //输出获取到的第二列所有姓名数组
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 16:05:21 | 显示全部楼层
bindColumn()方法

<?php
        try{
                $dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd');
                $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }catch(PDOException $e){
                echo '数据库连接失败:'.$e->getMessage();
                exit;
        }
  
        //声明一个SELECT查询,从表contactInfo中获取D01部门的四个字段的信息
        $query = "SELECT uid, name, phone, email FROM contactInfo WHERE departmentId='D01'";
        try {
                $stmt = $dbh->prepare($query);                                      //准备声明好的一个查询
                $stmt->execute();                                           //执行准备好的查询
                $stmt->bindColumn(1, $uid);                                //通过列位置偏移数绑定变量$uid
                $stmt->bindColumn(2, $name);                                              //通过列位置偏移数绑定变量$name
                $stmt->bindColumn('phone', $phone);                                        //绑定列名称到变量$phone上
                $stmt->bindColumn('email', $email);                             //绑定列名称到变量$email上

                while ($stmt->fetch(PDO::FETCH_BOUND)) {                                //fetch()方法传入特定的参数遍历
                        echo $uid."\t".$name."\t".$phone."\t".$email."\n";        //输出自动将列值赋给对应变量的值
                }
        } catch (PDOException $e) {
                echo $e->getMessage();
        }

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 16:06:57 | 显示全部楼层
PDO的事务处理

<?php
        $pdo = new PDO("mysql:host=localhost;dbname=demo", "mysql_urer", "mysql_password");
        $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);  //设置异常处理模式
        $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);                   //关闭自动提交

        /* 使用异常处理试着去执行转账的事务,如果有异常转到catch区块中 */
        try {
                $price = 80;                    //商品交易价格,也是转账金额
                $pdo->beginTransaction();   //开始事备

                $affected_rows = $pdo->exec("update account set cash=cash-{$price} where name='userA'"); //转出
         
                if($affected_rows > 0)
            echo "userA成功转出{$price}元人民币<br>";
        else
                        throw new PDOException('userA转出失败');      //失败抛出异常,不向下再执行,转到catch区块

                $affected_rows = $pdo->exec("update account set cash=cash+{$price} where name='userB'"); //转入
       
                if($affected_rows > 0)
            echo "成功向userB转入{$price}元人民币<br>";
        else
                        throw new PDOException('userB转入失败');      //失败抛出异常,不向下再执行,转到catch区块

                echo "交易成功!";
                $pdo->commit();             //如果执行到此处表示前面两个查询执行成功,整个事务执行成功
        }catch(PDOException $e){
                echo "交易失败:".$e->getMessage();
                $pdo->rollback();           //如果执行到此处理表示事务中的语句出问题了, 整个事务全部撤消
        }

        $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);          //重新开启自动提交

       
       
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|技术文档库 ( 闽ICP备15017263号-2 )|网站地图

GMT+8, 2025-5-18 22:22 , Processed in 0.042269 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表