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.我怎么能这样做?
答案 0 :(得分:3)
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();
}