php搜索框查询数据库源码
一个搜索框,搜索框数据背后至少牵扯三件事:前端表单怎么把关键词送出去、查询后端怎么接住并防止注入、库源数据库怎么查才不拖垮服务器。搜索框数据很多人写PHP搜索功能,查询直接拼SQL,库源结果上线没两天就被人用单引号把表拖走了。搜索框数据下面这段代码是查询我自己在小项目里反复用的结构,去掉花哨的库源框架,只留能跑的搜索框数据东西。 先看HTML部分。查询搜索框不需要多复杂,库源一个form加input就够。搜索框数据关键是查询method用GET,这样搜索结果页的库源URL里带关键词,用户能收藏、能分享、刷新也不会弹出“重新提交表单”的提示。POST适合改数据,搜索这种读操作,GET更顺手。 注意value那里。把用户输入回填到输入框,必须过一遍 后端接住关键词。第一步不是查库,是判断空值。用户点搜索按钮但没输入,你返回全部数据,表大了就是灾难。 接下来连数据库。PDO比mysqli更值得用,预处理语句写起来顺手,换数据库时改动也小。连接代码单独放一个 查询语句是核心。假设有一张 这里有几个细节。LIKE两边加百分号,意味着全表扫描。数据量到十万行以上,搜索会明显变慢。我自己的做法是给title和content建全文索引,然后用 还有, 输出结果时,标题和内容片段都要转义。别偷懒直接echo数据库字段,如果文章标题里被人插了script标签,照样XSS。 最后说一个容易被忽略的点:搜索关键词高亮。很多人想用 整套流程跑下来,代码不到四十行。搜索功能不难,难的是每一步都想到安全边界。拼SQL省两分钟,补漏洞花两天。<form action="search.php" method="get"> <input type="text" name="keyword" placeholder="输入关键词" value="<?php echo isset($_GET['keyword']) ? htmlspecialchars($_GET['keyword']) : ''; ?>"> <button type="submit">搜索</button> </form> htmlspecialchars。不然有人搜"><script>alert(1)</script>,页面直接弹窗。这不是理论风险,我见过真实案例,一个企业内网搜索框被用来钓管理员cookie。$keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : ''; if ($keyword === '') { echo '请输入搜索内容'; exit; } db.php,搜索页require进来就行。// db.php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', 'password', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]); articles表,字段id, title, content。不要写WHERE title LIKE '%$keyword%',这等于把数据库密码贴在门口。用占位符:$sql = "SELECT id, title, content FROM articles WHERE title LIKE :kw OR content LIKE :kw ORDER BY id DESC LIMIT 50"; $stmt = $pdo->prepare($sql); $stmt->execute([':kw' => '%' . $keyword . '%']); $results = $stmt->fetchAll(); MATCH ... AGAINST,但那是另一个话题。小项目用LIKE够,前提是加LIMIT。不加LIMIT,有人搜“的”字,你服务器内存直接爆。:kw这个占位符用了两次。PDO默认不允许同一个命名占位符出现多次,除非打开ATTR_EMULATE_PREPARES。稳妥写法是用两个不同名字::kw1和:kw2,分别绑定。我吃过这个亏,调试了半小时才发现。if (count($results) === 0) { echo '没有找到相关内容'; } else { foreach ($results as $row) { echo '<h3>' . htmlspecialchars($row['title']) . '</h3>'; echo '<p>' . htmlspecialchars(mb_substr(strip_tags($row['content']), 0, 150)) . '...</p>'; } } strip_tags去掉内容里的HTML,mb_substr按字符截断,避免中文乱码。这两个函数顺序不能反,先剥标签再截断,否则可能截出半个标签。str_replace把关键词替换成红色,但关键词里如果有正则特殊字符,比如.或*,会出问题。用preg_replace加preg_quote处理,或者干脆不高亮。我倾向不高亮,省事,用户也知道自己搜了什么。
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-