【问题标题】:php with mysql: import .csv delimited space带有 mysql 的 php:导入 .csv 分隔空间
【发布时间】:2020-12-26 05:07:38
【问题描述】:

如何将此文件导入mysql,行间有空格? 通过 phpmyadmin 是可能的,但我需要通过网站进行。

<?php
// Check if file was uploaded & there were no errors
if ($_FILES && $_FILES['csv-file']['error'] == 0) {
    $extension = pathinfo($_FILES['csv-file']['name'],PATHINFO_EXTENSION);
    // Check if extension is csv then proceed to import
    if($extension == 'csv'){
        // Open file for reading
        $file = fopen($_FILES['csv-file']['tmp_name'], 'r');
        // Loop through all rows of file and insert them to database table
        while (!feof($file)) {
            // Get current row as recordset
            $row = fgetcsv($file);
            if (!empty($row)) {
                $data = [];
                $data['numbers'] = htmlentities($row[0]);
                $data['tids'] = htmlentities($row[1]);
                $data['date'] = htmlentities($row[2]);
                $data['time'] = htmlentities($row[3]);
                $data['zero'] = htmlentities($row[4]);
                $data['terminal_sn'] = htmlentities($row[5]);
                $data['space'] = htmlentities($row[6]);
                $records[] = $data;
                mysqli_query($dbcon,"INSERT INTO employees (".implode(",",array_keys($data)).") VALUES ('".implode("','",array_values($data))."')");
            }
        }
    }else{?>

这是我的带有数据的 .csv 文件:

10222157120501 T0040922 07/09/2020 18:13:56 0 315-525-348 1
10223157120502 T0040923 07/09/2020 18:15:24 0 318-027-497 1
10224157120503 T0040924 07/09/2020 18:15:36 0 316-176-614 1
10225157120504 T0040925 07/09/2020 18:16:25 0 317-377-077 1

【问题讨论】:

  • 行间有空格?你的意思是csv 每隔一行有一个空白行吗?
  • 如果字段之间有空格,请查看手册中fgetcsv() 的分隔符。
  • 啊,这更有意义@NigelRen :) 也许是时候去观看大学挑战赛了
  • 您的脚本对SQL Injection Attack 开放。即使是if you are escaping inputs, its not safe!,您也应该考虑在MYSQLI_PDO API 中使用prepared parameterized statements,而不是连接值
  • htmlentities 只能在输出到 HTML 文档时使用。

标签: php mysql csv import insert


【解决方案1】:
// prepare the insert query once outside the loop
$sql = 'INSERT INTO employees (`numbers`, `tids`, `date`, `time`, 
                               `zero`, `terminal_sn`, `space`)
            VALUES(?,?,?,?,?,?,?)';
$stmt = $dbcon->prepare($sql);

if (($handle = fopen($_FILES['csv-file']['name'], "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, " ")) !== FALSE) {
        //             space delimiter      ^
        
        // bind the columns to the query parameters
        $stmt->bind_param('sssssss', $row[0], $row[1], $row[2], $row[3],
                                     $row[4],$row[5], row[6]);
        // execute the query with parameters replaced with data
        $stmt->execute();
    }
    fclose($handle);
}

【讨论】:

  • 也可以:LOAD DATA INFILE直接导入CSV。
  • csv 字段中的日期值应存储在日期数据类型中(推测这实际上是日期+时间 - 因此 CSV 中的 2 个属性应组合为单个值)。但在这种情况下,上述内容可能无法按预期工作。确实需要将值解析并转换为适当的表示形式。
  • @symcbean 完全同意,在提出这一点之前,我打算等待投诉说​​这不起作用,但没有人来。我假设这意味着日期和时间被存储为 VARCHAR 数据类型列。我们将等待关于如何使用未存储在 DATE 数据类型中的日期来做有趣的事情的基于 SQL 的问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 2020-11-01
  • 2014-12-13
相关资源
最近更新 更多