代码之家  ›  专栏  ›  技术社区  ›  Mike Munroe

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

  •  2
  • Mike Munroe  · 技术社区  · 15 年前

    我正在查询中使用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 回复  |  直到 15 年前
        1
  •  4
  •   Dave Reid    15 年前

    问题是,您可以将所有单值参数传递给db_查询,也可以传递一个参数数组。您的代码正在传递一个值,然后是一个数组,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);
    
        2
  •  1
  •   Mike Munroe    15 年前

    交换查询中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);
    
        3
  •  -1
  •   Ran Bar-Zik    15 年前

    首先,在Drupal7中不推荐使用db_占位符,因此您应该考虑不使用它。这是浪费记忆的功能。

    尝试使用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"