1

我正在尝试显示过去 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 函数的弃用,我知道这一点。

4

3 回答 3

4

此时,使用mysql_函数与您的数据库进行交互将使人们可以轻松地入侵您的网站。这就是为什么,我们建议您使用mysqli_or 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>";

}
于 2013-07-09T19:17:56.213 回答
3

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

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

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

^ 假设lastactive是一个DATETIME字段。而且很容易玩这个INTERVAL角色。可:

  • 间隔 10 分钟
  • 间隔 1 小时
  • 间隔 1 天

:)

于 2013-07-09T19:17:31.913 回答
0

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

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

附带说明一下,不推荐使用 mysql_query 或 mysql_anything,您应该检查MySQLiPDO以运行您的查询。

于 2013-07-09T19:15:36.447 回答