Тонкость совместного использования db_query() и db_placeholders()

Пример использования db_placeholders:

$nids = array(1, 2, 3);
 
$result = db_query("
  SELECT * FROM {node}
  WHERE nid IN (" . db_placeholders($nids) . ")
", $nids);

Всё просто. Но если в запросе нужно использовать больше одного условия, то по привычке можно написать так:

$nids = array(1, 2, 3);
$uid = 1;
 
$result = db_query("
  SELECT * FROM {node}
  WHERE
    nid IN (" . db_placeholders($nids) . ") AND
    uid = %d
", $nids, $uid); // not work

Что окажется неверным. uid в данном случае всегда будет сравниваться с нулём. Правильно так:

$nids = array(1, 2, 3);
$uid = 1;
 
$result = db_query("
  SELECT * FROM {node}
  WHERE
    nid IN (" . db_placeholders($nids) . ") AND
    uid = %d
", array_merge($nids, array($uid))); // work!

Объединять массивы нужно в той последовательности, в которой они используются в запросе.

Написанное актуально для
Drupal 6.x
Теги:
подводные камни, работа с бд
Добавлено: 25 Июля 2018 08:21:13 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...