количество сообщений за последние 24 часа - PullRequest
0 голосов
/ 16 марта 2012

Я пытаюсь получить количество сообщений, отправленных пользователем за последние 24 часа.Мой код возвращает только целое число 1, когда это просто не соответствует действительности.Что я делаю неправильно?Мои даты в этом формате: 2012-03-01 10: 57: 32

Спасибо!

    function get_quota($data)
    {   
        $sql = "select * FROM messages WHERE user_id = {$data['id']} 
                    AND time > DATE_SUB(now(), INTERVAL 1 DAY)";
        $this->db->query($sql);
        $count=$this->db->count_all_results();  
        return $count;     
    }

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Мне кажется, что вы возвращаете много данных (с выбором *) только для подсчета сообщений! Это ужасная трата пропускной способности и вычислительной мощности.Выполните

function get_quota($data)
    {   
        $sql = "select count(*) as howmany FROM messages WHERE user_id = {".$data['id']."} AND time > DATE_SUB(now(), INTERVAL 1 DAY)";
        $myResults = $this->db->query($sql);
        retrn $myResults->row()->howmany;
    }

и верните результат

РЕДАКТИРОВАТЬ - Ваша ошибка заключалась в том, что $data['id'] не оценивается в двойных кавычках.

1 голос
/ 16 марта 2012

Источником проблемы (и неверного результата) является то, что вы смешиваете два способа доступа к базе данных:

  • с функцией query (), эффективно выполняющей SQLкоторый передается в качестве аргумента.Эта функция возвращает объект Result, который необходимо будет использовать.
  • с помощью функции count_all_results () вы запускаете «SELECT COUNT (*)» (или что-то эквивалентное) в текущем состоянии запроса / выборакритерии [которые вы должны предварительно построить с помощью цепочек операторов, таких как например , * not_like *, из ,, где и т. Д.].Функция возвращает целое число, равное количеству строк.
    В случае фрагмента вопроса контекст Active Record полностью сбрасывается [сразу после вызова query ()], и поскольку вы даже не передаетеЕсли это имя таблицы или другой критерий, функция возвращает значение 1 (возможно, потому что результатом является одна ошибка или что-то вроде этого).

Поэтому вам следует выбрать one или другой подход , т.е.в частности, либо:

// Note how we use COUNT(*) as suggested in other comments and answers, since
// we do not need the actual data, just the count
// If you are intent on the original, very inefficient approach, use the 
// select * ... query and then get the number of rows with something like
// $count = $myResults->num_rows();
// Also, unrelated, note how the $data['id'] expression was removed from the
// string literal since it needs to be evaluated by PHP not by SQL (thanks
// to Nichola Peluchetti for pointing that out).
$sql = "select COUNT(*) AS NbOfRows FROM messages WHERE user_id = {".$data['id']."} 
        AND time > DATE_SUB(now(), INTERVAL 1 DAY)";
$myResults = $this->db->query($sql);
$count = $myResults->row()->NbOfRows

или

   // build your search criteria
   $this->db->from('messages');
   $this->db->where('user_id', $data['id']);
   $this->db->where('time >',  'DATE_SUB(now(), INTERVAL 1 DAY)')
   // $this->db->where("'time >' DATE_SUB(now(), INTERVAL 1 DAY)")
   $count = $this->db->count_all_results();

Для второго подхода я не на 100% от того, как / если литерал 'DATE_SUB () ...' эффективно получаетпередается и выполняется SQL (что и должно быть, поскольку это функция SQL), но это другая проблема;чтобы быть в безопасности, используйте закомментированный синтаксис, который использует одно , где выражение передается в виде одной строки.

Смысл этого ответа в том, что вам нужно использовать либо query () метод или count _all_ results () , но не оба одновременно.И, независимо от подхода, вам необходимо использовать базовые результаты, как предписано в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...