您好,欢迎访问一九零五行业门户网

PHP开发笔记系列(一)-PDO使用_PHP教程

之前一段时间,开始了php的研究,看了关于pdo的一些资料,发现不错,整理和总结一下,作为开发笔记,留待日后使用,《php开发笔记系列(一)-pdo使用》。
pdo是php data objects的简称,是一种数据库访问抽象层。pdo是用于多种数据库的一致接口。类比的说,pdo做的事情类似于java中的持久层框架(hibernate、openjpa)的功能,为异构数据库提供一个统一的编程接口,这样就不必再使用mysql_*、pg_*这样的函数,也不必再写自己的genericdao了。pdo在php5.1的时候一起发布,所以我们用的php5.2、php5.3都已经可以使用。
为了方便,我们使用mysql5来做演示。
0. 建立实验环境数据库及相关表 
sql代码  create table `blog` (    `id` int(10) not null auto_increment,    `title` varchar(255) not null,    primary key (`id`)  ) engine=innodb auto_increment=16 default charset=latin1
1. 使用pdo访问数据库 
    通过pdo访问数据库的步骤是:a)指定dsn、username、password,b)通过#a中的设置构造pdo对象,代码如下: 
php代码  file:pdo-access.php  url:http://localhost:88/pdo/pdo-access.php  getmessage();      }  ?>
备注:dsn即data source name-数据源名称,提供数据库的连接信息,包括三部分,pdo驱动名称(mysql、sqlite、postgresql等)、冒号和驱动特定的语法。但是一般情况下,我们都很难记住这些,可以下载个php manual查,也可以到php的官网查。
2. 使用query方法查询数据 
    在#1的基础上,连接数据库成功后,构造sql语句,调用query方法返回结构数组,通过foreach进行数据结果遍历,代码如下: 
php代码  file:pdo-query.php  url:http://localhost:88/pdo/pdo-query.php?title=title1  query($sql) as $row){              print $row['id'].\t;              print $row['title'].\t;          }      } catch (pdoexception $e) {          echo 'errors occur when query data!\n';          echo $e->getmessage();      }  ?>
备注:一般情况下, 通过构造sql语句的方法来进行query、update、insert、delete,都会需要指定where条件,因此不可避免的需要防止sql注入的问题出现。
例如,正常情况下,当用户输入“title1”时,我们构造的sql语句会是select * from blog where title='title1',但是对sql比较熟悉的用户会输入'or id like '%,此时我们构造的sql就会变成select * from blog where title='' or id like '%',这样整张blog 表中的数据都会被读取,因此需要避免,所以需要用到quote方法,把所有用户提供的数据进行转移,从而防止sql注入的发生。使用quote方法后的sql为$sql = select * from blog where title = .$dbh->quote($title),转移出来后的sql是select * from blog where title = '\'or id like \'%',把所有的单引号(')都转移了。
3. 使用prepare和execute方法查询数据 
    如果我们用到的sql查询是使用频率不高的查询,那么使用query或prepare和execute方法来查询都无太大差别,查询速度也不会差太远。两者不同的是,使用query时,php向数据库发送的sql,每执行一次都需要编译一次,而使用prepare和execute方法,则不需要,因此做大并发量的操作时,使用prepare和execute方法的优势会更加明显。
使用prepare和execute方法的步骤不多,a)构造sql,b)将sql传入pdo->prepart方法,得到一个pdostatement对象,3)调用pdostatement对象的execute方法,4)通过pdostatement->fetch或pdostatement->fetchobject遍历结果集。代码如下:
php代码  file:pdo-prepare-fetch.php  url:http://localhost:88/pdo/pdo-prepare-fetch.php?title=title1  prepare($sql);          // 为绑定变量赋值          $stmt->bindparam(:title, $title, pdo::param_str);          // 执行sql          $stmt->execute();          // 以联合数组方式获取结果,并遍历结果          while ($row = $stmt->fetch(pdo::fetch_assoc)) {              print $row['id'].\t;              print $row['title'].\t;          }      } catch (pdoexception $e) {          echo 'errors occur when query data!\n';          echo $e->getmessage();      }  ?>
除了使用上面的pdo::fetch_assoc返回联合数组外,还可以使用fetchobject方法,返回结果集对象,代码如下: 
php代码  file:pdo-prepare-fetch-object.php  url:http://localhost:88/pdo/pdo-prepare-fetch-object.php?title=title1  prepare($sql);          $stmt->bindparam(:title, $title, pdo::param_str);          $stmt->execute();          // 以对象数组方式获取结果,并遍历结果               while ($row = $stmt->fetchobject()) {              print $row->id.\t;              print $row->title.\t;          }      } catch (exception $e) {          echo 'errors occur when query data!\n';          echo $e->getmessage();      }  ?>
4. 设置pdo的错误级别 
    pdo的错误级别分成pdo::errmode_silent(默认)、pdo::errormode_warning、pdo::errormode_exception三种。 
    pdo::errmode_silent级别,当出现错误时,会自动设置pdostatement对象的errorcode属性,但不进行任何其他操作,因此需要我们手工检查是否出现错误(使用empty($stmt->errorcode())),否则程序将继续走下去。 
    pdo::errormode_warning级别,基本与pdo::errmode_silent一致,都是需要使用empty($stmt->errorcode())手工检查。 
    只需要在创建pdo对象后,加入以下代码即可:$dbh->setattribute(pdo::attr_errmode, pdo::errmode_silent);或$dbh->setattribute(pdo::attr_errmode, pdo::errmode_warning); 
    pdo::errormode_warning级别,当出现错误时,系统将抛出一个pdoexception,并设置errorcode属性,程序可以通过try{...}catch{...}进行捕捉,否则未catch的exception会导致程序中断,加入以下代码即可:$dbh->setattribute(pdo::attr_errmode, pdo::errmode_exception);
