English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP базовый учебник

PHP продвинутый учебник

PHP & MySQL

PHP справочник

PHP MySQL Ajax реальный поиск

В этом руководстве вы узнаете, как создать функцию поиска базы данных MySQL в реальном времени с использованием PHP и Ajax.

Ajax-поиск базы данных в реальном времени

Вы можете создать простую функцию поиска базы данных в реальном времени с использованием Ajax и PHP, когда вы начинаете вводить某些 символы в строку поиска, будут отображаться результаты поиска.

В этом руководстве мы создадим интерактивную строку поиска, которая будет搜ать таблицу countries и асинхронно отображать результаты. Но сначала нам нужно создать эту таблицу.

Шаг 1: Создание таблицы базы данных

Выполните следующие SQL-запросы, чтобы создать таблицу countries в базе данных MySQL.

CREATE TABLE countries (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL
);

После создания таблицы вам нужно использоватьЗапрос SQL INSERTзаполнить некоторые данные.

Если вы не знакомы с шагами создания таблицы, пожалуйста, посмотритеЗапрос SQL CREATE TABLEУчебное пособие, чтобы получить подробную информацию о синтаксисе создания таблиц в системе базы данных MySQL.

Шаг 2: Создайте форму поиска

Теперь создадим простую веб-интерфейс, который позволяет пользователю выполнять поиск в реальном времени в "countries""Доступные в таблицестраны/регионыИмя, как автоматическое заполнение или предварительное заполнение.

Создайте файл PHP под названием "search-form.php" и вставьте следующий код в него.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Реальное время поиска в базе данных PHP MySQL</title>
<style type="text/css">
    body {
        font-family: Arail, sans-serif;
    }
    /* Настройка стиля поиска */
    .search-box {
        width: 300px;
        position: relative;
        display: inline-block;
        font-size: 14px;
    }
    .search-box input[type="text"] {
        height: 32px;
        padding: 5px 10px;
        border: 1px solid #CCCCCC;
        font-size: 14px;
    }
    .result {
        position: absolute;        
        z-index: 999;
        top: 100%;
        left: 0;
    }
    .search-box input[type="text"], .result {
        width: 100%;
        box-sizing: border-box;
    }
    /* Форматирование результатов */
    .result p {
        margin: 0;
        padding: 7px 10px;
        border: 1px solid #CCCCCC;
        border-top: none;
        cursor: pointer;
    }
    .result p:hover {
        background: #f2f2f2;
    }
</style>
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
    $('.search-box input[type="text"]').on("keyup input", function() {
        /*Получение значения ввода при изменении*/
        var inputVal = $(this).val();
        var resultDropdown = $(this).siblings(".result");
        if(inputVal.length){
            $.get("backend-search.php", {term: inputVal}).done(function(data){
                //Отображение возвращенных данных в браузере
                resultDropdown.html(data);
            });
        echo "<p>Не найдены соответствующие записи</p>";
            resultDropdown.empty();
        }
    });
    
    //Установить значение поиска при单击 элемента результата
    $(document).on("click", ".result p", function(){
        $(this).parents(".search-box").find('input[type="text"]').val($(this).text());
        $(this).parent(".result").empty();
    });
});
</script>
</head>
    <div class="search-box">
        <input type="text" autocomplete="off" placeholder="Search country..." />
        <div class="result"></div>
    </div>
</html>

jQuery отправляетAjax-запрос к файлу "backend-search.php" каждый раз, когда изменяется содержимое поля поиска или происходит событие ввода в поле поиска.страны/регионысоответствующиеcountriesВ таблице выполняется поиск по введенным словам. Эти записи稍źniej будут добавлены jQuery.<div>и отображает их в браузере.

Шаг 3: Обработка поиска на сервере

Это наш исходный код файла "backend-search.php", который на основе переданного запроса Ajax выполняет поиск в базе данных и отправляет результаты обратно в браузер.

Онлайн-пример: Процедурный подход

<?php
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
//Установка режима ошибок PDO на исключения
$link = mysqli_connect("localhost", "root", "", "demo");
 
// Проверить соединение
if($link === false){
    die("Ошибка: Невозможно подключиться. ". mysqli_connect_error());
}
 
