2015-12-01 2 views
3
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(); 
} 

Я пытаюсь создать пейджер, и мне нужно предоставить полный список поисковых запросов.PDO Union Count

Выше код не работает, он всегда возвращает 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']; 
} 
+2

Но этот запрос будет возвращать _two_ записи. В настоящее время ваш фрагмент кода возвращает только 'COUNT (uid) как num FROM user_information'. – VolkerK

+0

да, вы правы, он вернет две записи. Спасибо, что указали это. Я обновил свой ответ – Saty

+1

Теперь он работает. Я удаляю свой ответ; здесь нет необходимости в альтернативах ;-) – VolkerK

0

Из документации на rowCount:

Если последний оператор SQL выполняется соответствующими PDOStatement был SELECT заявления, некоторые базы данных могут возвращать количество строк , возвращенных этим утверждением. Однако это поведение не гарантируется для всех баз данных и не должно полагаться на переносные приложения .

Поскольку вы используете UNION ALL без Пу GROUP BY s в подзапросов, извлеченной результаты будут 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(); 
}