2012-03-16 3 views
0

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

Спасибо!

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

Какой тип данных является вашей колонкой 'time'? – Matthew

+1

Почему вы не используете «select count (*) FROM ...»? Я думаю, что меньше нагрузки для сервера. –

ответ

4

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

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; 
    } 

и возвращает результат

EDIT - Ваша ошибка в том, что $data['id'] не оценивается в двойных кавычках.

1

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

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

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

// 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(); 

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

Смысл этого ответа заключается в том, что вам нужно использовать либо запрос() метод или количество _все_ результаты(), но не оба. И, независимо от подхода, вам нужно использовать базовые результаты, как указано в documentation.

+1

В любом случае он использовал '$ data ['id']' внутри двойных кавычек, надеясь, что он был оценен :) –

+0

Хорошая добыча, Никола, я был настолько сосредоточен на других ошибках, которые я этого не заметил. В самом деле, как написано в фрагменте вопроса, запрос не имеет никакого отношения к значению, которое в конечном итоге присваивается счету $. Я отредактирую свой ответ, чтобы избавиться от этой вторичной ошибки. – mjv

Смежные вопросы