You are here

执行简单的查询

老葛的Drupal培训班 Think in Drupal

Drupal的函数db_query()是用来为已建立的数据库连接执行查询语句的。这些查询语句包括SELECT, INSERT, UPDATE, 和 DELETE
 
    当你编写SQL语句的时候,你需要注意一些特定于Drupal的语法。首先,表名应放在花括号之间,这样以来,在需要的情况下,就可以为表名添加前缀了,从而保证表名的唯一性。虚拟主机托管商常常会限制了用户的数据库个数,而这一约定则可以让用户在已有的数据库上安装Drupal,通过在他们的settings.php文件中声明数据库前缀来避免表名的冲突。下面是一个简单查询的例子,用来取回角色2的名字:
$result = db_query('SELECT name FROM {role} WHERE rid = %d', 2);
 
 注意,占位符%d的使用。在Drupal中,查询语句通常会使用占位符,而实际的值则作为参数跟在后面。占位符%d将被后面参数值(在这里就是2)自动的替换掉。占位符越多,那么参数就会越多,两者是相对应的:
 
db_query('SELECT name FROM {role} WHERE rid > %d AND rid != %d', 1, 7);
 
在数据库中执行时,前面的一行将转化为如下形式:
 
SELECT FROM role WHERE rid > 1 and rid != 7
 
    用户提交的数据应该作为单独的参数传入,这样这些值就可以被清理,从而阻止SQL注入攻击。Drupal使用printf语法(参看http://php.net/printf)来实现占位符对查询语句中实际值的替换。根据用户提交信息的数据类型,可以选用不同的占位符。
5-1列出了数据库查询的占位符及其含义。
 
5-1数据库查询的占位符及其含义
占位符         含义
------------------------------------------------------------------------------
%s              字符串
%d              整数
%f              浮点数
%b              二进位数据;不要包含在' '
%%     插入一个%符 (比如,SELECT * FROM {users} WHERE name LIKE '%%%s%%')
 
    db_query()的第一个参数总是查询语句本身。剩下的参数都是一些动态值,用来验证和入到查询字符串中。可以将这些值放在一个数组中,或者将每个值都作为一个独立的参数。后者更常用一些。
    我们应该注意到,使用这个语法,TRUE, FALSE 和NULL将会被自动转换为了等价的数字形式(0或1)。一般情况下,都不会因此出现问题。
    让我们看一些例子。在这些例子中,我们使用一个名为joke的数据库表,它包含了3个字段:节点ID(整数),版本ID(整数),还有包含笑话妙语的文本字段(关于joke模块的更多信息,参看第7章)。
    让我们从一个简单的查询入手。 从joke表中取出所有字段的所有记录,需要满足的条件为----字段vid的整数值等于$node->nid的值:
 
db_query('SELECT * FROM {joke} WHERE vid = %d', $node->vid);
 
    向joke表中插入一行记录。新纪录中包含两个整数和一个字符串值。注意字符串值的占位符位于单引号中;这将帮助阻止SQL注入攻击。由于查询语句本身包含了单引号,所以我们在查询的外面使用了双引号:
db_query("INSERT INTO {joke} (nid, vid, punchline) VALUES (%d, %d, '%s')",
$node->nid, $node->vid, $node->punchline);
 
    修改joke表中的所有记录,需要满足的条件为----字段vid的整数值等于$node->nid的值。通过设置字段puchline等于$node->punchline包含的字符串值来修改所有的这些记录:
db_query("UPDATE {joke} SET punchline = '%s' WHERE vid = %d", $node->punchline,
$node->vid);
 
    从joke表中删除所有记录,需要满足的条件为----字段vid的整数值等于$node->nid的值:
db_query('DELETE FROM {joke} WHERE nid = %d', $node->nid);

 

Drupal版本:

评论

在数据库中执行时,前面的一行将转化为如下形式: 
SELECT name FROM role WHERE rid > 1 and rid != 7
---------------------------------------------------------------------------------
让我们从一个简单的查询入手。 从joke表中取出所有字段的所有记录,需要满足的条件为----字段vid的整数值等于$node->vid的值:
db_query('SELECT * FROM {joke} WHERE vid = %d', $node->vid);
----------------------------------------------------------------------------------------
修改joke表中的所有记录,需要满足的条件为----字段vid的整数值等于$node->vid的值。通过设置字段puchline等于$node->punchline包含的字符串值来修改所有的这些记录:
----------------------------------------------------------------------------------------------

从joke表中删除所有记录,需要满足的条件为----字段nid的整数值等于$node->nid的值: