xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Тонкость совместного использования 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
Похожие записи

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании