#php #mysql #phpstorm
#php #mysql #phpstorm
Вопрос:
К вашему сведению: это домашнее задание, поэтому я не могу опубликовать весь код.
Я использую Ubuntu 18.04, используя PhpStorm в режиме отладки, и просто чтобы убедиться, я добавил
$_POST = array();
$_SESSION = array();
для очистки этих массивов в конце целевой страницы вызывается view_mainpage.php
при успешном входе в систему, а также controller.php
вызывается справа перед exit()
.
У меня есть оператор switch controller.php
для присоединения или входа. Половина входа выглядит так:
switch ($command) { // When a command is sent from the client
case 'SignIn': // With username and password
if (user_exists($username)== false) {//user does not exist
something_wrong();
}
else { //user exists validate entries first
if((check_username()!='ok') || (check_password()!='ok')){
something_wrong();
}
else{//all entries are well formatted
//set valid_username
$valid_username = $username;
$_SESSION['valid_user'] = $valid_username;
//validate existing user
if(validate_existing_user($username, $password)==false){
something_wrong();//row with username, pass not found
}
else {
//get user id
$user_id = get_user_id($username);
if($user_id!=-1){
include('w4_view_mainpage.php');
}
}
}
}
$_POST = array();
$_SESSION = array();
exit();
В верхней части controller.php , он обрабатывает первый раз, когда он приземляется controller.php
вот так:
<?php
//When controller.php is accessed for the first time
if(!isset($_SESSION)){
session_start();
}
if (empty($_POST['page'])) {
$d_type = 'none';
//$_SESSION['display_type'] = $d_type;
include ('w4_view_startpage.php');
exit();
}
/*
* When commands come from StartPage or MainPage meaning it's not the first time we landed
on controller.php so it goes to the switch statement.
*/
require ('model.php'); // connect to MySQL database; functions to access DB tables
// When commands come from StartPage
if ($_POST['page'] == 'StartPage') {
$command = $_POST['command'];
$username = $_POST['username'];
$password = $_POST['password'];
$email='';
if(!empty($_POST['email'])){
$email = $_POST['email'];
}
.
.
.
Я включил еще немного кода и комментариев, чтобы показать, как происходит вход / присоединение.
-
Итак, в самый первый раз, когда он перенаправляется на
view_startpage.php
это, есть небольшое интерактивное меню и всплывающие модальные окна для присоединения или входа. -
При успешном «присоединении» пользователь перенаправляется
view_startpage.php
, но при успешном входе перенаправляется тудаview_mainpage.php
, где, как упоминалось выше, я очищаю сообщение и сеанс. -
Но когда я обновляю страницу в Firefox и обновляю на PhpStorm,
$_POST
и$_REQUEST
у меня уже есть элементы дляpage
,command
,username
,password
из предыдущего входа, поэтому я никогда не смогу вернуться к view_startpage.php , он просто перезагружаетview_mainpage.php
.
Я пробовал аннулировать кэши и перезапускать, но это не всегда работает. На этот раз прямо перед написанием этого он сделал.
Соединение с MySQL и model.php
все мои функции, похоже, работают, поэтому я понятия не имею, что я могу сделать, чтобы каждый раз «начинать заново».
Редактировать: ответы на некоторые вопросы в комментариях ниже.
$username
$password
и$email
отправляются через форму на startpage.php .
<form method='post' action='w4_controller.php'>
<input type='hidden' name='page' value='StartPage'>
<input type='hidden' name='command' value='SignIn'>
<label class='modal-label'>Username:</label>
<input type='text' name='username' required>
<span id="username-error">
<?php
...left out php as it is the homework. basically inline error messages when input is invalid
}?>
</span>
<br>
<br>
<label class='modal-label'>Password:</label>
<input type='password' name='password' required>
<span id="password-error">
<?php
...left out php per above
}?>
</span>
<br>
<br>
<input type='submit'>amp;nbsp;amp;nbsp;
<input id='cancel-signin-button' type='button' value='Cancel'>amp;nbsp;amp;nbsp;
<input type='reset'>
</form>
Комментарии:
1. Я не вижу смысла использовать сеансы, если вы очищаете переменную сеанса в конце скрипта? Сеансы используются для хранения данных между запросами, поэтому их удаление в конце сценария / запроса противоречит цели. Или
something_wrong()
перенаправить пользователя?2. Вы также должны опубликовать весь соответствующий код, например, из какой-либо из этих «магических переменных», например
$username
,$password
из формы, как вы отправляете данные (ajax или просто обычная отправка формы?) Было бы неплохо с пошаговым руководством, как вы воспроизводите проблему. На данный момент это немного неясно. Мы можем помочь лучше, если у нас будет более широкий взгляд. Кроме того, это просто проблема при отладке в PhpStorm или у вас такая же проблема при тестировании через браузер (без участия PhpStorm вообще)?3. Без PhpStorm мой код работает. Я запустил его через терминал в VSCode в стеке LEMP (Nginx, MySQL) без проблем. Я настроил X-debug на PhpStorm и вижу, что он использует файлы cookie, так что это связано с этим или ответ amit177 правильный?
Ответ №1:
$_POST = array();
Очистка массива на самом деле не очищает его на стороне клиента, только на стороне сервера — с вашей стороны.
Что вам нужно сделать, это перенаправить пользователя на ту же страницу (заголовок местоположения), таким образом, запрос будет изменен с POST на GET, и предыдущая информация не будет отправлена, когда клиент обновит страницу.
Пример:
header("Location: ".$_SERVER["PHP_SELF"]);
exit();
Комментарии:
1. можете ли вы привести небольшой фрагмент в качестве примера для вашего ответа?
2. добавлено, не совсем уверен, насколько это было бы полезно. P.S. Mangus также верен, нет смысла использовать сеансы, если вы загружаете его один раз, а затем удаляете все данные. Возможно, вы захотите рассмотреть возможность изменения способа работы вашего потока. например, вместо загрузки страницы в части входа, перенаправьте на другую страницу, на которой есть проверка (или на ту же страницу, а затем загрузите ее с помощью сеанса). очевидно, что это всего лишь пример, есть много способов заставить его работать.
3. вы имеете в виду целевую страницу, которая снова проверяет правильность всей информации о входе в систему?
4. да, в значительной степени. если пользователь имеет действительный сеанс (вошел в систему), загрузите главную страницу / панель мониторинга. в противном случае загрузите страницу входа. если вам достаточно удобно, вы также можете создать разные файлы. например, login.php для логинов и index.php для целевой страницы (или чего-нибудь еще).
5. Это выглядело бы намного чище и должно дать вам лучшую оценку 🙂