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

PHP中multi_query批量执行SQL仅插入单行问题求助

问题分析与解决方案:仅插入文本文件第一行SQL数据的问题

我看了你的代码和文本内容,问题出在数据库连接被提前关闭,还有数组赋值的小细节需要调整,下面一步步说清楚:

核心问题原因

你在foreach循环里每执行一次multi_query就调用$conn->close();,这会导致第一次循环结束后数据库连接直接断开,后面的SQL语句根本没机会执行。另外,数组赋值用.=的写法虽不会直接报错,但每条sid对应一条INSERT语句,直接用=赋值会更清晰,也能避免潜在的未定义变量问题。

修复后的代码

<?php
$now = date('Y-m-d H:i:s'); // 补全你可能遗漏的时间变量定义
$file = fopen(__DIR__.'/acf.txt', "r" );
$autoCharges = []; // 提前初始化数组,避免未定义变量警告
$c = 0;

while ( !feof( $file ) ) {
    $line = fgets( $file );
    if(empty(trim($line))) continue; // 跳过空行,防止json解码失败
    
    $content = json_decode($line);
    if(!$content) continue; // 解码失败时直接跳过,避免后续报错
    
    $convertedObjToArr = get_object_vars($content);
    $event_type = $convertedObjToArr['event-type'];
    $status = $convertedObjToArr['status'];
    $date = $convertedObjToArr['datetime'];
    
    if($status == '0' AND $event_type == '1.5'){
        $sql = "INSERT INTO auto_charge(phone,charged_at,created_at,updated_at) VALUES ('$content->msisdn','$date','$now','$now');";
        $autoCharges[ $content->sid ] = $sql; // 直接赋值,对应单条INSERT语句
        $c++;
    }
}
fclose($file); // 记得关闭文件句柄,之前的代码遗漏了这一步

// 执行所有SQL,循环结束后再关闭连接
foreach ( $autoCharges as $sid => $query ) {
    $result = $conn->multi_query( $query );
    // 可选:添加错误处理,排查执行失败的情况
    if(!$result){
        echo "执行sid $sid 的SQL失败:" . $conn->error;
    }
}
$conn->close(); // 所有查询执行完成后再关闭数据库连接
?>

额外优化建议(重要)

你现在直接把变量拼接到SQL语句里,存在SQL注入的风险,建议改用预处理语句来规避这个问题,同时逻辑会更简洁:

// 替换原代码中SQL拼接与数组存储的部分
if($status == '0' AND $event_type == '1.5'){
    // 使用预处理语句模板
    $sql = "INSERT INTO auto_charge(phone,charged_at,created_at,updated_at) VALUES (?,?,?,?);";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("ssss", $content->msisdn, $date, $now, $now);
    $stmt->execute();
    $stmt->close();
    $c++;
}

这种方式不需要维护autoCharges数组,循环读取时直接执行插入,既安全又高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:36:37