在drupal中使用枚举

时间:2009-11-27 05:50:52

标签: mysql drupal

我有一个mysql表id,名称,性别,年龄宗教(enum('HIN','CHR','MUS'),类别(enum('IND','AMR','SPA'),其中last 2是枚举数据类型,我在drupal中的代码是

  $sql="SELECT * FROM {emp} WHERE age=".$age." and religion=".$rel." and category=".$categ;

  $result=db_query_range($sql,0,10);

   while($data=db_fetch_object($result))
    {
      print $data->id." ".$data->name."<br>";
    }

我没有结果或错误。我正在尝试使用每个字段进行不同的查询,除了使用枚举外,一切都很好。

 for ex: $sql='SELECT * FROM {emp} WHERE religion="'.$rel.'"';

在drupal中使用enum数据类型是否有任何问题

2 个答案:

答案 0 :(得分:5)

Enum不是我认为drupal可以用模式API做的事情,这是你在大多数情况下想要用于模块和东西的东西。在你提到它的时候,你也缺少一个结局),但我确信你在制作桌子时做得对。

枚举只是插入值时内置于数据库中的约束。因此,如果您尝试插入无效值,则会插入空字符串。因此它不会对Drupal查询获取数据产生任何影响。当Drupal插入值时,除了将无效值转换为空字符串之外,它也不会有任何效果。您可能想要检查您的数据,看看它是否符合预期。您可能只是没有结果,因为您的查询与任何内容都不匹配。

另一件事是您构建查询的方式是大NO NO ,因为它非常不安全。你应该做的是:

db_query("SELECT ... '%s' ...", $var);

Drupal会用你的var替换%s,并确保没有SQL注入和其他讨厌的东西。 %s表示var是一个字符串,使用%d表示整数,还有一些我刚才记不起来的。你可以有几个像这样的占位符,它们将按顺序插入,就像t函数一样。

答案 1 :(得分:3)

Seconding Googletorps建议使用参数化查询(+1)。这不仅更安全,而且更容易发现错误;)

您的原始查询错过了(字符串)比较值周围的一些引号。以下应该有效(注意添加的单引号):

$sql = "SELECT * FROM {emp} WHERE age='" . $age . "' and religion='" . $rel . "' and category='" . $categ . "'";

正确的方式是这样的:

$sql = "SELECT * FROM {emp} WHERE age='%s' and religion='%s' and category='%s'";
$args = array($age, $rel, $categ);
$result = db_query_range($sql, $args ,0 , 10);
// ...