Переменная остается пустой при использовании AJAX при отправке запроса в файл php

У меня есть форма, в которой я выполняю некоторую обработку ошибок AJAX перед отправкой формы, просто чтобы улучшить взаимодействие с пользователем. Моя проблема в том, что переменная $user_password, кажется, остается пустой на протяжении всего процесса, поэтому обработка ошибок не имеет значения.

В следующем коде первая функция клавиатуры должна проверить, длиннее ли пароль, чем минимальная длина, а вторая - проверить, совпадают ли пароли:

$(document).ready(function() {
    $("input[name=user_password]").keyup(function(){    
        var user_password = $("input[name=user_password]").val();
        //data to server...
        $.post("../server/hub.php", {
            //POST name and variable... 
            check_password: user_password
            //places fetched information...
        }, function(data, status) {
            $("#user_password").html(data);
        });
    });
});


$(document).ready(function() {

    $("input[name=user_password_2]").keyup(function(){
        var user_password = $("input[name=user_password]").val();
        var user_password_2 = $("input[name=user_password_2]").val();
        //data to server...
        $.post("../server/hub.php", {
            //POST name and variable... 
            password_match: user_password,
            password_match_2: user_password_2
            //places fetched information...
        }, function(data, status) {
            $("#user_password_2").html(data);
        });
    });

});

Переменные перенаправляются в файл php, где фактически выполняется обработка ошибок:

if (isset($_POST['check_password'])) {
    $user_password = $_POST['check_password'];

    echo $user_password;

    if ($user_password == "") {
        echo "";
    } elseif (strlen($user_password) < 6) {
        echo "Password must contain at least six characters!";
    } else {
        echo "You are good to go!";
    }
}

if (isset($_POST['password_match'])) {
    $user_password = $_POST['password_match'];
    $user_password_2 = $_POST['password_match_2'];

    if ($user_password_2 == "") {
        echo "";
    } elseif ($user_password !== $user_password_2) {
        echo "Sorry, passwords do not match!";
    } else {
        echo "You are good to go!";
    }
}

Хотя данные, возвращаемые в html-файл, остаются пустыми, повторение $user_password не дает результата.

Вот сегмент html:

<form action = "../server/register.php" method = "POST">
                        <div class = "input_table">                           
                            <table>
                                <thead>
                                    <tr>
                                        <th><h1>Register to LIMS</h1></th>
                                    </tr>
                                </thead>
                                <tbody>

                                    <tr>
                                        <td><input type = "password" name = "user_password" placeholder = "Select Password"><p id = "user_password"></p></td>
                                    </tr>
                                    <tr>
                                        <td><input type = "password" name = "user_password_2" placeholder = "Repeat Password"><p id = "user_password_2"></p></td>
                                    </tr>
                                </tbody>
                            </table>
                        </div>
                        <button type = "submit" name = "user_register" class = "button_1">Register</button>
                        <button type = "button" class = "button_3">Cancel</button>              
                    </form>

Кто-нибудь может объяснить, почему это происходит?

Что вам показывает ваша консоль?

Joseph_J 28.12.2018 08:58

Консоль пуста, отображается только подсказка.

Roelof Coertze 28.12.2018 09:00

Глупый вопрос, вы уверены, что в вашем коде есть скрипт библиотеки jquery.

Joseph_J 28.12.2018 09:01

Глупый комментарий, конечно же!

Roelof Coertze 28.12.2018 09:01