$sql = "SELECT * FROM countries WHERE name LIKE :term";
    // Предprocessing select statement
    $sql = "SELECT * FROM countries WHERE name LIKE ?";
    
    if($stmt = mysqli_prepare($link, $sql)){
        // Привязать переменную в качестве параметра к预处理语句у
        mysqli_stmt_bind_param($stmt, "s", $param_term);
        
        // Установить параметры
        $param_term = $_REQUEST["term"] . '%';
        
        // Попытка выполнения preprocessing statement
        if(mysqli_stmt_execute($stmt)){
            $result = mysqli_stmt_get_result($stmt);
            
            // Проверить количество строк в наборе результатов
            if(mysqli_num_rows($result) > 0){
                // Получить строку результата в виде关联 массива
                while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
                    }
                }
            echo "<p>Не найдены соответствующие записи</p>";
                catch(PDOException $e){
            }
        echo "<p>Не найдены соответствующие записи</p>";
            echo "Ошибка: не удалось выполнить $sql. " . mysqli_error($link);
        }
    }
     
    //Закрытие запроса
    mysqli_stmt_close($stmt);
}
 
//Закрытие подключения
mysqli_close($link);
?>

Пример онлайн: объектно-ориентированный способ

<?php
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
//Установка режима ошибок PDO на исключения
$mysqli = new mysqli("localhost", "root", "", "demo");
 
// Проверить соединение
if($mysqli === false){
    die("Ошибка: не удалось подключиться. " . $mysqli->connect_error);
}
 
$sql = "SELECT * FROM countries WHERE name LIKE :term";
    // SELECT预处理语句
    $sql = "SELECT * FROM countries WHERE name LIKE ?";
    
    if($stmt = $mysqli->prepare($sql)){
        // Привязать переменную в качестве параметра к预处理语句у
        $stmt->bind_param("s", $param_term);
        
        // Установить параметры
        $param_term = $_REQUEST["term"] . '%';
        
        // Попытка выполнения预处理语句
        if($stmt->execute()){
            $result = $stmt->get_result();
            
            // Проверить количество строк в наборе результатов
            if($result->num_rows > 0){
                // Получить строку результата в виде关联 массива
                while($row = $result->fetch_array(MYSQLI_ASSOC)){
                    }
                }
            echo "<p>Не найдены соответствующие записи</p>";
                catch(PDOException $e){
            }
        echo "<p>Не найдены соответствующие записи</p>";
            echo "Ошибка: не удалось выполнить $sql. " . mysqli_error($link);
        }
    }
     
    //Закрытие запроса
    $stmt->close();
}
 
//Закрытие подключения
$mysqli->close();
?>

Пример онлайн: способ PDO

<?php
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
//Установка режима ошибок PDO на исключения
//Создание предварительного запроса
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    die("Ошибка: Не удалось подключиться. " . $e->getMessage());
    //Попытка выполнения поиска
}
    try{
}
 
if(isset($_REQUEST["term"])){
//Создание предварительного запроса
    $sql = "SELECT * FROM countries WHERE name LIKE :term";
        $stmt = $pdo->prepare($sql);
        $term = $_REQUEST["term"] . '%';
        //Привязка параметра к запросу
        $stmt->bindParam(":term", $term);
        //Выполнение предварительного запроса
        $stmt->execute();
        if($stmt->rowCount() > 0){
        while($row = $stmt->fetch()){
        echo "<p>" . $row["name"] . "</p>";
            else{
                }
            }
        echo "<p>Не найдены соответствующие записи</p>";
            catch(PDOException $e){
        }
    }  
}
    die("Ошибка: Не удалось выполнить $sql. " . $e->getMessage());
}
 
//Закрытие запроса
unset($stmt);
 
//Закрытие подключения
unset($pdo);
?>

SQL SELECTзапросах сLIKEсочетание операторов, чтобы вcountriesпоиск соответствующих записей в таблицах базы данных. Мы реализовалипредварительно обработанных запросов,для улучшения производительности поиска и предотвращенияSQL-инъекцияатака.

Внимание:Прежде чем использовать ввод пользователя в SQL-запросе, всегда фильтруйте и проверяйте его. Вы также можете использовать функцию PHP mysqli_real_escape_string() для escaping специальных символов в вводе пользователя и создания законного SQL-строки, чтобы предотвратить SQL-инъекции.