drupal-获取节点ID

第一步是获取名言的节点ID。为了得到它,我们将使用 Drupal 的数据库 API 与数据库交互。

数据库API提供了低层级的使用 SQL 语句的数据库访问方法。Drupal处理连接管理的细节。它还进行某种层次的类型检查、字符串转义、以及其它保护特性。

后面的章节中(特别是第六、第七章),我们将学习数据库 API 的更多特性。不过现在,我们只要构造一个基本的查询即可。

提示:Drupal开发者提供了一个很有用的数据库 API 概述。它是标准API文档的一部分:http://api.drupal.org/api/group/database/6.

Drupal数据库中有 6 个表专门用于节点维护。现在,我们只需要直接使用其中一个:节点(node)表。正如其名称所示,这是一个高层次的表,包含了Drupal 中每个节点的基本信息。

节点ID,是我们需要从表中取回的唯一field。但是,我们不需要把所有节点都取回来,对返回的节点应该施加哪些约束呢?

我们需要的是已发布的(published)节点。默认情况下,名言创建时被发布,但也有可能选择不发布(unpublished),我们不要显示这种节点。node 表中的status 域表明了节点是已发布(1)或未发布(0)。

我们想要的节点,其类型为quote。node 表中的 type 域包含节点的内容类型名。

这些就是我们要施加的约束。当然,约束可以更加复杂——我们可以限制只要上星期以来的新名言,或者属于某个特定用户的名言,等等。这些约束可以用 SQL 实现。

现在构造 SQL 所需信息都已齐备了。如果我们在 MySQL 的 monitor 中运行查询,应该象下面这样:

 

SELECT nid FROM node
WHERE status=1 AND type='quote'
ORDER BY RAND() LIMIT 1

这将返回一个已发布的(status=1)具有指定节点类型的(type='quote'0)随机节点ID。p

 

为了使用 Drupal 的数据库 API 进行同样的查询,我们需要做稍许修改。

把 SQL 放入 PHP 代码,我们创建的函数如下所示:
 

function _philquotes_get_quote() {
    $sql = "SELECT nid FROM {node} ".
	"WHERE status=1 AND type='quote' ORDER BY RAND() LIMIT 1";
    $res = db_query($sql);
    $item = db_fetch_object($res);
// Do something with the $item.
}

$sql 变量中是我们的查询语句,但是形式稍有改变。我们不再直接使用表名,而是用一个带有花括号的表占位符代替。在执行此查询之前,Drupal 将用正确的表名代换出现 {node} 占位符地方。

 

提示:表名占位符为管理员提供了改变表名以适应既有惯例的能力。例如,有些ISP 要求所有的表都必须带有预先指定的前缀。通过使用表名占位符,我们避免了数据库的表名变更时需要修改代码的麻烦。

Drupal 的 db_query() 函数执行查询。它返回一个资源句柄($res),这个句柄可以用来操纵查询结果。

db_fetch_object() 函数从数据库中取出一行记录。

我们的查询限定只要一条记录。因此,我们不必循环遍历结果集,我们可以直接取出第一个返回的条目:$item = db_fetch_object($res);。

现在我们有了一个对象 $item,它包含 $nid 属性。我们可以用这个属性访问节点的内容。

评论

发表新评论

此内容将保密,不会被其他人看见。
  • 允许HTML标签:<a> <img><em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd><p>
  • 自动断行和分段。

更多关於格式化选项的信息

Image CAPTCHA
验证码
|