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
相关产品推荐
相关产品推荐

