Почему db_placeholder возвращает пустые строки для моего запроса? - PullRequest
2 голосов
/ 21 ноября 2010

Я использую 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")?

Ответы [ 3 ]

4 голосов
/ 21 ноября 2010

Проблема в том, что вы можете либо передать все аргументы с одним значением в 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 голос
/ 21 ноября 2010

Смена порядка модификаторов 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);
0 голосов
/ 21 ноября 2010

Прежде всего, db_placeholder в 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"
...