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

PHP 기본 튜토리얼

PHP 고급 튜토리얼

PHP & MySQL

PHP 참조 설명서

PHP MySQL Ajax 실시간 검색

이 튜토리얼에서는 PHP와 Ajax를 사용하여 실시간 MySQL 데이터베이스 검색 기능을 만드는 방법을 배웁니다.

Ajax 실시간 데이터베이스 검색

Ajax와 PHP를 사용하여 간단한 실시간 데이터베이스 검색 기능을 만들 수 있습니다. 검색 입력 상자에 문자를 입력하기 시작하면 검색 결과가 표시됩니다.

이 튜토리얼에서는 실시간 검색 상자를 만들고, 이 상자가 countries 테이블을 검색하고 비동기적으로 결과를 표시하는 방법을 배웁니다. 그러나, 먼저 이 테이블을 생성해야 합니다.

단계1:데이터베이스 테이블 생성

MySQL 데이터베이스에서 countries 테이블을 생성하기 위한 다음 SQL 쿼리를 실행하세요。

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

创建表后,您需要使用SQL INSERT语句填充一些数据。

如果不熟悉创建表的步骤,请查看有关SQL CREATE TABLE语句的教程,以获取有关在MySQL数据库系统中创建表的语法的详细信息。

단계2:建立搜索表单

现在,让我们创建一个简单的Web界面,该界面允许用户实时搜索“countries"表中可用的국가/지역名称,就像自动填充或预先输入一样。

创建一个名为“ search-form.php”的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;
    }
    /* Formatting result items */
    .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);
            });
        } else{
            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 코드가 'backend'로 Ajax 요청을 보냅니다.-search.php 파일은 다음과 같은 파일에서 가져옵니다.국가/지역관련countries테이블에서 검색어를 검색한 기록을 검색합니다. 이 기록은 나중에 jQuery에 의해 삽입됩니다.<div>브라우저에 표시됩니다.

단계3뒤에서 검색 쿼리를 처리

이것은 우리의 'backend'-search.php 파일의 원본 코드는 Ajax 요청으로 전송된 쿼리 문자열을 기반으로 데이터베이스를 검색하여 결과를 브라우저로 반환합니다.

온라인 예제: 절차적 방식

<?php
/* MySQL 서버 연결을 시도합니다. MySQL을 실행하고 있다고 가정합니다
기본 설정의 서버(사용자 "root", 비밀번호 없음) */
$link = mysqli_connect("localhost", "root", "", "demo");
 
//연결 확인
if($link === false){
    die("에러: 연결할 수 없습니다. " . mysqli_connect_error());
}
 
if(isset($_REQUEST["term"])){
    //预处理 select 문
    $sql = "SELECT * FROM countries WHERE name LIKE ?";
    
    if($stmt = mysqli_prepare($link, $sql)){
        //변수를 предп páготовленную команду에 매핑
        mysqli_stmt_bind_param($stmt, "s", $param_term);
        
        //파라미터 설정
        $param_term = $_REQUEST["term"] . '%';
        
        // Attempt to предп páготовленную команду 실행
        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>" . $row["name"] . "/p>";
                }
            } else{
                echo "<p>일치하는 레코드가 없습니다</p>";
            }
        } else{
            echo "에러: 실행할 수 없습니다. $sql." . mysqli_error($link);
        }
    }
     
    //문장을 종료합니다
    mysqli_stmt_close($stmt);
}
 
//연결을 닫습니다
mysqli_close($link);
?>

온라인 예제: 객체 지향 방식

<?php
/* MySQL 서버 연결을 시도합니다. MySQL을 실행하고 있다고 가정합니다
기본 설정의 서버(사용자 "root", 비밀번호 없음) */
$mysqli = new mysqli("localhost", "root", "", "demo");
 
//연결 확인
if($mysqli === false){
    die("에러: 연결할 수 없습니다. " . $mysqli->connect_error);
}
 
if(isset($_REQUEST["term"])){
    //select предп páготовленную команду
    $sql = "SELECT * FROM countries WHERE name LIKE ?";
    
    if($stmt = $mysqli->prepare($sql)){
        //변수를 предп páготовленную команду에 매핑
        $stmt->bind_param("s", $param_term);
        
        //파라미터 설정
        $param_term = $_REQUEST["term"] . '%';
        
        // предпpăготовленную команду попробовать выполнить
        if($stmt->execute());
            $result = $stmt->get_result();
            
            //결과 집합의 행 수 확인
            if($result-num_rows > 0){
                //결과 행을 연관 배열로 가져오기
                while($row = $result-fetch_array(MYSQLI_ASSOC)){
                    echo "<p>" . $row["name"] . "/p>";
                }
            } else{
                echo "<p>일치하는 레코드가 없습니다</p>";
            }
        } else{
            echo "에러: 실행할 수 없습니다. $sql." . mysqli_error($link);
        }
    }
     
    //문장을 종료합니다
    $stmt->close();
}
 
//연결을 닫습니다
$mysqli->close();
?>

온라인 예제: PDO 방식

<?php
/* MySQL 서버 연결을 시도합니다. MySQL을 실행하고 있다고 가정합니다
기본 설정의 서버(사용자 "root", 비밀번호 없음) */
try{
    $pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
    //PDO 오류 모드를 예외로 설정합니다
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    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 문장에서 사용자 입력을 사용하기 전에 항상 필터링하고 확인하십시오. 사용자 입력의 특수 문자를 escape하여 합법적인 SQL 문자열을 생성하여 SQL注入을 방지할 수 있는 PHP mysqli_real_escape_string() 함수를 사용할 수도 있습니다.