PHP在过去10分钟内显示在线用户数量

时间:2013-07-09 19:07:49

标签: php count rows

我正在尝试显示过去10分钟内在我的网站上处于活动状态的用户数量,但是我遇到查询语法问题并收到错误“mysql_num_rows()期望参数1为资源,给定布尔值......“

<?php 
$dt = date('Y-m-d h:i:s');
$checktime = $dt - 600;
$query = "SELECT * FROM users WHERE DATE(STR_TO_DATE(lastactive)) BETWEEN '$checktime' AND '$dt'";
$result = mysql_query($query);
$num = mysql_num_rows($result);
echo $num;
?>

真的需要帮助来解决这个问题,请不要评论简单的MySQL函数的弃用,我知道它。

3 个答案:

答案 0 :(得分:4)

此时,使用mysql_功能与您的数据库进行交互将允许人们轻松破解您的网站。这就是原因,我们建议您使用mysqli_PDO。我是PDO的粉丝所以,我将提供一个简单的示例,它将完成这项工作,并且保证您的网站免受mysql注入攻击。

 // last seen time 
 $time = 10:00:00; 

try {
   # First let us connect to our database 
   $conn = new \PDO("mysql:host=localhost;dbname=xx;charset=utf8mb4", "xx", "xx", []); 
 } catch(\PDOException $e){
   echo "Error connecting to mysql: ". $e->getMessage();
 }

$users_online = $conn->prepare("
   SELECT id, username, online_time FROM users 
   WHERE TIMEDIFF(CURTIME(), online_time) < TIME (?) 
   ORDER BY online_time"
);


$users_online->execute(array($time));

foreach($users_online as $user){

   echo "<p> User: {$user['username']} is online </p>";

}

答案 1 :(得分:3)

永远不要做你正在做的事情!

当MySQL可以为您完成所有操作并且只返回一个数字时,您正在获取大量数据并计算行数...这就是您所需要的!像这样:

SELECT COUNT(*) FROM `users` WHERE `lastactive` >= DATE_SUB(NOW(), INTERVAL 10 MINUTE);

^假设lastactiveDATETIME字段。使用INTERVAL部分很容易。可以是:

  • 间隔10分钟
  • INTERVAL 1小时
  • INTERVAL 1 DAY

<强>:)

答案 2 :(得分:0)

您需要先检查结果是否为假

if ($result === FALSE) {
    var_dump(mysql_error());
} else {
    $num = mysql_num_rows($result);
    echo $num;
}

另外,不推荐使用mysql_query或mysql_的任何内容,您应该检查MySQLiPDO以运行查询。