You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将输入框日期参数传入PHP(PDO)/MySQL查询统计通话数据

问题修复与实现步骤

核心问题梳理

  • PHP变量定义末尾缺少分号,导致语法报错
  • HTML表单未指定method="post",默认GET方法无法通过$_POST获取参数
  • 直接将用户输入拼入SQL存在SQL注入风险,必须使用PDO预处理语句
  • 未处理日期参数为空的情况,需要设置默认值或校验逻辑
  • 原SQL语句未正确绑定用户输入的日期变量
  • 存在未闭合的HTML标签,导致页面渲染异常

修改后的完整代码

<?php
// 初始化变量,设置默认值(默认查询最近7天数据)
$startdate = $_POST['start_date'] ?? date('Y-m-d', strtotime('-7 days'));
$enddate = $_POST['end_date'] ?? date('Y-m-d');
$yearstartdate = $_POST['year_start'] ?? date('Y-m-01');
$yearenddate = $_POST['year_end'] ?? date('Y-m-t');

try {
    $db = new PDO('mysql:host=localhost;dbname=mydb', 'myuser', 'mypassword');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 预处理语句绑定参数,避免SQL注入
    $sql_overalltotalcalls = "SELECT count(*) FROM calldata WHERE DATE(`entrytimestamp`) BETWEEN :start_date AND :end_date";
    $stmt = $db->prepare($sql_overalltotalcalls);
    $stmt->bindParam(':start_date', $startdate, PDO::PARAM_STR);
    $stmt->bindParam(':end_date', $enddate, PDO::PARAM_STR);
    $stmt->execute();
    $overalltotalcalls = $stmt->fetchColumn();
} catch(PDOException $e) {
    // 错误处理,生产环境可替换为友好提示
    die("数据库查询失败: " . $e->getMessage());
}
?>

<form method="post">
<table>
<tr>
    <th class="reportsettingscolors" colspan="2">Report Settings</th>
</tr>
<tr>
    <td><label for="startdate">Report Start Date (Format: YYYY-MM-DD):</label></td>
    <td><input type="text" name="start_date" id="startdate" value="<?php echo htmlspecialchars($startdate); ?>"></td>
</tr>
<tr>
    <td><label for="enddate">Report End Date (Format: YYYY-MM-DD):</label></td>
    <td><input type="text" name="end_date" id="enddate" value="<?php echo htmlspecialchars($enddate); ?>"></td>
</tr>
<tr>
    <td><label for="yearstart">Year Start (Format: YYYY-MM-DD):</label></td>
    <td><input type="text" name="year_start" id="yearstart" value="<?php echo htmlspecialchars($yearstartdate); ?>"></td>
</tr>
<tr>
    <td><label for="yearend">Year End (Format: YYYY-MM-DD):</label></td>
    <td><input type="text" name="year_end" id="yearend" value="<?php echo htmlspecialchars($yearenddate); ?>"></td>
</tr>
<tr>
    <td colspan="2"><input type="submit" value="Update"></td>
</tr>
</table>
</form>

<br>
<div class="container">
<div class="floatLeft">
<table>
<tr>
    <th class="overallstatscolors" colspan="6">Overall Call Stats</th>
</tr>
<tr>
    <th class="emptyblock"></th><th class="thisweekcolors">Selected Start</th><th class="lastweekcolors">Selected End</th><th rowspan="2">Weekly Difference</th><th rowspan="2">MTD</th><th rowspan="2">YTD</th>
</tr>
<tr>
    <td class="emptyblock"></td>
    <td><?php echo htmlspecialchars($startdate); ?></td>
    <td><?php echo htmlspecialchars($enddate); ?></td>
</tr>
<tr>
    <td>Total Calls</td>
    <td><?php echo $overalltotalcalls; ?></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
</tr>
<tr>
    <td>Total Transfers</td><td></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
    <td>Transfer %</td><td></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
    <td>Non-Live Calls</td><td></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
    <td>Live Calls</td><td></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
    <td>Total Call Time (Hrs)</td><td></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
    <td>Total Wrap Time (Hrs)</td><td></td><td></td><td></td><td></td><td></td>
</tr>
</table>
</div>

关键修改说明

  • 表单方法:给<form>添加method="post",确保参数通过POST传递,匹配$_POST获取逻辑
  • 变量初始化:使用??运算符设置默认值,避免未提交时变量为空;用htmlspecialchars()转义输出,防止XSS攻击
  • PDO预处理:用命名占位符绑定参数,彻底避免SQL注入,同时保证SQL语法正确
  • 错误处理:添加try-catch捕获PDO异常,方便调试和错误提示
  • 标签修复:闭合原代码中未结束的<tr>标签,避免页面渲染异常
  • 日期回显:在输入框中回显用户选择的日期,提升操作体验

内容的提问来源于stack exchange,提问作者Chris Thompson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:35:25