2009-11-27 66 views
1

我有一個mysql表id,姓名,性別,年齡宗教('HIN','CHR','MUS'),類別(枚舉('IND','AMR','SPA 「),其中最後2枚舉數據類型和我在Drupal代碼爲在drupal中使用enum

$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中使用枚舉數據類型有任何問題

回答

5

枚舉不是我的東西,我相信Drupal可以使用模式API,這是你在大多數情況下想要用於模塊和東西的東西。在你提到它的時候,你也沒有結局),但我相信你在做這張桌時做得對。

枚舉只是插入值時內置到數據庫中的一個約束。所以如果你嘗試插入一個無效值,你會插入一個空字符串。所以它不會對Drupal查詢獲取數據產生任何影響。當Drupal插入值時,它也不會有任何影響,除了將無效值轉換爲空字符串。你可能想檢查你的數據,看它是否如預期的那樣。你可能只是因爲你的查詢不匹配任何結果而沒有結果。

另一件事是你構建你的查詢的方式是大沒有NO,因爲它是非常不安全的。你應該做的是這樣的:

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

Drupal將用你的var替換%s,並確保沒有SQL注入和其他討厭的東西。 %s表示var是一個字符串,使用%d表示整數,還有一些我現在還記不起來。你可以有幾個這樣的佔位符,它們將按順序插入,就像t函數一樣。

+2

+1 - 同意。另外還有一些注意事項:(1)'db_query()'和'db_query_range()'可以接受任何這些%修飾符:%s,%d,%f,%b和%%。它們的含義的解釋在PHP文檔中:http://www.php.net/manual/en/function.sprintf.php,而'%%'被簡單的%代替。 (2)除非你的模塊被稱爲'emp',並且這是你唯一的表格(你的例子很好),用模塊名稱預先填充表格是很好的編碼習慣,例如:'mymodule_emp'。 – mac 2009-11-27 09:09:16

3

借調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); 
// ... 
+0

我其實注意到了那個失蹤的',有點困惑,但是當時認爲它只是錯別字。是清晨和所有;)好點thouhg - +1 – googletorp 2009-11-27 10:17:19