2010-11-20 20 views
2

Dizeler dizisini değiştirmek için bir sorgu içinde db_placeholder kullanıyorum.Neden db_placeholder sorgum için boş dizeleri döndürüyor?

$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); 

Sorunu, bildiğim zaman döndürmüyor. Çalıştırılmakta olan tam sorguyu görmek için sorguyu ayıkladım. Sorgu yürütülüyor

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 

Bildirim, a.view_path IN ('','','','') vardır. Sorun budur. Gördüğüm kadarıyla db_placeholder'ın doğru sözdizimi ile kullanılmasını bekliyorum.

Birisi bana db_placeholder kullanımımın neden ("commentary_analysis/18", "commentary_analysis/16", "commentary_analysis/95", "commentary_analysis/89") yerine ('','','','') döndürdüğünü söyler misiniz?

cevap

4

sorun db_query tüm tek değer argümanları ya veya ifade dizi geçebilir olan. Kodunuz tek bir değer ve bir dizi geçiriyor ve Drupal sadece bu kadar esnek değil.

bu deneyin:

$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

Her şeyden önce, db_placeholders Drupal 7'de kullanımdan kaldırıldı, bu yüzden kullanmadığınızı düşünmelisiniz. Hafıza kaybı fonksiyonu.

deneyin kullanarak varchar veri türü:

 
$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

Eğer db_placeholders kullanmadan Drupal6 içinde 'IN ("metin", "metin", "metin")' ile bir sorgu aday olacağını başka nasıl? 'Varchar'ın neden' metin 'den farklı çalışmasını beklersiniz? Her ne kadar 'varchar' kullanılmasına katılıyorum olsa da, denediğim tek değişiklik bu davranışın farklı olmasını beklemezdim. Ben 'varchar' ile değiştirmeyi deneyin ve aynı sonucu vardı. –

+1

'Metin' iyi çalışır, ancak 'varchar' muhtemelen kullanmak için uygun bir türüdür. Sorun argümanlarda işleve geçiyor. –

1

sorguda db_query değiştiricilerin sırasını değiştirmek, sorununu giderir.

$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); 
İlgili konular