日期区间搜索功能实现求助:PHP代码调试
我帮你梳理下代码里的问题,一步步给你修正:
代码里的核心问题
- 表单提交判断失效:后端用
isset($_POST['search'])判断表单是否提交,但你的前端表单里根本没有name="search"的字段,提交按钮也没设置对应的name,导致搜索逻辑永远不会触发。 - SQL查询硬编码错误:SQL语句里写的
BETWEEN 'start' AND 'end'是固定字符串,不是从表单获取的日期变量,数据库会把它们当成字面量,肯定查不到匹配数据,还存在SQL注入风险。 - 冗余变量处理:你定义的
$search变量完全没用,而且因为$_POST['search']不存在,还可能引发警告。 - 表格结构不规范:循环里只输出
<td>标签,没包裹在<tr>里,最终渲染的表格会结构混乱。
修正后的完整代码
前端表单
<form action="searchreceipt.php" method="post"> <input name="start" type="date" size="30" required /> <input name="end" type="date" size="30" required /> <input type="submit" name="submit_search" value="Search"/> </form>
后端PHP代码
<?php $output = ''; // 改为判断日期参数是否提交,确保表单已提交 if(isset($_POST['start']) && isset($_POST['end'])) { // 获取前端传入的日期(HTML date控件默认输出YYYY-MM-DD,匹配MySQL DATE类型) $start_date = $_POST['start']; $end_date = $_POST['end']; // 替换为你的真实数据库连接参数 $mysqli = new mysqli('你的数据库主机', '数据库用户名', '数据库密码', '数据库名'); // 检查连接是否成功 if ($mysqli->connect_error) { die("数据库连接失败: " . $mysqli->connect_error); } // 使用预处理语句避免SQL注入,这是处理用户输入的最佳实践 $query = $mysqli->prepare("SELECT * FROM submission WHERE date BETWEEN ? AND ?"); $query->bind_param("ss", $start_date, $end_date); $query->execute(); $result = $query->get_result(); // 输出表格,确保每行数据用<tr>包裹 echo "<table border='1' style='width:50%'>"; // 处理空结果的情况,提升用户体验 if($result->num_rows === 0) { echo "<tr><td>没有找到匹配的记录</td></tr>"; } else { while ($row = $result->fetch_array(MYSQLI_ASSOC)) { $officer_id = $row['officer_id']; $sbranch_no = $row['sbranch_no']; $carno = $row['carno']; $cost = $row['cost']; $area = $row['area']; $receipt = $row['receipt']; echo "<tr>"; echo "<td>"; echo "<b>Receipt ID: <a href='transactiondetail.php?receipt=$receipt'>$receipt</b></a>"; echo "<br><br>"; echo "Used By: $officer_id"; echo "<br><br>"; echo "Officer Branch No: $sbranch_no"; echo "<br><br>"; echo "Cost: $cost"; echo "<br><br>"; echo "Area travelled: $area"; echo "<br><br>"; echo "</td>"; echo "</tr>"; } } echo "</table>"; // 关闭数据库连接和语句 $query->close(); $mysqli->close(); } ?>
额外注意事项
- 一定要把代码里的数据库连接参数替换成你自己的真实信息;
- 如果你的数据库日期字段不是
DATE类型,可能需要调整日期格式的转换逻辑; - 预处理语句已经帮你避免了SQL注入风险,不要直接把用户输入拼进SQL里。
内容的提问来源于stack exchange,提问作者Wen Qing
相关产品推荐
相关产品推荐

