跳转到主要内容
toto多背一公斤 提交于 26 July 2014

  原文地址:https://www.drupal.org/node/93737

Drupal6中的db_rewrite_sql()函数,和Drupal7里的db_select()加上'node_access'的tagged方法,可以为模块提供了一个方法来来扩展SQL查询。

注:Drupal7 中的db_select()的tagged方法:

$query = db_select('node', 'n')
->addTag('node_access');

例如,一个模块控制节点访问,但需要限制查询结果,排除访问者不具有该节点访问权限的所有节点。

如果你不使用db_rewrite_sql()或其 ->addTag方法,访问控制模块将不能够修改或扩展您的SQL查询,你可能会在不经意间展示出要限制的内容。

这是很好的习惯,去使用db_rewrite_sql() 或 ->addTag() 方法来做查询。

[注:这里有篇文章提出了异议(#835068: Document usage of static vs dynamic queries) ,有关是否应该总是使用db_select()函数的。重要的一点,当你要查询的node数据表时,需要其他模块来执行节点的访问限制,在Drupal7 的唯一方法是使用db_select->addTag()。

但也有一些例外情况, 如:

  •     在内部模块中进行查询,但不负责为用户展示内容(例如,cron任务查询)。
  •     管理页面中进行查询,需要显示一个未过滤列表,并且用户已经得到了授权权限。