2010-11-20 2 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, поэтому вам следует не использовать его. Это функция потери памяти.

Try типа с использованием 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

Как бы вы еще выполнить запрос с 'IN ("текст", "Текст", "текст")' в Drupal6 без использования db_placeholders? Почему вы ожидаете, что «varchar» будет работать иначе, чем «текст»? Хотя я согласен, что «varchar» должен использоваться, я бы не ожидал, что поведение будет отличаться, если это единственное изменение, которое я пробую. Я попытался заменить «varchar» и имел тот же результат. –

+1

«текст» должен работать нормально, хотя «varchar», вероятно, подходит для использования. Проблема заключается в передаче аргументов функции. –

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); 
Смежные вопросы