English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 PHP와 Ajax를 사용하여 실시간 MySQL 데이터베이스 검색 기능을 만드는 방법을 배웁니다.
Ajax와 PHP를 사용하여 간단한 실시간 데이터베이스 검색 기능을 만들 수 있습니다. 검색 입력 상자에 문자를 입력하기 시작하면 검색 결과가 표시됩니다.
이 튜토리얼에서는 실시간 검색 상자를 만들고, 이 상자가 countries 테이블을 검색하고 비동기적으로 결과를 표시하는 방법을 배웁니다. 그러나, 먼저 이 테이블을 생성해야 합니다.
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数据库系统中创建表的语法的详细信息。
现在,让我们创建一个简单的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>브라우저에 표시됩니다.
이것은 우리의 '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(); ?>
<?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() 함수를 사용할 수도 있습니다.