本节将介绍一个使用PHP和Ajax实现实时搜索功能的例子,当用户在搜索框输入时,页面无需刷新即可实时从XML文件中搜索并显示结果。
思路:1. 在test.html里准备一个搜索输入框和一个结果显示区域(div.result),通过oninput事件触发搜索函数searchXML()。2. searchXML()函数主要内容是:创建XMLHttpRequest对象,配置为GET请求,将搜索关键词发送到test.php。3. test.php处理请求,从dotcpp.xml文件中查找匹配的内容,返回HTML格式的搜索结果。
1. dotcpp.xml
<?xml version="1.0" encoding="UTF-8"?> <dotcpp> <brand>Dotcpp编程</brand> <website>dotcpp.com</website> <course>PHP教程</course> <courses> <course id="1">PHP基础</course> <course id="2">PHP高级</course> <course id="3">PHP框架</course> </courses> </dotcpp>
2. test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PHP Ajax XML实时搜索</title>
</head>
<body>
<h2>Dotcpp XML实时搜索系统</h2>
<p>输入搜索关键词:</p>
<input type="text" id="search_input" placeholder="输入要搜索的内容"
oninput="searchXML()" style="width: 300px; padding: 8px;">
<div id="result" style="width: 700px;"></div>
<script>
let searchTimer;
function searchXML() {
// 清除之前的定时器
clearTimeout(searchTimer);
// 获取搜索关键词
let keyword = document.getElementById("search_input").value.trim();
// 如果关键词为空,显示提示信息
if (keyword === '') {
document.getElementById("result").innerHTML = "请输入搜索关键词";
return;
}
// 设置延迟搜索(防抖处理,避免频繁请求)
searchTimer = setTimeout(function() {
// 1. 创建XMLHttpRequest对象
let xhr = new XMLHttpRequest();
// 2. 配置请求
xhr.open("GET", "test.php?keyword=" + encodeURIComponent(keyword), true);
// 3. 定义响应处理函数
xhr.onreadystatechange = function() {
/*readystate==4&&status==200表示一个http请求已经成功完成!*/
if (xhr.readyState == 4 && xhr.status == 200) {
// 更新页面显示结果
document.getElementById("result").innerHTML = xhr.responseText;
}
};
// 4. 发送请求
xhr.send();
}, 300); // 300毫秒延迟
}
// 页面加载时显示所有数据
window.onload = function() {
// 清空搜索框,触发搜索(显示所有内容)
document.getElementById("search_input").value = '';
searchXML();
};
</script>
</body>
</html>3. test.php
<?php
// 设置响应头,防止中文乱码
header('Content-Type: text/html; charset=utf-8');
// 获取搜索关键词
$keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : '';
// XML文件路径
$xmlFile = __DIR__.'/dotcpp.xml';
// 加载XML文件
$xml = simplexml_load_file($xmlFile);
if (!$xml) {
echo "<div style='color: red;'>无法加载XML文件!</div>";
exit;
}
// 开始构建搜索结果
$html = "<h3>搜索结果</h3>";
// 如果关键词为空,显示所有内容
if ($keyword === '') {
$html .= "<div style='color: #666; margin-bottom: 10px;'>显示所有内容:</div>";
// 显示品牌信息
$html .= "<div style='margin: 10px 0; padding: 10px; background-color: #f5f5f5;'>";
$html .= "<strong>品牌:</strong>" . htmlspecialchars((string)$xml->brand) . "<br>";
$html .= "<strong>网站:</strong>" . htmlspecialchars((string)$xml->website) . "<br>";
$html .= "<strong>主课程:</strong>" . htmlspecialchars((string)$xml->course);
$html .= "</div>";
// 显示课程列表
$html .= "<h4>课程列表:</h4>";
$html .= "<ul>";
foreach ($xml->courses->course as $course) {
$courseId = (string)$course['id'];
$courseName = (string)$course;
$html .= "<li><strong>ID: {$courseId}</strong> - {$courseName}</li>";
}
$html .= "</ul>";
} else {
// 进行搜索
$found = false;
$html .= "<div style='color: #666; margin-bottom: 10px;'>搜索关键词:<strong>" . htmlspecialchars($keyword) . "</strong></div>";
// 搜索品牌
if (stripos((string)$xml->brand, $keyword) !== false) {
$found = true;
$html .= "<div style='margin: 10px 0; padding: 10px; background-color: #e8f5e9; border-left: 4px solid #4CAF50;'>";
$html .= "<strong>匹配到品牌:</strong>" . htmlspecialchars((string)$xml->brand);
$html .= "</div>";
}
// 搜索网站
if (stripos((string)$xml->website, $keyword) !== false) {
$found = true;
$html .= "<div style='margin: 10px 0; padding: 10px; background-color: #e8f5e9; border-left: 4px solid #4CAF50;'>";
$html .= "<strong>匹配到网站:</strong>" . htmlspecialchars((string)$xml->website);
$html .= "</div>";
}
// 搜索主课程
if (stripos((string)$xml->course, $keyword) !== false) {
$found = true;
$html .= "<div style='margin: 10px 0; padding: 10px; background-color: #e8f5e9; border-left: 4px solid #4CAF50;'>";
$html .= "<strong>匹配到主课程:</strong>" . htmlspecialchars((string)$xml->course);
$html .= "</div>";
}
// 搜索课程列表
$matchedCourses = [];
foreach ($xml->courses->course as $course) {
$courseName = (string)$course;
if (stripos($courseName, $keyword) !== false) {
$found = true;
$courseId = (string)$course['id'];
$matchedCourses[] = [
'id' => $courseId,
'name' => $courseName
];
}
}
// 显示匹配的课程
if (!empty($matchedCourses)) {
$html .= "<h4>匹配的课程:</h4>";
$html .= "<ul>";
foreach ($matchedCourses as $course) {
// 高亮显示匹配的关键词
$highlightedName = preg_replace(
"/(" . preg_quote($keyword, '/') . ")/i",
"<span style='background-color: yellow; font-weight: bold;'>$1</span>",
htmlspecialchars($course['name'])
);
$html .= "<li><strong>ID: {$course['id']}</strong> - {$highlightedName}</li>";
}
$html .= "</ul>";
}
// 如果没有找到匹配项
if (!$found) {
$html .= "<div style='color: #999; padding: 20px; text-align: center;'>";
$html .= "没有找到包含 \"" . htmlspecialchars($keyword) . "\" 的内容";
$html .= "</div>";
}
}
// 输出结果
echo $html;
?>4. 效果演示
4.1 访问test.html:

4.2 开始输入关键字:

总结:本节通过一个完整的XML实时搜索示例,展示了PHP和Ajax如何实现实时搜索功能。这个例子演示了如何在不刷新页面的情况下,根据用户输入实时搜索XML数据并显示结果。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程