PHP导入CSV至MySQL时反斜杠丢失问题求助
解决CSV导入MySQL时反斜杠丢失的问题
问题原因
反斜杠是PHP的转义字符,直接将CSV读取的字段拼接进SQL语句时,反斜杠会被解析为转义标记而非普通字符,导致存入数据库时丢失。同时你当前的代码存在严重的SQL注入风险,必须同步修复。
解决方案
方法1:手动转义字段(快速修复)
在读取CSV记录后,对每个字段使用mysqli_real_escape_string()进行转义,确保反斜杠被正确保留,同时防范SQL注入:
while(($emp_record = fgetcsv($csv_file)) !== FALSE){ // 转义所有CSV字段,处理反斜杠和特殊字符 foreach ($emp_record as &$value) { $value = mysqli_real_escape_string($conn, $value); } unset($value); // 释放引用,避免后续变量污染 // 后续的SELECT/UPDATE/INSERT语句保持原拼接方式即可 $sql_query = "SELECT emp_id, ... FROM emp WHERE campo_22 = '".$emp_record[1]."'"; // ... 其余代码不变 }
方法2:使用预处理语句(推荐,安全可靠)
预处理语句会自动处理字符转义,彻底解决反斜杠丢失问题,同时完全避免SQL注入风险,是PHP操作数据库的标准安全做法。以下是修改后的核心代码:
预处理SELECT(检查记录是否存在)
while(($emp_record = fgetcsv($csv_file)) !== FALSE){ // 预处理查询语句 $stmt = mysqli_prepare($conn, "SELECT emp_id FROM emp WHERE campo_22 = ?"); mysqli_stmt_bind_param($stmt, "s", $emp_record[1]); mysqli_stmt_execute($stmt); mysqli_stmt_store_result($stmt); if(mysqli_stmt_num_rows($stmt) > 0) { // 预处理UPDATE语句 $update_stmt = mysqli_prepare($conn, "UPDATE emp set campo_1a=?, campo_1b=?, campo_1a_1=?, ..., quantita_e=? WHERE campo_22=?"); // 绑定参数,"ssss..."表示所有参数都是字符串类型,数量需与字段数一致 mysqli_stmt_bind_param($update_stmt, "ssss...s", $emp_record[2], $emp_record[3], $emp_record[4], ..., $emp_record[68], $emp_record[1]); mysqli_stmt_execute($update_stmt); mysqli_stmt_close($update_stmt); } else { // 预处理INSERT语句 $insert_stmt = mysqli_prepare($conn, "INSERT INTO emp (campo_22, campo_1a, campo_1a_1, ..., quantita_e) VALUES (?, ?, ?, ..., ?)"); mysqli_stmt_bind_param($insert_stmt, "ssss...s", $emp_record[1], $emp_record[2], $emp_record[3], ..., $emp_record[68]); mysqli_stmt_execute($insert_stmt); mysqli_stmt_close($insert_stmt); } mysqli_stmt_close($stmt); }
注意:绑定参数时,
"ssss..."中的每个s对应一个字符串类型的参数,如果字段是数字类型,可替换为i(整数)或d(浮点数),需根据实际字段类型调整。
内容的提问来源于stack exchange,提问作者bastiag5
相关产品推荐
相关产品推荐

