【问题标题】:PHP - Upload CSV data in custom Wordpress databasePHP - 在自定义 Wordpress 数据库中上传 CSV 数据
【发布时间】:2015-09-12 22:56:56
【问题描述】:

my_custom_table:

id              int(11)
product_type    varchar(210)
product_serial  varchar(210)
created_at      datetime


//Upload CSV File
if (isset($_POST['submit'])) {

        if (is_uploaded_file($_FILES['upload_csv']['tmp_name'])) {

                echo "<h1>" . "File ". $_FILES['upload_csv']['name'] ." uploaded successfully." . "</h1>";
        }


        //Import uploaded file to Database
        $handle = fopen($_FILES['upload_csv']['tmp_name'], "r");

        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $wpdb->insert("my_custom_table", array(
                    "product_type" => $data[0],
                    "product_serial" => $data[1],
                    "created_at" => current_time('mysql', 1)
                 ));
        }

        fclose($handle);

        print "Import done";
}

打印$data输出,带分隔符,

Array
(
    [0] => Product Name;product_serial
)

Array
(
    [0] => iPhone 6;iphone-002
)

Array
(
    [0] => iPhone 6;iphone-003
)

打印$data输出,带分隔符;

Array
(
    [0] => Product Name
    [1] => product_serial
)

Array
(
    [0] => iPhone 6
    [1] => iphone-002
)

Array
(
    [0] => iPhone 6
    [1] => iphone-003
)

使用上述方法,Product Nameproduct_serial 也会插入到 DB 中,这应该被阻止。此外,分隔符 , 不会输出正确的数组,而 ; 会。

如何防止 CSV 列名插入并在数据库中插入正确的值?

P.S:使用 OpenOffice 进行 CSV 数据插入。格式化可能是分隔符的问题吗?

【问题讨论】:

    标签: php mysql wordpress csv file-upload


    【解决方案1】:

    一般的经验法则是 CSV 的第一行是列名,因此快速跳过计数器会为您删除第一行:

    $counter = 0;
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    
        // Skip the first row as is likely column names
        if ($counter === 0) {
            $counter++;
            continue;
        }
    
        // Insert the row into the database
        $wpdb->insert("my_custom_table", array(
            "product_type" => $data[0],
            "product_serial" => $data[1],
            "created_at" => current_time('mysql', 1)
        ));
    }
    

    另一个问题是 CSV 文件可以有不同的列和行分隔符(AKA 有时列用逗号分隔,有时用分号分隔......等)使得解析 CSV 非常困难。在此示例中,您的列分隔符似乎是分号,因此修改您的函数参数可能会为您修复它:

    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    

    如果你真的必须支持多种类型的分隔符,下面的代码 sn -p 可能会对你有所帮助:

    $csvFilePath = $_FILES['upload_csv']['tmp_name'];
    $delimiter = $this->detectDelimiter($csvFilePath);
    
    public function detectDelimiter($csvFile)
    {
        $delimiters = array(
            ';' => 0,
            ',' => 0,
            "\t" => 0,
            "|" => 0
        );
    
        $handle = fopen($csvFile, "r");
        $firstLine = fgets($handle);
        fclose($handle); 
        foreach ($delimiters as $delimiter => &$count) {
            $count = count(str_getcsv($firstLine, $delimiter));
        }
    
        return array_search(max($delimiters), $delimiters);
    }
    

    检测 sn-p 取自:HERE

    希望这会有所帮助。

    【讨论】:

    • 跳过计数器删除第一行,即列名,但没有得到关于分隔符的 sn-p。如何在我的代码 sn-p 中实现相同的功能?
    • 修改了我的答案,似乎检测分隔符非常棘手,许多帖子建议要求用户提供 CSV 文件。我已经修改了我的答案,这将解决您的 CSV 问题,但是如果您的 CSV 有不同的分隔符(AKA 逗号和/或分号),那么您将陷入困境......祝您好运。
    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2015-05-01
    • 2014-09-20
    • 2016-03-03
    相关资源
    最近更新 更多