как сохранить время выхода пользователя из системы в базе данных для каждого входа в систему с использованием MySQL и PHP?

#php #mysql

#php #mysql

Вопрос:

Я новичок в PHP и MySQL. Мой проект посвящен системе управления школой. В этом проекте у меня 3 пользователя. Всякий раз, когда они входят в систему, время входа в систему сохраняется правильно каждый раз. И когда пользователь выходит из системы, время выхода сохраняется. Проблема в том, что время последнего выхода из системы также обновляется до предыдущего времени выхода из системы для этого конкретного пользователя. Заранее спасибо

Мой код:

login.php

 $sql = $conn->query("Insert into userlog (username) values ('$username')");
  

Выйдите из системы. php

 <?php

include("php/dbconnect.php");
ob_start();


mysqli_query($conn,"UPDATE userlog SET logoutTime = NOW()  WHERE username = '$_SESSION[username]'   ");


unset($_SESSION['name']);

unset($_SESSION['uid']);

unset($_SESSION['username']);

echo '<script type="text/javascript">window.location="login.php"; </script>';


?>
  

Я ожидаю ,

 id username login logout
1    1111   12:10  12:20
2    1111   12:40  12:50
  

Но мой вывод выглядит следующим образом,

 id username login logout
1    1111   12:10  12:50
2    1111   12:40  12:50
  

Комментарии:

1. Привет, добро пожаловать в SO и поздравляю с приобретением нового навыка! Этот комментарий не связан с вашим вопросом, но я должен дать вам важную информацию! Ваш пример кода показывает уязвимость. Вы должны узнать о SQL-инъекциях как можно скорее!

Ответ №1:

Вам нужно убедиться, что вы обновляете только последнее время входа в систему, поэтому добавьте условие в свое WHERE предложение для этого:

 mysqli_query($conn,"UPDATE userlog 
                    SET logoutTime = NOW()  
                    WHERE username = '$_SESSION[username]'
                      AND loginTime = (SELECT maxLoginTime 
                                       FROM (SELECT MAX(loginTime) AS maxLoginTime
                                             FROM userlog 
                                             WHERE username = '$_SESSION[username]') u)"
            );
  

Демонстрация на dbfiddle

Комментарии:

1. после использования вашего запроса время выхода из системы равно 0000: 00:00. Он не дает никакого ответа

2. @K.Kishore извините, что я забыл добавить слой подзапроса для устранения ошибки «невозможно выбрать из таблицы, которая обновляется». Пожалуйста, попробуйте еще раз. Примечание. Я добавил демонстрацию, чтобы показать запрос, работающий на dbfiddle.

3. Спасибо! Это работает отлично. Вывод тихий, хороший. Но у меня есть одно сомнение в том, что в этом запросе вы использовали термин «u». Что это такое?

4. @K.Kishore когда вы используете «производную таблицу», то есть подзапрос в FROM предложении, вы должны присвоить таблице имя, например (SELECT ... FROM ...) AS name . AS Является необязательным. В этом случае я назвал таблицу u , на самом деле не имело значения, какое имя было, поэтому я просто выбрал первую букву имени основной таблицы. Для получения дополнительной информации попробуйте поискать в Google «каждая производная таблица должна иметь псевдоним»

5. Большое спасибо @Nick