2010-11-20 143 views
2

我在查詢中使用db_placeholder來替換字符串數組。爲什麼db_placeholder爲我的查詢返回空字符串?

$paths = array("commentary_analysis/18", "commentary_analysis/16", "commentary_analysis/95", "commentary_analysis/89"); 

$query = "SELECT DISTINCT a.uid, u.mail FROM {alerts} a JOIN {users} u on u.uid = a.uid WHERE u.mail IS NOT NULL AND u.mail != '' AND u.status = 1 AND a.status = %d AND a.view_path IN (" . db_placeholders($paths, 'text') . ") ORDER BY a.uid ASC"; 

$users_to_notify = db_query($query, $alert_status, $paths); 

查詢沒有返回結果,當我知道它應該。我調試了查詢以查看正在運行的確切查詢。正在運行的查詢是,

SELECT DISTINCT a.uid, u.mail FROM alerts a JOIN users u on u.uid = a.uid WHERE u.mail IS NOT NULL AND u.mail != '' AND u.status = 1 AND a.status = 1 AND a.view_path IN ('','','','') ORDER BY a.uid ASC 

注意,a.view_path IN ('','','','')。那就是問題所在。從我所看到的,我預計db_placeholder正在使用正確的語法。

有人能告訴我爲什麼我使用db_placeholder返回('','','','')而不是("commentary_analysis/18", "commentary_analysis/16", "commentary_analysis/95", "commentary_analysis/89")

回答

4

的問題是可以傳遞所有單個值參數db_query,或者可以傳遞的參數的陣列。你的代碼傳遞一個值,然後是一個數組,而Drupal就不那麼靈活。

試試這個:

$paths = array(
    'commentary_analysis/18', 
    'commentary_analysis/16', 
    'commentary_analysis/95', 
    'commentary_analysis/89', 
); 

$query = "SELECT DISTINCT a.uid, u.mail 
      FROM {alerts} a 
      JOIN {users} u on u.uid = a.uid 
      WHERE u.mail IS NOT NULL 
      AND u.mail != '' 
      AND u.status = 1 
      AND a.status = %d 
      AND a.view_path IN (" . db_placeholders($paths, 'varchar') . ") 
      ORDER BY a.uid ASC"; 

$args = array_merge(array($alert_status), $paths); 
$users_to_notify = db_query($query, $args); 
-1

首先,db_placeholders在Drupal 7中已棄用,所以您應該考慮不使用它。這是內存浪費功能。

嘗試使用VARCHAR數據類型:

 
$query = "SELECT DISTINCT a.uid, u.mail FROM {alerts} a JOIN {users} u on u.uid = a.uid WHERE u.mail IS NOT NULL AND u.mail != '' AND u.status = 1 AND a.status = %d AND a.view_path IN (" . db_placeholders($paths, 'varchar') . ") ORDER BY a.uid ASC" 
+1

你會如何運行其他與Drupal6 'IN( 「文本」, 「文本」, 「文本」)' 查詢,而無需使用db_placeholders?你爲什麼期望'varchar'和'text'的工作方式不同?雖然我同意'varchar'應該被使用,但如果這是我嘗試的唯一改變,我不會指望這種行爲會有所不同。我嘗試用'varchar'替換,結果相同。 – 2010-11-20 21:57:46

+1

'text'應該可以正常工作,雖然'varchar'可能是正確的類型。問題是將參數傳遞給函數。 – 2010-11-21 19:28:06

1

交換在查詢中db_query修飾符的順序解決問題。

$query = "SELECT DISTINCT a.uid, u.mail FROM {ifrmarkets_alerts} a JOIN {users} u on u.uid = a.uid WHERE u.mail IS NOT NULL AND u.mail != '' AND a.view_path IN (" . db_placeholders($paths, 'varchar') . ") AND u.status = 1 AND a.status = %d ORDER BY a.uid ASC"; 
    $users_to_notify = db_query($query, $paths, $alert_status); 
相關問題