php代码  getmessage().
;          // 获取错误码          echo $e->getcode().
;          // 获取出错文件名          echo $e->getfile().
;          // 获取出错行          echo $e->getline().
;          // 把异常以字符串返回          echo $e->gettraceasstring();      }  ?>
5. 使用prepare和execute方法插入/更新数据 
    方法和#3中进行查询的差不多,只是构造的sql语句是insert语句或update语句,代码如下:
php代码  file:pdo-prepare-insert.php  url:http://localhost:88/pdo/pdo-insert.php?title=title11  setattribute(pdo::attr_errmode, pdo::errmode_exception);          echo 'connect to database successfully!'.
;                // 构造insert语句          $sql = insert into blog(title) values(:title);          $stmt = $dbh->prepare($sql);          $stmt->bindparam(:title, $title);          $stmt->execute();      } catch (exception $e) {          echo 'errors occur when query data!\n';          echo $e->getmessage();      }  ?>
php代码  file:pdo-prepare-update.php  url:http://localhost:88/pdo/pdo-update.php?id=1&title=title12  setattribute(pdo::attr_errmode, pdo::errmode_exception);          echo 'connect to database successfully!'.
;                // 构造update语句          $sql = update blog set title=:title where id=:id;          $stmt = $dbh->prepare($sql);          $stmt->bindparam(:id, $id);          $stmt->bindparam(:title, $title);          $stmt->execute();      } catch (exception $e) {          echo 'errors occur when query data!\n';          echo $e->getmessage();      }  ?>
6. 获取返回的行数 
    使用#3中的prepare和execute方法,然后将sql语句改成count的,例如select count(id) from article ...,代码如下:
php代码  file:pdo-prepare-fetch-column.php  url:http://localhost:88/pdo/pdo-prepare-fetch-column.php?id=1&title=title12  setattribute(pdo::attr_errmode, pdo::errmode_silent);          echo 'connect to database successfully!'.
;                // 构造count语句          $sql = select count(id) from blog;          $stmt = $dbh->prepare($sql);          $stmt->execute();          // 使用fetchcolumn获取0列值          echo $stmt->fetchcolumn(). rows returned!;      } catch (exception $e) {          echo 'errors occur when query data!\n';          echo $e->getmessage();      }  ?>
7. 获取受影响的行数 
    使用#3中的prepare和execute方法,然后将sql语句改成insert、update、delete语句即可,代码如下:
