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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:57:03