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

PHP单文件中实现两个POST按钮独立功能的技术咨询

解决同一PHP文件处理两个POST请求的问题

你的问题核心在于:当点击export按钮时,$productResult变量只在search的POST分支里被赋值,新的POST请求会重置这个变量,导致导出时拿不到数据。另外,直接将用户输入拼到SQL里存在严重的SQL注入风险,这部分也得一并修正。

修改后的代码

<?php
// 抽离查询逻辑为独立函数,方便搜索和导出复用
function getProductResults($db_handle, $startDate, $endDate) {
    // 使用预处理语句彻底避免SQL注入
    $stmt = $db_handle->prepare("
        SELECT 
            invoiceissued.date_created as Date, 
            outlets.outletname as OutletName, 
            outlets.barcode as Barcode, 
            invoiceissued.invoiceno as InvoiceNo, 
            outlets.businessregistrationno as BRNno, 
            outlets.vat as VAT, 
            invoiceissued.VATAmount as VATAmount, 
            invoiceissued.total_amount as TotalAmount, 
            invoiceissued.total_amount - invoiceissued.VATAmount as NetAmount
        FROM invoiceissued 
        JOIN outlets ON invoiceissued.outletid = outlets.outletsid 
        WHERE invoiceissued.date_created BETWEEN ? AND ?
    ");
    $stmt->bind_param("ss", $startDate, $endDate);
    $stmt->execute();
    return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}

// 处理搜索请求
if(isset($_POST['search'])) {
    $txtStartDate = $_POST['txtStartDate'];
    $txtEndDate = $_POST['txtEndDate'];
    $productResult = getProductResults($db_handle, $txtStartDate, $txtEndDate);
    // 这里可以添加搜索后的页面渲染逻辑,比如把结果展示成表格
}

// 处理导出请求
if(isset($_POST['export'])) {
    $txtStartDate = $_POST['txtStartDate'];
    $txtEndDate = $_POST['txtEndDate'];
    // 导出时重新执行查询,确保拿到最新的符合条件的数据
    $productResult = getProductResults($db_handle, $txtStartDate, $txtEndDate);
    
    $filename = "Export_excel.txt";
    header("Content-Type: text/plain");
    header("Content-Disposition: attachment; filename=\"$filename\"");
    $isPrintHeader = false;
    if (!empty($productResult)) {
        foreach ($productResult as $row) {
            if (!$isPrintHeader) {
                echo implode("\t", array_keys($row)) . "\n";
                $isPrintHeader = true;
            }
            echo implode("\t", array_values($row)) . "\n";
        }
    }
    exit();
}
?>

关键修改点说明

  • 复用查询逻辑:把SQL查询抽成独立函数getProductResults,不管是搜索还是导出,都调用这个函数获取数据,既避免重复代码,也保证导出时能拿到正确的结果。
  • 确保导出时的参数传递:你需要保证HTML表单里,txtStartDate、txtEndDate这两个输入框和两个按钮属于同一个<form>标签,这样点击导出按钮时,日期参数也会被一起提交。
  • 修复SQL注入风险:用MySQLi的预处理语句(prepare+bind_param)代替直接拼接SQL字符串,这是处理用户输入的标准安全操作,能有效防止恶意注入。
  • 优化字段可读性:给原SQL里没有别名的计算字段加了NetAmount别名,导出的表头会更清晰。

额外提醒

如果你的$db_handle是PDO连接,预处理语句的写法会略有不同,你可以根据实际连接方式调整函数内的代码。

内容的提问来源于stack exchange,提问作者Poivre Dor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:46:32