PHP的PDO模块应用,PDO::rollBack()事务处理

jackxiang 2009-1-4 13:28 | |
转:http://www.5ga.cn/blog/archives/2008/12/1064
最近对我的PHP后台框架进行些升级维护,决定引入JQuery,和PHP的一个数据库模块PDO,以前用的是自己写的类,作为方便以后使用其他数据库备用,由于现在的PDO中文帮助还是比较少,所以做一个笔记.

各各扩展所对应的数据库是:

Driver name Supported databases
PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD Firebird/Interbase 6
PDO_INFORMIX IBM Informix Dynamic Server
PDO_MYSQL MySQL 3.x/4.x
PDO_OCI Oracle Call Interface
PDO_ODBC ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
PDO_PGSQL PostgreSQL
PDO_SQLITE SQLite 3 and SQLite 2


   1.
      $user=’root’;//数据库连接用户名
   2.
      $pass=”;//对应的密码
   3.
      try{
   4.
          $db = new PDO(’mysql:host=localhost;dbname=test’, $user, $pass,array(PDO::ATTR_PERSISTENT => true));//初始化PDO对象
   5.
          //默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true)
   6.
          $db = new PDO(’数据库类型:host=主机地址;dbname=数据库名’,用户名,密码,array(PDO::ATTR_PERSISTENT => true));
   7.
         $db->query(’SET NAMES \’utf8\”);//设置连接数据库的语言环境
   8.
          echo "连接成功";
   9.
          /*你还可以进行一次搜索操作
  10.
         foreach($dbh->query(’SELECT * from gaga’)as $row){
  11.
              print_r($row);//你可以用 echo($GLOBAL); 来看到这些值
  12.
          }
  13.
         */
  14.
          //$db = null;
  15.
      }catch(PDOException$e){
  16.
          die(’数据库连接错误: ‘.$e->getMessage().’
  17.
      ‘);
  18.
      }


$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER); //设置属性

下面列出多有PDO::setAttribute()的参数:

PDO::ATTR_CASE: 强制列名变成一种格式,详细如下(第二个参数):

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

PDO::ATTR_ERRMODE: 错误提示.

    * PDO::ERRMODE_SILENT: 不显示错误信息,只显示错误码.
    * PDO::ERRMODE_WARNING: 显示警告错误.
    * PDO::ERRMODE_EXCEPTION: 抛出异常.

PDO::ATTR_ORACLE_NULLS(不仅仅是ORACLE有效,别的数据库也有效): )指定数据库返回的NULL值在php中对应的数值。

    * PDO::NULL_NATURAL: 不变.
    * PDO::NULL_EMPTY_STRING: Empty string is converted toNULL.
    * PDO::NULL_TO_STRING: NULL is converted to an empty string.

PDO::ATTR_STRINGIFY_FETCHES: Convert numeric values to strings when fetching. Requiresbool.

PDO::ATTR_STATEMENT_CLASS: Set user-supplied statement class derived from PDOStatement. Cannot be used with persistent PDO instances. Requiresarray(string classname, array(mixed constructor_args)).

PDO::ATTR_AUTOCOMMIT(available in OCI, Firebird and MySQL): Whether to autocommit every single statement.

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(available in MySQL): Use buffered queries.

查询操作主要是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::commit() 或 PDO::rollBack() 来结束该事务,这取决于事务中运行的代码是否成功。


   1.
      try{
   2.
        $db = new PDO(’odbc:SAMPLE’,'db2inst1′,’ibmdb2′,
   3.
            array(PDO_ATTR_PERSISTENT=>true));
   4.
        echo "Connected\n";
   5.
        $db->setAttribute(PDO_ATTR_ERRMODE,PDO_ERRMODE_EXCEPTION);
   6.
        $db->beginTransaction();
   7.
        $db->exec("insert into staff (id, first, last) values (23, ‘Joe’, ‘Bloggs’)");
   8.
        $db->exec("insert into salarychange (id, amount, changedate)
   9.
            values (23, 50000, NOW())");
  10.
        $db->commit();
  11.
      
  12.
      }catch(Exception $e){
  13.
        $db->rollBack();
  14.
        echo"Failed: ".$e->getMessage();
  15.
      }


PDO->beginTransaction() — 标明回滚起始点
PDO->commit() — 标明回滚结束点,并执行SQL
PDO->__construct() — 建立一个PDO链接数据库的实例
PDO->errorCode() — 获取错误码
PDO->errorInfo() — 获取错误的信息
PDO->exec() — 处理一条SQL语句,并返回所影响的条目数
PDO->getAttribute() — 获取一个“数据库连接对象”的属性
PDO->getAvailableDrivers() — 获取有效的PDO驱动器名称
PDO->lastInsertId() — 获取写入的最后一条数据的主键值
PDO->prepare() — 生成一个“查询对象”
PDO->query() — 处理一条SQL语句,并返回一个“PDOStatement”
PDO->quote() — 为某个SQL中的字符串添加引号
PDO->rollBack() — 执行回滚
PDO->setAttribute() — 为一个“数据库连接对象”设定属性
PDOStatement->bindColumn() — Bind a column to a PHP variable
PDOStatement->bindParam() — Binds a parameter to the specified variable name
PDOStatement->bindValue() — Binds a value to a parameter
PDOStatement->closeCursor() — Closes the cursor, enabling the statement to be executed again.
PDOStatement->columnCount() — 返回数据集列的数量对应:num_fields
PDOStatement->errorCode() — Fetch the SQLSTATE associated with the last operation on the statement handle
PDOStatement->errorInfo() — Fetch extended error information associated with the last operation on the statement handle
PDOStatement->execute() — Executes a prepared statement
PDOStatement->fetch() — 返回结果集的下一条.
PDOStatement->fetchAll() — 返回一个数组包含着全部的值
PDOStatement->fetchColumn() — Returns a single column from the next row of a result set
PDOStatement->fetchObject() — Fetches the next row and returns it as an object.
PDOStatement->getAttribute() — Retrieve a statement attribute
PDOStatement->getColumnMeta() — Returns metadata for a column in a result set
PDOStatement->nextRowset() — Advances to the next rowset in a multi-rowset statement handle
PDOStatement->rowCount() — 返回一个数字显示在执行SQL操作后受影响的行数
PDOStatement->setAttribute() — Set a statement attribute
PDOStatement->setFetchMode() — 返回数据库表属性Set the default fetch mode for this statement



作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/1555/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2009-1-4 13:28
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]