php代码  file:pdo-prepare-row-count.php  url:http://localhost:88/pdo/pdo-prepare-row-count.php?id=1  setattribute(pdo::attr_errmode, pdo::errmode_silent);          echo 'connect to database successfully!'.
;                $sql = delete from blog where id=:id;          $stmt = $dbh->prepare($sql);          $stmt->bindparam(:id, $id);          $stmt->execute();          // 获取update、insert、delete操作后影响的行数          echo $stmt->rowcount(). rows affected!;      } catch (exception $e) {          echo 'errors occur when data operation!\n';          echo $e->getmessage();      }  ?>
8. 获得新插入行的id值 
    为数据库表插入新数据行时,我们需要获得刚刚插入的新行的id值,此时我们需要使用到pdo的lastinsertid()方法,代码如下:
php代码  file:pdo-prepare-last-insertid.php  url:http://localhost:88/pdo/pdo-prepare-last-insertid.php?title=title13  setattribute(pdo::attr_errmode, pdo::errmode_exception);          echo 'connect to database successfully!'.
;                $sql = insert into blog(title) values(:title);          $stmt = $dbh->prepare($sql);          $stmt->bindparam(:title, $title);          $stmt->execute();          // 获取上一个之行的insert语句插入的数据的id值          echo $dbh->lastinsertid();      } catch (exception $e) {          echo 'errors occur when query data!\n';          echo $e->getmessage();      }  ?>
9. 使用pdo进行事务管理 
    事务是进行程序开发时,保证数据acid(可分性、一致性、独立性、持久性)的工具。要不全部成功,要不全部不成功,这样才能保证关联数据的保存能够达到预期的目的。下面使用pdo的transaction来进行实验,进行多比数据插入,开启事务,第一句sql是可以正常插入,第二句sql插入出错,检查是否rollback。
php代码  file:pdo-prepare-transaction.php  url:http://localhost:88/pdo/pdo-prepare-transaction.php  setattribute(pdo::attr_errmode, pdo::errmode_exception);          echo 'connect to database successfully!'.
;          // 开启事务          $dbh->begintransaction();          $sql = insert into blog(title) values(:title);          $stmt = $dbh->prepare($sql);          $stmt->execute(array(':title'=>'insert title1'));          $stmt->execute(array(':title'=>null));          // 提交事务          $dbh->commit();      } catch (exception $e) {          echo 'errors occur when data operation!\n';          echo $e->getmessage();          // 回滚事务          $dbh->rollback();      }  ?>
10. 使用pdo进行数据库备份 
    使用system函数,将我们构造的mysqldump命令传入即可。下面为了演示,只做了简单的调用。
php代码  file:pdo-backup.php  url:http://localhost:88/pdo/pdo-backup.php  .$file;      // 执行备份命令      system($cmd,$error);      if($error){          trigger_error(backup failed.$error);      }  ?>
采用工厂模式: 
php代码  file:abstractmysqldump.php  cmd, $error);              // 判断是否出错及出错逻辑              if($error){                  trigger_error(backup failure! command:.$this->cmd. error:.$error);              }          }      }  ?>
php代码  file:mysqldump_win.php  cmd = mysqldump -u.$username. -p.$passwd. .$dbname. > .$file;          }      }  ?>
php代码  file:mysqldumptest.php  url:http://localhost:88/pdo/mysqldumptest.php  backup();   ?>  
http://www.bkjia.com/phpjc/820779.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/820779.htmltecharticle之前一段时间,开始了php的研究,看了关于pdo的一些资料,发现不错,整理和总结一下,作为开发笔记,留待日后使用,《php开发笔记系列...
其它类似信息

推荐信息