为什么 db_placeholder 为我的查询返回空字符串?

问题描述 投票:0回答:3

我在查询中使用 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")

php drupal drupal-6
3个回答
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_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);

-1
投票

首先,db_placeholders 在 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"
© www.soinside.com 2019 - 2024. All rights reserved.