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