Почему вы используете двойной $ (document) .ready (function ()?

Sfili_81 28.12.2018 09:05

Это был просто способ устранения неполадок, но в любом случае у меня возникает та же проблема.

Roelof Coertze 28.12.2018 09:06

Вы отправляете данные каждый раз, когда нажимаете клавишу?

Sfili_81 28.12.2018 09:09

Пожалуйста, поместите exit после завершения вашего процесса в файл php.

Kishan 28.12.2018 09:10

Да, есть и другие части кода ajax, которые постоянно проверяют, используется ли имя пользователя или адрес электронной почты, и они работают. Я исключил их для простоты.

Roelof Coertze 28.12.2018 09:11

Я думаю, вам нужно отправлять данные только тогда, когда вы нажимаете кнопку отправки

Sfili_81 28.12.2018 09:11

@ Sfili_81, но почему другие переменные и запросы работают, а не $user_password?

Roelof Coertze 28.12.2018 09:13

Какую версию jquery вы используете?

Joseph_J 28.12.2018 09:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
12
38
3

Ответы 3

Мне удалось заставить ваш код работать так, как вы его написали.

Я создал пустую страницу для html под названием test.php:

<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<form action = "../server/register.php" method = "POST">

  <div class = "input_table">
    <table>
      <thead>
        <tr>
          <th><h1>Register to LIMS</h1></th>
        </tr>
        </thead>
        <tbody>
          <tr>
            <td><input type = "password" name = "user_password" placeholder = "Select Password"><p id = "user_password"></p></td>
          </tr>
          <tr>
            <td><input type = "password" name = "user_password_2" placeholder = "Repeat Password"><p id = "user_password_2"></p></td>
          </tr>
        </tbody>
    </table>
  </div>

  <button type = "submit" name = "user_register" class = "button_1">Register</button>
  <button type = "button" class = "button_3">Cancel</button>

</form>

<script>

$(document).ready(function() {
  $("input[name=user_password]").keyup(function(){
      var user_password = $("input[name=user_password]").val();
      //console.info('password 1 key up'); //Check for key up.. It works
      //data to server...
      $.post("hub.php", {
          //POST name and variable...
          check_password: user_password
          //places fetched information...
      }, function(data, status) {
          console.info(data); //Check for your data.
          $("#user_password").html(data); //Data was displayed in div.
      });
  });
});


$(document).ready(function() {

  $("input[name=user_password_2]").keyup(function(){
      var user_password = $("input[name=user_password]").val();
      var user_password_2 = $("input[name=user_password_2]").val();
      //data to server...
      $.post("hub.php", {
          //POST name and variable...
          password_match: user_password,
          password_match_2: user_password_2
          //places fetched information...
      }, function(data, status) {
          $("#user_password_2").html(data);
      });
  });

});

</script>

Обратите внимание, что я использую hub.php в качестве URL-адреса для AJAX.

Другое дело, что я использовал JQuery 3.1.1 и загрузил библиотеку перед формой.

Я также обернул ваш код jquery в теги <script>.

И страница hub.php, которую я поместил в ту же папку, что и test.php:

<?php

echo 'I made it.';  //Test to see if you landed on the page.

if (isset($_POST['check_password'])) {
    $user_password = $_POST['check_password'];

    echo $user_password;

    if ($user_password == "") {
        echo "";
    } elseif (strlen($user_password) < 6) {
        echo "Password must contain at least six characters!";
    } else {
        echo "You are good to go!";
    }
}

if (isset($_POST['password_match'])) {
    $user_password = $_POST['password_match'];
    $user_password_2 = $_POST['password_match_2'];

    if ($user_password_2 == "") {
        echo "";
    } elseif ($user_password !== $user_password_2) {
        echo "Sorry, passwords do not match!";
    } else {
        echo "You are good to go!";
    }
}


?>

Я бы обязательно проверил ваши пути. Если вы не видите ответа в консоли, значит, ваш AJAX не направлен в правильный каталог.

Я проверил это, и он работает.

roelofco - Поскольку вы не получаете ошибку 404, похоже, что нет проблем с путем к файлу PHP. Пара вещей, которые вы можете попробовать.

  1. Пожалуйста, попробуйте добавить следующий код в начало hub.php

    <?php 
    echo "Entering the Ajax File";
    var_dump($_POST);
    
  2. $("input[name=user_password]").val(); - это не лучший способ получить ценность. В документе HTML может быть несколько элементов / тегов с одинаковым именем. Таким образом, вы можете либо изменить атрибут name в html на id и соответственно изменить jquery, либо использовать $("input[name=user_password]").eq(0).val(); - этим мы теперь говорим JS получить первый элемент с именем user_password.

  3. Обратите внимание, что вызовы Ajax при нажатии клавиш очень затратны. Попробуйте сделать это в форме submit. Проверка на стороне клиента выполняется во время нажатия клавиши.

  4. Использование нескольких событий готовности DOM замедлит работу сайта. Всегда идеально хранить весь код в одной готовой функции DOM.

  5. сообщение jquery имеет методы отказа и всегда обратного вызова. Попробуйте использовать это, чтобы получить ошибки. В вашем случае это будет так.

    $.post("../server/hub.php", {
        //POST name and variable... 
        password_match: user_password,
        password_match_2: user_password_2
        //places fetched information...
    }, function(data, status) {
        $("#user_password_2").html(data);
    }).fail(function() {
        alert( "Some error" );
    }).always(function() {
        alert( "Ajax finished" );
    });` 
    

Итак, ответ на проблему довольно прост, но его очень легко упустить. Это снова показывает, почему хорошая практика кодирования необходима для написания успешного веб-сайта. Мне кажется, что в этом случае name=user_password был повторен где-то еще в коде, поэтому при вызове с использованием:

var user_password = $("input[name=user_password]").val();

он относился к вводу в другой части кода, а не к вводу, к которому я пытался применить код. Просто изменив name=user_password на name=user_password_1 в html-коде, а затем изменив код ajax:

$(document).ready(function() {
    $("input[name=user_password_1]").keyup(function(){  
        var user_password_1 = $("input[name=user_password_1]").val();
        //data to server...
        $.post("../server/hub.php", {
            //POST name and variable...
            check_password: user_password_1
            //places fetched information...
        }, function(data, status) {
            $("#user_password_1").html(data);
        });
    });


    $("input[name=user_password_2]").keyup(function(){
        var user_password_1 = $("input[name=user_password_1]").val();
        var user_password_2 = $("input[name=user_password_2]").val();
        //data to server...
        $.post("../server/hub.php", {
            //POST name and variable... 
            password_match_1: user_password_1,
            password_match_2: user_password_2
            //places fetched information...
        }, function(data, status) {
            $("#user_password_2").html(data);
        });
    });

});

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

Другие вопросы по теме