PDO的基本用法

来源:互联网 发布:wordpress 开发 知乎 编辑:程序博客网 时间:2024/06/05 12:47

至于PDO的简介就免了吧。

——————————————————————————————————————————————
  我们开始构造第一个PDO应用,建立一个pdo.php文件在Web文档目录下:

<?php
  $dsn = "mysql:host=localhost;dbname=test";
  $db = new PDO( $dsn, 'root', '');
  $count =  $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='男',time=NOW()");
 echo  $count;
  $db = null;
?>
  不明白啥意思,俺们来慢慢讲讲。这行:

 $dsn = "mysql:host=localhost;dbname=test";
  就是构造我们的DSN(数据源),看看里面的信息包括:数据库类型是mysql,主机地址是localhost,数据库名称是test,就这么几个信息。不同数据库的数据源构造方式是不一样的。

 $db = new PDO( $dsn, 'root', '');
  初始化一个PDO对象,构造函数的参数第一个就是我们的数据源,第二个是连接数据库服务器的用户,第三个参数是密码。我们不能保证连接成功,后面我们会讲到异常情况,这里我们姑且认为它是连接成功的。

 $count =  $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='男',time=NOW()");
echo  $count;
  调用我们连接成功的PDO对象来执行一个查询,这个查询是一个插入一条记录的操作,使用PDO::exec() 方法会返回一个影响记录的结果,所以我们输出这个结果。最后还是需要结束对象资源:

 $db = null;
  默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:

 $db = new PDO( $dsn, 'root', '', array(PDO::ATTR_PERSISTENT => true));


  一次操作就这么简单,也许跟以前的没有太大区别,跟ADOdb倒是有几分相似。

 

【继续了解】

  如果我们想提取数据的话,那么就应该使用数据获取功能。(下面用到的 $db都是上面已经连接好的对象)

<?php
 foreach( $db->query("SELECT * FROM foo")){
  print_r( $row);
 }
?>
  我们也可以使用这种获取方式:

<?php
  $rs =  $db->query("SELECT * FROM foo");
 while( $row =  $rs->fetch()){
  print_r( $row);
 }
?>
  如果想一次把数据都获取到数组里可以这样:

<?php
 $rs =  $db->query("SELECT * FROM foo");
 $result_arr =  $rs->fetchAll();
print_r( $result_arr);
?>

Array
([0] => Array(
 [id] => 1
 [0] => 1
 [name] => heiyeluren
 [1] => heiyeluren
 [gender] => 男
 [2] => 男
 [time] => 2006-10-28 23:14:23
 [3] => 2006-10-28 23:14:23
)
}
  我们看里面的记录,数字索引和关联索引都有,浪费资源,我们只需要关联索引的:

<?php
 $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
 $rs =  $db->query("SELECT * FROM foo");
 $rs->setFetchMode(PDO::FETCH_ASSOC);
 $result_arr =  $rs->fetchAll();
print_r( $result_arr);
?>
  看上面的代码,setAttribute() 方法是设置部分属性,主要属性有:PDO::ATTR_CASE、PDO::ATTR_ERRMODE等等,我们这里需要设置的是PDO:: ATTR_CASE,就是我们使用关联索引获取数据集的时候,关联索引是大写还是小写,有几个选择:

  PDO::CASE_LOWER -- 强制列名是小写
  PDO::CASE_NATURAL -- 列名按照原始的方式
  PDO::CASE_UPPER -- 强制列名为大写 

  我们使用setFetchMode方法来设置获取结果集的返回值的类型,同样类型还有:

  PDO::FETCH_ASSOC -- 关联数组形式
  PDO::FETCH_NUM -- 数字索引数组形式
  PDO::FETCH_BOTH -- 两者数组形式都有,这是缺省的
  PDO::FETCH_OBJ -- 按照对象的形式,类似于以前的 mysql_fetch_object()

  当然,一般情况下我们是使用PDO::FETCH_ASSOC,具体使用什么,按照你自己的需要,其他获取类型参考手册。

  除了上面这种获取数据的方式,还有这种:

<?php
 $rs =  $db->prepare("SELECT * FROM foo");
 $rs->execute();
while( $row =  $rs->fetch()){
 print_r( $row);
}
?>
  其实差不多啦。如果你想获取指定记录里一个字段结果的话,可以使用 PDOStatement::fetchColumn():

<?php
 $rs =  $db->query("SELECT COUNT(*) FROM foo");
 $col =  $rs->fetchColumn();
echo  $col;
?>
  一般使用fetchColumn()来进行count统计或者某些只需要单字段的记录很好操作。

 



  简单的总结一下上面的操作:

  查询操作主要是PDO::query()、PDO::exec()、PDO::prepare()。PDO::query()主要是用于有记录结果返回的操作,特别是SELECT操作,PDO::exec()主要是针对没有结果集合返回的操作,比如INSERT、UPDATE、DELETE等操作,它返回的结果是当前操作影响的列数。PDO::prepare()主要是预处理操作,需要通过 $rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大,不是本文能够简单说明白的,大家可以参考手册和其他文档。获取结果集操作主要是:PDOStatement::fetchColumn()、PDOStatement::fetch()、 PDOStatement::fetchALL()。PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字段,缺省是第一个字段。PDOStatement::fetch() 是用来获取一条记录,PDOStatement::fetchAll()是获取所有记录集到一个中,获取结果可以通过PDOStatement:: setFetchMode来设置需要结果集合的类型。

  另外有两个周边的操作,一个是PDO::lastInsertId()和 PDOStatement::rowCount()。PDO::lastInsertId()是返回上次插入操作,主键列类型是自增的最后的自增ID。 PDOStatement::rowCount()主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、 UPDATE操作影响的结果集,对PDO::exec()方法和SELECT操作无效。

  【错误处理】

  如果程序中碰到错误咋办?我们这里描述PDO类的错误信息和异常处理。

  1. 面向对象的方式

  先看看如果连接错误等的处理,使用面向对象的方式来处理:

