PDO联盟计数

时间:2015-12-01 07:46:13

标签: php mysql pdo

public function totalRecords($keyword) {
    $sql = "SELECT COUNT(uid) FROM user_information WHERE title LIKE ? OR name LIKE ? OR surname LIKE ? 
          UNION ALL
          SELECT COUNT(id) FROM groups WHERE name LIKE ?";
    $query = $this->db->prepare($sql);
    $query->execute(array("%$keyword%", "%$keyword%", "%$keyword%", "%$keyword%"));
    return $query->rowCount();
}

我正在尝试创建寻呼机,我需要记录搜索字词。

上面的代码不起作用,它总是返回0.我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

rowCount()

  

PDOStatement :: rowCount()返回受影响的行数   最后由相应的DELETE,INSERT或UPDATE语句执行   PDOStatement对象。

因此,您必须将fetch()sum()

一起使用
public function totalRecords($keyword) {
    $sql = "SELECT SUM(num) as num  FROM
             (SELECT COUNT(uid) as num FROM user_information WHERE title LIKE ? OR name LIKE ? OR surname LIKE ? 
             UNION ALL
            SELECT COUNT(id)as num FROM groups WHERE name LIKE ?)
            AS X";
    $query = $this->db->prepare($sql);
    $query->execute(array("%$keyword%", "%$keyword%", "%$keyword%", "%$keyword%"));
    $Total = $query->fetch();
   return $Total['num'];
}

答案 1 :(得分:0)

来自rowCount的文档:

  

如果关联的PDOStatement执行的最后一条SQL语句   是SELECT语句,某些数据库可能返回行数   由该声明返回。但是,不保证这种行为   适用于所有数据库,不应依赖于便携式数据库   应用

由于您在子查询中使用UNION ALL而不使用GROUP BY,因此获取的结果将为2行。一个显示user_information表的计数,另一个显示groups表的计数。您可能希望在此处使用->fetch()语句。

此外,由于查询中的所有占位符都使用相同的值,因此请使用命名占位符:

public function totalRecords($keyword) {
    $sql = "SELECT COUNT(uid)
        FROM user_information
        WHERE title LIKE :kwd
            OR name LIKE :kwd
            OR surname LIKE :kwd 
        UNION ALL
        SELECT COUNT(id)
        FROM groups
        WHERE name LIKE :kwd";
    $query = $this->db->prepare($sql);
    $query->execute( array(":kwd" => "%$keyword%") );
    // the resulting array needs to be processed accordingly
    return $query->fetchAll();
}