1

過去 10 分間に Web サイトでアクティブだったユーザーの数を表示しようとしていますが、クエリ構文に問題があり、"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_関数を使用してデータベースを操作すると、人々が Web サイトを簡単にハッキングできるようになります。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>";

}
于 2013-07-09T19:17:56.213 に答える
3

あなたがしていることを決してしないでください!

大量のデータをフェッチして行をカウントしているのに、MySQL がすべてを実行し、数値のみを返すことができます...これが必要です! このような:

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

^lastactiveDATETIMEフィールドであると仮定します。INTERVALそして、その部分で遊ぶのは簡単です。次のことができます。

  • インターバル 10分
  • 間隔 1 時間
  • 間隔 1 日

:)

于 2013-07-09T19:17:31.913 に答える