За последние 24 часа нас посетил 22321 программист и 1082 робота. Сейчас ищут 611 программистов ...

Не обновляется страница при возврате Ajax

Тема в разделе "PHP для новичков", создана пользователем Stas09, 23 сен 2022.

  1. Stas09

    Stas09 Новичок

    С нами с:
    7 сен 2022
    Сообщения:
    9
    Симпатии:
    0
    Есть небольшой проект по регистрации и авторизации на PHP.
    upload_2022-9-23_12-49-26.png
    upload_2022-9-23_12-50-13.png

    Пытаюсь реализовать отправку формы с Ajax.
    Пример входа в кабинет.
    Запросы обрабатываются роутером (Router.php)
    Он перенаправляет на нужный контроллер (например UserController.php).
    Тот в свою очередь обрабатывает запрос, передает данные в model (user.php) и в случае успеха перенаправляет в cabinet (index.php).


    user/login.php
    PHP:
    1. <?php include ROOT . '/views/layouts/header.php'; ?>
    2.  
    3. <section>
    4.         <div class="container">
    5.             <div class="row">
    6.                 <div>
    7.                     <p align="center"><?php echo $userError; ?></p>
    8.                     <div align="center" class="signup-form">
    9.                         <h3>Вход на сайт</h3>
    10.                         <form id="form-signin" method="post">
    11.                             <a><?php echo $log6; ?></a>
    12.                             <p><input id="login" type="text" name="login" placeholder="Login" value="<?php echo $login; ?>"/><p>
    13.                             <p><input id="password" type="password" name="password" placeholder="Пароль" value="<?php echo $password; ?>"/></p>
    14.                             <!-- <input id="submit" type="submit" name="submit" class="btn1"> -->
    15.                             <button class="btn btn-primary" type="button" id="submit" name="submit">Вход</button>
    16.                         </form>
    17.                         <p id="hello">.</p>
    18.                     </div>
    19.                 </div>
    20.             </div>
    21.         </div>
    22.     </section>
    23.  
    24.     <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
    25.     <script src="/template/js/main.js"></script>
    26. </body>
    27. </html>
    template/js/main.js
    Код (Javascript):
    1. $(document).ready(function()
    2. {
    3.   $("#submit").click(function()
    4.   {
    5.     var params = {
    6.       login: $.trim($("#login").val()),
    7.       password: $.trim($("#password").val()),
    8.     }
    9.     $.ajax({
    10.             type: 'POST',
    11.             url: "",
    12.             // contentType: 'application/json;charset=UTF-8',
    13.             data: params,
    14.            
    15.             success: function()
    16.             {
    17.             console.log("OK");
    18.             },
    19.             // dataType: "json"
    20.     });
    21.    
    22.   });
    23.  
    24. });

    После отправки формы c валидными данными (нажав на кнопку "Вход")
    upload_2022-9-23_13-3-3.png
    В системе вход в кабинет происходит, а на странице не происходит ничего.

    Если обновить страницу вручную, то heder обновляется (видно имя пользователя), а страница так и остается "страница входа" (login.php)? а не "страница кабинета" (cabinet/index.php).
    upload_2022-9-23_13-8-53.png

    должно быть
    upload_2022-9-23_13-10-23.png

    Подскажите пожалуйста что я делаю не так.
    Спасибо.
     

    Вложения:

  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.551
    Симпатии:
    1.754
    Ну аджаск сам на другую страничку переходить не будет. Дождаться успешного выполнения и перейти через location.href.
     
  3. Stas09

    Stas09 Новичок

    С нами с:
    7 сен 2022
    Сообщения:
    9
    Симпатии:
    0
    Спасибо.

    Добавил в success "window.location.href = '/cabinet';
    теперь при валидных данных переходит в кабинет и отображает его.
    Но:
    1. В devtools -> network Fetch/XHR запрос на третьсекунды появляется и сразу исчезает. (Не могу проверить какие данные переданы и получены.
    2. При не валидных данных не появляются ошибки. Просто ничего не происходит.

    С чем это может быть связано? Может быть мне в $.ajax({ .... нужно url: 'какой-то указать?'
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.551
    Симпатии:
    1.754
    Ну так откуда браузер знает, что должно происходить? Это тоже запрограммировать надо
    Ну ты же на другую страничку переходишь, всё-таки. Можно не переходить, но не уверен, что ты сам потянешь такое запрограммировать. Вот все современные фронт-технологии аля Ангуляр, Вью, Реакт и прочие посвящены как раз тому, чтоб не переходить
    --- Добавлено ---
    На ваниле или jquery тоже можно запрограммировать, в принципе. Но тут надо подзамарочиться. Или поискать либу, был такой проект pjax, например
     
  5. Stas09

    Stas09 Новичок

    С нами с:
    7 сен 2022
    Сообщения:
    9
    Симпатии:
    0
    У меня проверка ошибок запрограммирована в контроллере и модельке
    PHP:
    1. <?php
    2.  
    3. /**
    4. * Контроллер UserController
    5. */
    6. class UserController
    7. {
    8.    
    9.     /**
    10.      * Action для страницы "Регистрация"
    11.      */
    12.     public function actionRegister()
    13.     {
    14.         //Переменные для ошибок в форму
    15.         $log6 = "";
    16.         $logUse = "";
    17.         $pass6 = "";
    18.         $passData = "";
    19.         $passConflict = "";
    20.         $emailIncorrect = "";
    21.         $emailUse = "";
    22.         $nameLength = "";
    23.         $reg = "";
    24.         $logSpace = "";
    25.         $nameSpace = "";
    26.         $passChar = "";
    27.         $nameLengthMax ="";
    28.  
    29.         // Переменные для формы
    30.         $login = false;
    31.         $password = false;
    32.         $confirmPassword = false;
    33.         $email = false;
    34.         $name = false;
    35.        
    36.         $result = false;
    37.  
    38. // Обработка формы
    39.         if (@$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
    40.            
    41.         if (isset($_POST['submit'])) {
    42.             // Если форма отправлена
    43.             // Получаем данные из формы
    44.             $login = $_POST['login'];
    45.             $password = $_POST['password'];
    46.             $confirmPassword = $_POST['confirmPassword'];
    47.             $email = $_POST['email'];
    48.             $name = $_POST['name'];
    49.            
    50.             // Флаг ошибок
    51.             $errors = false;
    52.          
    53.             // Валидация полей
    54.             if (!User::checkLogin($login)) {
    55.                 $errors[] = 'Login не должен быть короче 6-ти символов';
    56.                 $log6 = 'Login не должен быть короче 6-ти символов';
    57.             }
    58.             if (!User::checkSpaceLogin($login)) {
    59.                 $errors[] = 'Login не должен содержать пробелы';
    60.                 $logSpace = 'Login не должен содержать пробелы';
    61.             }
    62.             if (!User::checkUserLogin($login)) {
    63.                 $errors[] = 'Такой Login уже используется';
    64.                 $logUse = 'Такой Login уже используется';
    65.             }
    66.             if (!User::checkPassword($password)) {
    67.                 $errors[] = 'Пароль не должен быть короче 6-ти символов';
    68.                 $pass6 = 'Пароль не должен быть короче 6-ти символов';
    69.             }
    70.             if (!User::checkDataPassword($password)) {
    71.                 $errors[] = 'Пароль должен содержать буквы и цифры';
    72.                 $passData = 'Пароль должен содержать буквы и цифры';
    73.             }
    74.             if (User::checkCharsPassword($password)) {
    75.                 $errors[] = 'Пароль не должен содержать спец символы';
    76.                 $passChar = 'Пароль не должен содержать спец символы';
    77.             }
    78.             if (!User::checkConfirmPassword($password, $confirmPassword)) {
    79.                 $errors[] = 'Пароли не совпадают';
    80.                 $passConflict = 'Пароли не совпадают';
    81.             }
    82.             if (!User::checkEmail($email)) {
    83.                 $errors[] = 'Неправильный email';
    84.                 $emailIncorrect = 'Неправильный email';
    85.             }
    86.             if (!User::checkEmail2($email)) {
    87.                 $errors[] = 'Неправильный email';
    88.                 $emailIncorrect = 'Неправильный email';
    89.             }
    90.             if (!User::checkUserEmail($email)) {
    91.                 $errors[] = 'Такой Email уже используется';
    92.                 $emailUse = 'Такой Email уже используется';
    93.             }
    94.             if (!User::checkSpaceName($name)) {
    95.                 $errors[] = 'Login не должен содержать пробелы';
    96.                 $nameSpace = 'Login не должен содержать пробелы';
    97.             }
    98.             if (!User::checkName($name)) {
    99.                 $errors[] = 'Имя не должно быть короче 2-х символов';
    100.                 $nameLength = 'Имя не должно быть короче 2-х символов';
    101.             }
    102.             if (!User::checkNameMax($name)) {
    103.                 $errors[] = 'Имя не должно быть длинее 25-х символов';
    104.                 $nameLengthMax = 'Имя не должно быть длинее 25-х символов';
    105.             }
    106.            
    107.            
    108.             if ($errors == false) {
    109.                 // Если ошибок нет
    110.                 // Регистрируем пользователя
    111.                 $result = User::register($login, $password, $confirmPassword,$email, $name);
    112.                 $reg = "Вы зарегистированы!";
    113.             }
    114.         }
    115.         }
    116.  
    117.         // Подключаем вид
    118.         require_once(ROOT . '/views/user/register.php');
    119.         return true;
    120.     }
    121.    
    122.     /**
    123.      * Action для страницы "Вход на сайт"
    124.      */
    125.     public function actionLogin()
    126.     {
    127.        
    128.         //Переменные для ошибок в форму
    129.         $userError = "";
    130.         $log6 = "";
    131.         $pass6 = "";
    132.         $success = "";
    133.         $user = "";
    134.  
    135.         // Переменные для формы
    136.         $login = false;
    137.         $password = false;
    138.  
    139.         if (@$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {    
    140.         // Обработка формы
    141.         if (isset($_POST['login'])) {
    142.            
    143.             // Если форма отправлена
    144.             // Получаем данные из формы
    145.             $login = $_POST['login'];
    146.             $password = $_POST['password'];
    147.  
    148.             // Флаг ошибок
    149.             $errors = false;
    150.  
    151.             // Валидация полей
    152.             if (!User::checkLogin($login)) {
    153.                 $errors[] = 'Login не должен быть короче 6-ти символов';
    154.                 $log6 = 'Login не должен быть короче 6-ти символов';
    155.             }
    156.        
    157.             // Проверяем зарегистрирован ли пользователь
    158.             $userId = User::checkUserData($login, $password);
    159.  
    160.             if ($userId == false) {
    161.                 // Если данные неправильные - показываем ошибку
    162.                 $errors[] = 'Неправильные данные для входа на сайт';
    163.                 $userError = 'Неправильные данные для входа на сайт';
    164.             } else {
    165.                 $_SESSION['user'] = $login;
    166.                 $success = "Hello ";
    167.                 // // Перенаправляем пользователя в закрытую часть - кабинет
    168.                 header("Location: /cabinet");
    169.            
    170.  
    171.             }
    172.            
    173.         }
    174.         } else {
    175.  
    176.         // Подключаем вид
    177.         require_once(ROOT . '/views/user/login.php');
    178.         return true;
    179.         }
    180.     }
    181.  
    182.     /**
    183.      * Удаляем данные о пользователе из сессии
    184.      */
    185.     public function actionLogout()
    186.     {      
    187.         // Удаляем информацию о пользователе из сессии
    188.         unset($_SESSION["user"]);
    189.        
    190.         // Перенаправляем пользователя на главную страницу
    191.         header("Location: /");
    192.     }
    193.  
    194. }
    195. тут и переход есть в кабинет.
    Model/User.php получает данные и обрабатывает.

    Извини, что столько кода сюда засунул.

    У меня без ajax все работало. А теперь что-то не клеится.

    Задача такая:
    - Проверить отправку формы с использованием AJAX [при отправке формы страница не должна перезагружаться, в devtools во вкладке network можно увидеть фоновый запрос и его ответ]
    - Проверить соответствие ответа формату JSON [code + devtools]
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.551
    Симпатии:
    1.754
    Браузеру по барабану. Тут два варианта - либо ты не отправляешь ажаксом, а просто сабмитишь в браузере с перезагрузкой страницы, и тогда то, что ты там нагенерил на пыхе, выводится само, либо с ажаксом выводишь то, что надо, средствами js. Другого не дано
     
  7. Stas09

    Stas09 Новичок

    С нами с:
    7 сен 2022
    Сообщения:
    9
    Симпатии:
    0
    Понял, спасибо.

    Только уточни еще, мне в js перенести только обработку ошибок и перенаправление или все, что есть в файлах UserController.php и User.php?
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.551
    Симпатии:
    1.754
    Странный вопрос. Ты понимаешь, что выполняется в браузере, а что на сервере?
     
  9. Stas09

    Stas09 Новичок

    С нами с:
    7 сен 2022
    Сообщения:
    9
    Симпатии:
    0
    Видимо не совсем. Подскажи.
    Как мне выводить то, что нужно средствами Js?
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.551
    Симпатии:
    1.754
    don.bidon нравится это.