Drupal 为什么db_占位符为我的查询返回空字符串?

Drupal 为什么db_占位符为我的查询返回空字符串?,drupal,drupal-6,Drupal,Drupal 6,我在查询中使用db_占位符替换字符串数组 $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

我在查询中使用db_占位符替换字符串数组

$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\u路径位于(“”、“”、“”、“”)
。这就是问题所在。从我所看到的情况来看,我希望db_占位符使用正确的语法


有人能告诉我为什么我使用db_占位符返回
('','','','')
而不是
(“评论分析/18”,“评论分析/16”,“评论分析/95”,“评论分析/89”)
尝试使用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" $query=“从{alerts}中选择不同的a.uid、u.mail,然后在u.uid=a.uid上加入{users}u,其中u.mail不为NULL,u.mail!=''和u.status=1,a.status=%d和a.view_路径(“.db_占位符($path,'varchar')”)按a.uid ASC排序”
在查询中交换db_查询修饰符的顺序可以修复此问题

  $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);

问题是,您可以将所有单值参数传递给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);

否则,如果不使用db_占位符,如何在Drupal6中使用“IN”(“text”、“text”、“text”)”运行查询?为什么您希望“varchar”的工作方式与“text”不同?虽然我同意应该使用“varchar”,但如果这是我尝试的唯一改变,我也不会期望行为会有所不同。我确实尝试过用“varchar”替换,得到了相同的结果。“text”应该可以很好地工作,尽管“varchar”可能是合适的类型。问题是将参数传递给函数。