PHP表单按追踪号查询用户却返回全量数据库数据问题求助
问题分析与修复方案
你的问题很清晰:当前PHP代码完全没处理表单提交的搜索参数,也没给SQL查询加过滤条件,所以直接返回了数据库里的所有用户数据。下面我一步步帮你修复,同时还会补上SQL注入防护(这是必须重视的安全细节)。
1. 修改PHP处理代码(making.php)
核心改动点:
- 接收表单提交的追踪号参数
- 给SQL添加
WHERE ctracking = ?的过滤条件 - 使用预处理语句执行查询(彻底规避SQL注入风险)
修改后的代码:
<?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "class"; // 创建数据库连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接是否成功 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 仅在表单提交时执行查询逻辑 if (isset($_POST['csearch'])) { // 获取用户输入的追踪号,先做首尾空格清理 $trackingNumber = trim($_POST['search']); if (!empty($trackingNumber)) { // 用预处理语句构建查询,?是参数占位符 $sql = "SELECT ctracking, cname, cemail, crport, cdport, clocation, cdestination FROM demo WHERE ctracking = ?"; // 初始化预处理语句 $stmt = $conn->prepare($sql); // 绑定参数(s表示参数为字符串类型) $stmt->bind_param("s", $trackingNumber); // 执行查询 $stmt->execute(); // 获取查询结果集 $result = $stmt->get_result(); if ($result->num_rows > 0) { // 输出匹配到的用户详情 while($row = $result->fetch_assoc()) { echo "ctracking: " . $row["ctracking"]. " - Name: " . $row["cname"]. " - Email: " . $row["cemail"]. " - Port: " . $row["crport"]. " - Dport: " . $row["cdport"] . " - Location: " . $row["clocation"] . " - Destination: " . $row["cdestination"] . "<br>"; } } else { echo "No results found for tracking number: " . htmlspecialchars($trackingNumber); } // 关闭预处理语句 $stmt->close(); } else { echo "Please enter a valid tracking number."; } } $conn->close(); ?>
2. 调整HTML表单(优化用户体验)
你的表单输入框提示是用户名,但实际要搜索的是追踪号,建议修改提示文字,让用户明确知道该输入什么:
<html> <head> <title>Britchi Tracking</title> </head> <body> <form action="making.php" method="post"> <h1>Britchi Tracking</h1> <p> Tracking Number (required) <br/> <input type="text" name="search" placeholder="Enter your tracking number" size="70"/> </p> <p><input type="submit" name="csearch" value="Search"></p> </form> <form action="http://localhost/wordpress"> <input type="submit" value="Go to Home Page"> </form> </body> </html>
关键细节说明
- 预处理语句:直接把用户输入拼进SQL会引发SQL注入攻击,用
prepare()+bind_param()是PHP操作数据库的安全最佳实践。 - 空值检查:添加
!empty($trackingNumber)判断,避免用户提交空内容时执行无效查询。 - HTML转义:输出用户输入的追踪号时用
htmlspecialchars(),防止XSS攻击。
内容的提问来源于stack exchange,提问作者Britchi2
相关产品推荐
相关产品推荐