<?php
try {
  $db = new PDO('mysql:host=localhost;dbname=test',  $user,  $pass);
  $db = null;
} catch (PDOException  $e) {
 print "Error: " .  $e->getMessage() . "<br/>";
 die();
}
?>
  这里利用我们PHP 5面向对象的异常处理特征,如果里面有异常的话就初始化调用PDOException来初始化一个异常类。

  PDOException异常类的属性结构:

<?php
class PDOException extends Exception
{
 public  $errorInfo = null; // 错误信息,可以调用 PDO::errorInfo() 或 PDOStatement::errorInfo()来访问
 protected  $message; // 异常信息,可以试用 Exception::getMessage() 来访问
 protected  $code; // SQL状态错误代码,可以使用 Exception::getCode() 来访问
}
?>
  这个异常处理类是集成PHP 5内置的异常处理类,我们简单的看一下PHP 5内置的异常处理类结构:

<?php
class Exception
{
 // 属性
 protected  $message = 'Unknown exception'; // 异常信息
 protected  $code = 0; // 用户自定义异常代码
 protected  $file; // 发生异常的文件名
 protected  $line; // 发生异常的代码行号

 // 方法
 final function getMessage(); // 返回异常信息
 final function getCode(); // 返回异常代码
 final function getFile(); // 返回发生异常的文件名
 final function getLine(); // 返回发生异常的代码行号
 final function getTrace(); // backtrace() 数组
 final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
}
?>
  相应的,在代码中可以合适的调用 getFile() 和 getLine() 来进行错误定位,更方便的进行调试。

  2. 使用面向过程的方法

  先看代码:

<?
 $db = new PDO('mysql:host=localhost;dbname=test',  $user,  $pass);
 $rs =  $db->query("SELECT aa,bb,cc FROM foo");
if ( $db->errorCode() != '00000'){
 print_r( $db->errorInfo());
 exit;
}
 $arr =  $rs->fetchAll();
print_r( $arr);
 $db = null;
?>
  PDO和PDOStatement对象有errorCode() 和 errorInfo() 方法,如果没有任何错误, errorCode() 返回的是: 00000 ,否则就会返回一些错误代码。errorInfo() 返回的一个数组,包括PHP定义的错误代码和MySQL的错误代码和错误信息,数组结构如下:

Array
(
 [0] => 42S22
 [1] => 1054
 [2] => Unknown column 'aaa' in 'field list'
)
  每次执行查询以后,errorCode() 的结果都是最新的,所以我们可以很容易自己控制错误信息显示。

  【简单总结】

  从上面的使用看出,PDO功能确实强大,另外还有一些内容我没有讲到,比如绑定参数、预处理、存储过程、事务处理等等功能。另外还有不同数据扩 DSN的构造,Oracle数据库自己很多特殊的东西,都需要深入去学习理解,这篇文章就只是简单的描述了一些入门知识,算是对PDO一个简单的了解吧。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩说幼儿园老师不喜欢她怎么办 小孩在学校老师不喜欢怎么办 好哭的孩子老师怎么办 小孩哭的犟住怎么办 2-3小孩脾气很犟怎么办 生了孩子没奶怎么办 二年级孩子写作业慢怎么办 六年级下册数学解决问题差的怎么办 孩子五年级了学习成绩不好怎么办 孩子做错事不承认怎么办 二年级小孩拼音差怎么办 小学三年级数学60多分怎么办 孩子三年级了数学不开窍怎么办 初二数学太差该怎么办 孩子语文阅读理解能力差怎么办 5年级数学不开窍怎么办 一年级孩子数学不开窍怎么办 三年级孩子数学成绩差怎么办 孩子三年级数学太差怎么办 三年级孩子数学理解能力差怎么办 教小孩做作业老是发火怎么办 孩子拿笔重写字太黑怎么办 教小孩写不到汉字怎么办 一年级孩子数学理解能力差怎么办 小孩一年级数学学不好怎么办 孩子一年级数学学不好怎么办 小学一年级数学学不好怎么办 孩子一年级数学成绩不好怎么办 成绩差的孩子该怎么办 面对成绩差的孩子该怎么办 六年级数学成绩差该怎么办 孩子数学物理成绩差该怎么办 高三成绩很差该怎么办 孩子学习成绩差家长该怎么办 孩子一年级语文成绩不好怎么办 孩子上网成瘾不听父母话怎么办 10岁数学不开窍怎么办 孩子五年级数学不好怎么办 一岁宝宝难断奶怎么办 2岁宝宝断不了奶怎么办 快2岁宝宝不听话怎么办