2010-11-20 12 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 

Notice、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データ型を使用してみてください:クエリでdb_query修飾子の順序を入れ替え

 
$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

他にどのようにあなたがdb_placeholdersを使用せずにDrupal6の 'IN( "テキスト"、 "テキスト"、 "テキスト")' でクエリを実行しますか?なぜあなたは 'varchar'が 'text'とは違った働きをすると思いますか? 「varchar」が使用されるべきだと私は同意するが、私が試した唯一の変更であれば、その動作が異なるとは思わないだろう。私は 'varchar'と置き換えてみましたが、同じ結果を得ました。 –

+1

'text'は正常に動作するはずですが、 'varchar'がおそらく適切なタイプです。問題は、引数を関数に渡すことです。 –

1

は、問題を修正します。

$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); 
関連する問題