#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)"
);
Комментарии:
1. после использования вашего запроса время выхода из системы равно 0000: 00:00. Он не дает никакого ответа
2. @K.Kishore извините, что я забыл добавить слой подзапроса для устранения ошибки «невозможно выбрать из таблицы, которая обновляется». Пожалуйста, попробуйте еще раз. Примечание. Я добавил демонстрацию, чтобы показать запрос, работающий на dbfiddle.
3. Спасибо! Это работает отлично. Вывод тихий, хороший. Но у меня есть одно сомнение в том, что в этом запросе вы использовали термин «u». Что это такое?
4. @K.Kishore когда вы используете «производную таблицу», то есть подзапрос в
FROM
предложении, вы должны присвоить таблице имя, например(SELECT ... FROM ...) AS name
.AS
Является необязательным. В этом случае я назвал таблицуu
, на самом деле не имело значения, какое имя было, поэтому я просто выбрал первую букву имени основной таблицы. Для получения дополнительной информации попробуйте поискать в Google «каждая производная таблица должна иметь псевдоним»5. Большое спасибо @Nick