Php 统计最近24小时的邮件数

Php 统计最近24小时的邮件数,php,mysql,codeigniter,Php,Mysql,Codeigniter,我正在尝试获取用户在过去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(), INTERVA

我正在尝试获取用户在过去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;     
    }

在我看来,您返回了大量数据(使用select*)只是为了计算消息!这是对带宽和处理能力的严重浪费。做

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']
未在双引号内计算。

在我看来,您返回了大量数据(使用select*),只是为了计算消息!这是对带宽和处理能力的严重浪费。做

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']
未在双引号内计算。

问题的根源(以及错误的结果)是您混合了两种访问数据库的方法:

  • 使用query()函数可以有效地执行作为参数传递的SQL。此函数返回需要利用的结果对象
  • 使用count_all_results()函数,您可以在查询/选择条件的当前状态下运行“SELECT count(*)(或其他等效项)。[您以前必须通过链接操作符(如like*not_like*fromwhere等)来构建该查询/选择条件]。该函数返回一个整数,即行数。
    对于问题的片段,活动记录上下文被完全重置[在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

对于第二种方法,我不是100%了解SQL如何有效地传递和执行文字“DATE_SUB()…”(因为它是SQL函数,所以必须这样做),但这是另一个问题;为了安全起见,请使用注释掉的语法,该语法使用单个where表达式作为单个字符串传递

这个答案的要点是,您需要使用query()方法或count\u all\u results(),但不能同时使用这两种方法。而且,无论采用哪种方法,您都需要利用中规定的基本结果。

问题(以及错误结果)的根源在于您混合了两种访问数据库的方法:

  • 使用query()函数可以有效地执行作为参数传递的SQL。此函数返回需要利用的结果对象
  • 使用count_all_results()函数,您可以在查询/选择条件的当前状态下运行“SELECT count(*)(或其他等效项)。[您以前必须通过链接操作符(如like*not_like*fromwhere等)来构建该查询/选择条件]。该函数返回一个整数,即行数。
    对于问题的片段,活动记录上下文被完全重置[在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

对于第二种方法,我不是100%了解SQL如何有效地传递和执行文字“DATE_SUB()…”(因为它是SQL函数,所以必须这样做),但这是另一个问题;为了安全起见,请使用注释掉的语法,该语法使用单个where表达式作为单个字符串传递


这个答案的要点是,您需要使用query()方法或count\u all\u results(),但不能同时使用这两种方法。而且,无论采用哪种方法,您都需要利用。

您的
time
列中规定的基本结果?为什么不使用“select count(*)FROM…”?我认为服务器的负载更小。您的
时间
列的数据类型是什么?为什么不使用“select count(*)FROM…”?我认为服务器的负载更小。无论如何,他在双引号中使用了
$data['id']
,希望得到评估:)很好,Nichola,我太专注于其他错误,以至于我没有注意到这一点。事实上,正如问题片段中所述,查询与最终分配给$count的值根本不相关。我将编辑我的答案以清除这个次要错误。无论如何,他在双引号中使用了
$data['id']
,希望它得到评估:)很好,Nichola,我太专注于其他错误了,以至于我没有注意到这一点。事实上,正如问题片段中所述,查询与最终分配给$count的值根本不相关。我将编辑我的答案以清除这个次要错误。