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

PHP实现表单文本替换为CSV数据时出现异常求助

问题排查与修复方案

核心问题分析

你的代码存在三个关键问题,导致消息始终复用第一行CSV数据且替换结果不符合预期:

  • 循环变量未重置:$i 定义在CSV行循环外部,第一次循环后 $i 会递增到 $numcols,后续所有行的替换逻辑直接跳过,复用第一次替换后的内容。
  • 原始模板被覆盖:每次循环直接修改 $bericht 变量,第一次替换后模板中的占位符已被替换成第一行数据,后续循环无法用新行数据重新替换。
  • 列索引不匹配:从示例来看,占位符 %%n%% 是从1开始计数,但代码中 $i 从0开始,且 $data[0] 是收件人,导致替换的列对应关系错误。

修复后的代码

<?php
session_start();

require_once("../../includes/config.php");
include("../../includes/smartschool.php");

$titel   = htmlspecialchars($_POST['titel']);
$originalBericht = urldecode($_POST['bericht']); // 保留原始消息模板
$numcols = (int)htmlspecialchars($_POST['cols']); // 转为整数,确保循环逻辑正确
$csv     = strtolower($_POST['csv']);

$smartschool = new SmartschoolConnection;

if (($handle = fopen('uploads/'.$csv, 'r')) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
        $bericht = $originalBericht; // 每次循环重新加载原始模板
        $i = 1; // 从1开始匹配占位符的%%n%%,data[0]作为收件人不参与替换
        
        while ($i <= $numcols) {
            // 处理CSV列数不足的情况,避免未定义索引警告
            $replaceValue = isset($data[$i]) ? $data[$i] : '';
            $bericht = str_replace('%%'.$i.'%%', $replaceValue, $bericht);
            ++$i;
        }

        $sRecipient     = $data[0];
        $sTitle         = $titel;
        $sBody          = $bericht;
        $sSender        = $_SESSION['username'];
        $aAttachments   = null;
        $iType          = 0;

        $smartschool->sendMsg($sRecipient, $sTitle, $sBody, $sSender, $aAttachments, $iType);

        echo "Smartschool bericht verzonden naar <strong>".$sRecipient."</strong><br />";
    }
    fclose($handle); // 关闭文件句柄,释放资源
}

sleep(5);
?>

关键修改说明

  1. 新增 $originalBericht 存储原始模板,每次循环重新赋值给 $bericht,避免模板被替换后无法复用。
  2. 将 $i 的初始化移到CSV行循环内部,每次处理新行时重置为1,匹配占位符的计数逻辑。
  3. 增加 isset($data[$i]) 判断,处理CSV列数不足的边界情况,避免警告。
  4. 把 $numcols 转为整数类型,确保循环条件的正确性。
  5. 新增 fclose($handle) 关闭文件句柄,避免资源泄漏。

验证建议

可以在替换后临时输出消息内容,确认替换结果是否符合预期:

echo "<pre>".htmlspecialchars($bericht)."</pre>";

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:15:27