知识网
  • 主页
  • 建站基础
  • 网页设计
  • 开发代码
  • 网页特效
  • 精品网站
  • 数据库
  • 推广运营
  • 广告视觉
  • 开源系统
  • 电脑常识
  • 游戏攻略
  • 科技资讯
  • 其他
  • 当前位置:首页 > 开源系统 > drupal数据库调用方法

    drupal数据库调用方法


    时间:2014-06-19 21:03:08 来源:51xuejianzhan.com 作者:网络 点击:155
    Drupal 7 使用 PDO 连接数据库,鉴于 PHP 6将把 PDO 做为默认数据库连接方式,这是必须的选择。实际上,Drupal 7之前的数据库抽象层,和 PDO 的某些理念一致,用相同的方法操作不同类型的数据库,减少了模块开发者的工作,也提升了程序的兼容性和可移植性。引入 PDO,相对于之前的版本,数据库接口当然有不小的变化。
     
    最显著的,db_fetch_object()、db_fetch_array() 这两个最常用的函数没用了。从前,db_query()或pager_query()之后,几乎必然跟着上述两个函数之一,现在,没有了。而那些 SQL 语句中熟悉的占位符(%d, %s, %f, %n),也没有了。要谈这两个问题,先要了解一下大家最最熟悉的 db_query() 的改变。
     
    在 Drupal 6 中,db_query() 接受无限个参数,第一个为 SQL 语句,后面的参数为查询值,用以替换语句中的占位符,大致类似于:
     
     
    <?php
      db_query("SELECT * FROM {system} WHERE filename = '%s'", 'system');
    ?>
     
     
    在 db_query() 中,%d 和 %s 是不能混用的,一个是数字整型,一个是字符串,%s 也必须使用单引号,防止注入。然后,Drupal 将检查参数的合法性,最后执行语句,返回一个资源对象,用 db_fetch_object() 或 db_fetch_array() 取出结果集。
     
    在 Drupal 7 中,db_query() 接受三个参数,第一个为 SQL 语句,第二个是一组查询值,第三个是数据库连接的一些设置,大致类似于:
     
     
    <?php
      db_query('SELECT * FROM {system} WHERE filename = ?', array('system'));
    ?>
     
     
    在语句中的占位符,不再需要考虑是字符串或是数字,可以完全用 ? 号表示,后面的查询值是一个索引数组,顺序必须与前面的占位符一致,个数也必须相同。很多时候,语句较为复杂,可能需要许多占位符,全用 ? 号,显得混乱,可以这样来让代码更清晰:
     
     
    <?php
      db_query('SELECT * FROM {system} WHERE filename = :name OR type = :theme', array(':name' => 'system',':theme' => 'theme'));
    ?>
    这时候,第二个参数必须是一个关联数组,占位符即是数组键名。这些占位符是完全自定义的,你可以使用你喜欢的“合法”字符。这条语句中很清楚的表明,%d、%s 这些占位符不存在了,被 ? 或自定义的占位符取代了。为什么呢?在 drupal 6 中,%d、%s 是用来定义传入值的类型,然后 Drupal 数据库层做出相应的类型检查。而在 Drupal 7中,PDO 将检查传入值的合法性,不需要程序来实现,所以,那些占位符,也光荣退休了。我觉得这一点会提升一些性能,毕竟程序来做检查,比 PHP 底层来检查,来得慢一些。
     
     
     
    而第三个参数,一般很少用到,除非你想修改一些默认设置。比如,想使用一个新的数据库连接,想返回另一种形式的结果集。Drupal 7支持多个数据连接,在 settings.php 文件中,数据库信息为一个数组,键名即是数据库连接的标识,如 $databases['default'] 是默认连接,这是必须的。模块开发者,可以在模块文件中,自行定义新连接,在操作时,设置连接标识即可,例如:
     
     
    <?php
      $attributes = array(
        'target' => 'mynewdata', // 数据库连接标识
        'fetch' => PDO::FETCH_ASSOC, // 返回的结果集类型
      );
      db_query('SELECT * FROM {system} WHERE filename = :name OR type = :theme', array(':name' => 'system',':theme' => 'theme'), $attributes);
    ?>
     
     
    PDO 默认返回一个索引和关联数组相结合的结果集,Drupal 7中默认设置为返回一个对象,即:PDO::FETCH_OBJ,你可以设置成 PDO::FETCH_ASSOC:返回关联数组,PDO::FETCH_COLUMN:返回首列。等等。所以,db_fetch_object() 和 db_fetch_array() 不需要了,在 db_query() 中直接把这一步省略了。
     
    对比一下:
     
     
    <?php
      // 结果集为对象
      // Drupal 6
      $result = db_query('SELECT filename, type FROM {system}');
      while($o = db_fetch_object($result)){
        echo $o->filename;
      }
     
     
    // Drupal 7
      if($result = db_query('SELECT filename, type FROM {system}')){
        foreach($result as $o){
          echo $o->filename;
        }
     
     
    // 结果集为数组
      // Drupal 6
      $result = db_query('SELECT filename, type FROM {system}');
      while($o = db_fetch_array($result)){
        echo $o['filename'];
      }
     
     
    // Drupal 7
      if($result = db_query('SELECT filename, type FROM {system}', array(), array('fetch' => PDO::FETCH_ASSOC))){
        foreach($result as $o){
          echo $o['filename'];
        }
      }
     
     
    // 获取第一行
      // Drupal 6
      // 当然,这里应该用 db_query_range() 来限制查询数量为 1 条更合适
      $o = db_fetch_object(db_query('SELECT filename, type FROM {system}'));
      echo $o->filename;
     
     
    // Drupal 7
      $result = db_query('SELECT filename, type FROM {system}');
      echo $result->fetch()->filename;
     
     
    // 获取一列
      // Drupal 6
      $filename = db_result(db_query_range('SELECT filename FROM {system}', 0, 1));
      echo $filename;
     
     
    // Drupal 7
      // 注意:db_query_range() 的结构和 Drupal 6 基本一致的
      $result = db_query_range('SELECT filename FROM {system}', 0, 1);
      echo $result->fetchColumn();
    ?>
     
     
    如果对面向对象结构不太熟悉,看起来有点晕。实际上,对于 db_query() 返回的结果,可以使用以下方式获取:
     
     
    <?php
      $result->fetch(); // 获取一行
      $result->fetchAll(); // 获取全部,
      $result->fetchObject(); // 以对象方式获取一行
      $result->fetchAssoc(); // 以关联数组方式获取一行
      $result->fetchColumn(); // 获取首列
    ?>
     
     
    因为 PDO 面向对象的特性,所以,直接使用这样的方式也是合法的:
     
     
    <?php
      db_query('SELECT filename, type FROM {system}')->fetch();
      db_query('SELECT filename, type FROM {system}')->fetchAssoc();
      db_query_range('SELECT filename FROM {system}', 0, 1)->fetchColumn();
    ?>
     
     
    学建站51xuejianzhan.com
    如果使用动态查询,这会更加更加更加的长。如果在 Drupal 7中看到很长很长很长一串的联接,也不要太奇怪。
     
    ----------------读了老东east的这篇后,对Drupal7的数据库有了更深些的认识,很不错的文章,感谢East的分享!

    (责任编辑:小站童)
    drupal, 数据库, 调用,
    评论

    用户名 验证码
    最新评论
    赞助商链接
    网页取色器 | 网页配色工具 | 时间转换 | 精彩收藏 | 每日阅读 | 常用函数库 |

    Copyright © 2012 - 2013 我要学建站 All rights reserved.