Drupal 7 数据库 操作(很好,很犀利)

来源:互联网 发布:www.js sanfu.com 编辑:程序博客网 时间:2024/04/28 21:36

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}'01));
  echo 
$filename;

 

// Drupal 7
  // 注意:db_query_range() 的结构和 Drupal 6 基本一致的
  
$result db_query_range('SELECT filename FROM {system}'01);
  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}'01)->fetchColumn();
?>

 

如果使用动态查询,这会更加更加更加的长。如果在 Drupal 7中看到很长很长很长一串的联接,也不要太奇怪。

----------------读了老东east的这篇后,对Drupal7的数据库有了更深些的认识,很不错的文章,感谢East的分享!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑显示网卡驱动不正常怎么办 微信别人拒收消息怎么办 电脑无线网卡速度慢怎么办 网吧吃鸡更新慢怎么办 手机号注册不了微信怎么办 小米账号密码忘了怎么办 小米手机账号密码忘了怎么办 华为手机账号密码忘记了怎么办 老年机开不了机怎么办 天谕没有顺网登陆怎么办 苹果密保问题忘了怎么办 密保手机没用了怎么办 qq密保手机没用了怎么办 手机开机按钮坏了怎么办 改了账号游戏角色消失怎么办 华为开机键坏了怎么办 抖音账号已重置怎么办 抖音账号被重置怎么办 吃鸡账号密码忘了怎么办 微信只记得账号忘了手机号怎么办 红米3开机键失灵怎么办 晚自习教室有许多虫子怎么办 泰迪吃草又呕吐怎么办 手机不断收到验证码信息怎么办 樱桃吃多了上火怎么办 过年不想回婆婆家过怎么办 旅行箱提手坏了怎么办 影棚人物后面有影子怎么办 微信运动图标不见了怎么办 逆光拍摄人黑了怎么办 单反镜头刮花了怎么办 股东各50股份不同意退股怎么办 退股没有协议他不愿意退钱怎么办 s7刷机有三星帐号id怎么办 做主播留不住人怎么办 直播间留不住人怎么办 淘宝直播间留不住人怎么办 干了一个月不发工资怎么办 16岁长白色头发怎么办 腾讯乘车码解约了怎么办 蓝洞棋牌客封号怎么办