2016-09-15 5 views
2

Я создаю функцию, чтобы показать, сколько пользователей сейчас в сети. Это зависит от того, кто открыл страницу за последние 5 минут. Каждая нагрузка страницы сохраняется в мою БД, ниже:Количество записей в DB PHP

Database Table

На данный момент у меня есть следующий код

$query = mysql_query("SELECT user_id, timestamp FROM user_actions WHERE timestamp > date_sub(now(), interval 5 minute)"); 
     $onlineUsers = mysql_num_rows($query); 

Это просто суммирование количества строк, как я могу сделать это так, он только учитывает user_id один раз? (Так в вышеупомянутой базе данных фрагмента код должна быть 2 не 5)

+0

Если вам явно не нужно возвращать метку времени, не ...., а затем просто 'SELECT DISTINCT user_id FROM ...' –

+1

Пожалуйста, не используйте 'mysql_ *' api. Swap to 'PDO' или' mysqli', 'mysql' api устарел и удален в более поздних версиях php (по уважительным причинам). – Jite

+0

'$ query = mysql_query (" SELECT DISTINCT (user_id), timestamp FROM user_actions WHERE timestamp> date_sub (now(), interval 5 minute) ");' попробуйте этот запрос –

ответ

0

С mysql_* устарел (PHP-вперед) и удалены в (php 7). Так mysqli_* пример здесь: -

<?php 

error_reporting(E_ALL); 
ini_set('display_errors',1); 

$conn = mysqli_connect('localhost','username','password','db name');//change credentials here 
$online_users = array(); 
if($conn){ 

    $query = mysqli_query($conn,"SELECT DISTINCT(user_id), timestamp,page FROM user_actions WHERE timestamp > date_sub(now(), interval 5 minute)"); 

    if($query){ 
     while($row = mysqli_fetch_assoc($query)){ 
      $online_users[] = $row; 
     } 
    }else{ 
     echo "query error:-".mysqli_error($conn); 
    } 
}else{ 
    echo "db connection error:-".mysqli_connect_error(); 
} 

?> 
<table> 

<tr> 
    <thead> 
     <th>User Id</th> 
     <th>timestamp></th> 
     <th>Page Visited</th> 
    </thead> 
</tr> 
<tbody> 
    <?php foreach($online_users as $online_user){?< 
      <tr> 
       <td><?php echo $online_user['user_id'];?></td> 
       <td><?php echo $online_user['timestamp'];?></td> 
       <td><?php echo $online_user['page'];?></td> 
      </tr> 
    <?php }?> 
</tbody> 
</table> 

Примечание: - Если вы хотите, чтобы показать онлайн имя пользователя и тогда вы должны сделать JOIN query.

изменение таблица код соответственно.

Это пример кода. измените его соответствующим образом.

+2

Ваш код уязвим для атак XSS. – PeeHaa

+0

Distinct относится ко всему набору результатов, а не только к одному полю. 'SELECT DISTINCT (user_id), timestamp, page ...' будет возвращать 5 записей так, как без четких, поскольку данные в полях timestamp или 'page' отличаются друг от друга. Я понятия не имею, почему OP отметил этот «ответ», если ожидаемый результат был равен 2, а не 5. – Shadow

1

использование DISTINCT ключевого слова

$query = mysql_query("SELECT DISTINCT(user_id), timestamp FROM user_actions WHERE timestamp > date_sub(now(), interval 5 minute)"); 
$onlineUsers = mysql_num_rows($query); 
+0

... count (distinct (user_id)), поскольку number_of_users_online ... – verhie

+0

различается по набору результатов, вы не можете ограничивать его только одним столбцом набора данных. – Shadow

0

Вы можете использовать группу, например путем

SELECT user_id, timestamp FROM user_actions WHERE timestamp > date_sub(now(), interval 5 minute) group by user_id; 
+0

Ваш запрос противоречит стандарту sql и будет работать только в MySQL в определенных настройках режима sql. В последних версиях MySQL настройки по умолчанию, к счастью, предотвратили бы запуск этого запроса. – Shadow

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