AJAX вставляет данные для проверки имени пользователя, приводит к дублированию элементов div и отсутствию данных

Приведенный ниже код должен проверять, было ли уже введено имя пользователя до отправки формы. Однако после ввода имени на входе элементы div повторяются, и данные не выводятся. Может ли кто-нибудь помочь с этой проблемой с помощью AJAX?

php код:

if (isset($_POST['check_username'])) {
    $user_login_name = $_POST['check_username'];

    $sql = "SELECT user_login_name FROM users;";
    $result = mysqli_query($conn, $sql);
    $rows = mysqli_fetch_array($result);

    if (!empty($user_login_name)) {
        foreach ($rows as $row) {
            if (strpos($row, $user_login_name) != false) {
                echo $row;
                echo "<br>";
            }
        }
    } else {
        echo "Database empty!";
    }
}

HTML-код:

<div class = "register">
            <div class = "band_1">
                <div class = "box">
                    <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 = "text" name = "user_first_name" placeholder = "Enter First Name"></td>
                                    </tr>
                                    <tr>
                                        <td><input type = "text" name = "user_last_name" placeholder = "Enter Last Name"></td>
                                    </tr>
                                    <tr>
                                        <td><input type = "text" name = "user_phone" placeholder = "Enter Contact Number"></td>
                                    </tr>
                                    <tr>
                                        <td><input type = "email" name = "user_email" placeholder = "Enter Email"></td>
                                    </tr>
                                    <tr>
                                        <td><input type = "text" name = "user_login_name" placeholder = "Select a Username"><p id = "test"></p></td>
                                    </tr>
                                    <tr>
                                        <td><input type = "password" name = "user_password" placeholder = "Select a Password"></td>
                                    </tr>
                                    <tr>
                                        <td><input type = "password" name = "user_password_2" placeholder = "Repeat Password"></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>
                </div>
            </div>
        </div>

и AJAX:

$(document).ready(function() {

    $("input[name=user_login_name]").keyup(function(){
        var user_login_name = $("input[name=user_login_name]").val();
        $.post("../server/register.php", {
            check_username: user_login_name
        }, function(data, status) {
            $("#test").html(data);
        });

    });

});

У вас есть, возможно, не связанная с этим ошибка в вашей логике PHP с использованием strpos(). Вам нужно использовать !== вместо !=, потому что эта функция может возвращать 0 (что является «ложным»), если совпадение строки начинается с первого символа. Подробнее: php.net/manual/en/function.strpos.php

Jeremy Harris 27.12.2018 22:20

Я просто изменил это, спасибо, но не решил проблему. Он вставляет все данные тега <html> в идентификатор #test.

Roelof Coertze 27.12.2018 22:22

Могу я спросить, находятся ли PHP-код и HTML-код в одном файле?

Aprilsnar 27.12.2018 22:25

Нет, это не так, я пытаюсь связать разные языки в разных файлах.

Roelof Coertze 27.12.2018 22:26

Кажется, что код php должен быть внутри своего собственного файла, так как у меня он был в файле с другим кодом php. Может ли кто-нибудь объяснить, почему разделение кода php было решением?

Roelof Coertze 27.12.2018 22:43
Стоит ли изучать 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 и хотите разрабатывать...
1
5
112
2

Ответы 2

Кажется, просто улучшите php:

1) вам нужно проверить ввод пустоты пользователем, 2) и выбрать только совпавшие, 3) и, наконец, вызвать die:

if (!empty($_POST['check_username'])) {
    $user_login_name = $_POST['check_username'];

    $sql = "SELECT user_login_name FROM users where user_login_name like '%$user_login_name%';";
    $result = mysqli_query($conn, $sql);
    $rows = mysqli_fetch_array($result);

    if ($rows) {
        foreach ($rows as $row) {
            echo "$row<br>";
        }
    } else {
        echo "Database empty!";
    }

    die;
}

ОБНОВИТЬ. Также лучше было бы вызвать: $rows = mysqli_fetch_array($result, MYSQLI_ASSOC); - чтобы предотвратить повторное получение дополнительных данных.

Вы понимаете, что оставляете их открытыми для SQL-инъекции с добавленным предложением WHERE. Вы не слышали об этом и не готовили заявления?

Funk Forty Niner 27.12.2018 22:46

Да, ты прав - про укол просто забыл. Конечно, это необходимо для защиты запросов mysql, спасибо. (php.net/manual/en/mysqli.prepare.php). Моя общая идея заключалась в улучшении «select-query»: не нужно извлекать всех пользователей из базы данных и проверять каждого в цикле.

Lexxusss 27.12.2018 22:51

Вот ваш php-код с лучшим способом проверить, существует ли пользователь в БД. Просто проверьте запрос, есть ли пользователь и номер, вам не нужно проверять его с помощью php.

if (isset($_POST['check_username'])){
    $user_login_name=$_POST['check_username'];
    $sql = "SELECT user_login_name FROM users WHERE user_login_name='$user_login_name'";
    $result=mysqli_query($conn, $sql);
    $numRows=mysqli_num_rows($result);
    $rows=mysqli_fetch_array($result,MYSQLI_NUM);
    var_dump($rows);
    if ($numRows>0){ // If exists rows
        foreach($rows as $field)
            echo $field." => ";
        echo "<br>";
    }
    else
        echo "Database empty!";
}

Также для подключения ваших данных вы можете попробовать:

$.ajax({

});

Передавая переменные из php, вы можете решить, показывать ли вы данные со стороны javascript или нет.

Надеюсь, это поможет C:

Это открыто для SQL-инъекций; Вы слышали, что это делает и как это предотвратить?

Funk Forty Niner 27.12.2018 22:57

Есть ли способ, что информация о массиве также не будет отображаться эхом?

Roelof Coertze 27.12.2018 23:09

Что ж, мы можем поговорить о безопасности sql в другом посте. Думаю, этот вопрос не о sql-инъекции ... Тоже не лучшая практика.

ricardosalazarfullstack 27.12.2018 23:19

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