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

PHP导入CSV至MySQL时数字截断问题求助

解决PHP导入CSV时数字被截断的问题

问题原因

你的代码存在两个关键错误:

  1. 错误获取字段值:$value已经是fgetcsv解析后的完整列值(比如"10"),但你用$value[0]只取了字符串的第一个字符,导致多位数被截断。
  2. 多余的解析操作:str_getcsv在这里完全没必要,因为fgetcsv已经完成了CSV行的拆分解析。

修正后的代码

基础读取修正(先确保正确输出)

$file = $_FILES["file"]["tmp_name"];
$file_open = fopen($file,"r");
// 无表头CSV,直接循环读取每一行
while(($csv = fgetcsv($file_open, 1000, ";")) !== false)
{
    // $csv是当前行的列数组,索引0对应N_utente,索引1对应Ano(Id为自增字段,无需从CSV读取)
    $n_utente = $csv[0];
    $ano = $csv[1];
    
    var_dump($n_utente, $ano); // 现在可正确输出完整值
}
fclose($file_open); // 记得关闭文件句柄

完整导入MySQL的代码(含数据库连接)

假设已配置好数据库连接信息,完整代码如下:

// 数据库连接配置
$host = 'localhost';
$dbname = '你的数据库名';
$username = '数据库用户名';
$password = '数据库密码';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    if(isset($_POST['submit_file']) && isset($_FILES['file'])){
        $file = $_FILES["file"]["tmp_name"];
        $file_open = fopen($file,"r");
        
        // 预处理插入语句,防止SQL注入
        $stmt = $pdo->prepare("INSERT INTO Areceber (N_utente, Ano) VALUES (:n_utente, :ano)");
        
        while(($csv = fgetcsv($file_open, 1000, ";")) !== false)
        {
            // 跳过空行(可选)
            if(empty($csv[0]) && empty($csv[1])) continue;
            
            $stmt->bindParam(':n_utente', $csv[0]);
            $stmt->bindParam(':ano', $csv[1]);
            $stmt->execute();
        }
        
        fclose($file_open);
        echo "CSV数据导入成功!";
    }
} catch(PDOException $e) {
    echo "错误: " . $e->getMessage();
}

注意事项

  • 确认CSV文件的分隔符确实是分号;,如果是逗号,,需将fgetcsv的第三个参数改为","。
  • 数据库Id字段为自增类型,插入时会自动生成,无需从CSV读取。
  • 使用PDO预处理语句可避免SQL注入,同时提升批量插入效率。
  • 建议增加文件上传验证逻辑(如文件类型检查、大小限制等),避免非法文件上传。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:05:21