PHP-在自定义Wordpress数据库中上载CSV数据

PHP-在自定义Wordpress数据库中上载CSV数据,php,mysql,wordpress,csv,file-upload,Php,Mysql,Wordpress,Csv,File Upload,我的自定义表格: 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'])) {

我的自定义表格:

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";
}
Array
(
    [0] => Product Name;product_serial
)

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

Array
(
    [0] => iPhone 6;iphone-003
)
Array
(
    [0] => Product Name
    [1] => product_serial
)

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

Array
(
    [0] => iPhone 6
    [1] => iphone-003
)
使用分隔符打印
$data
输出

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";
}
Array
(
    [0] => Product Name;product_serial
)

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

Array
(
    [0] => iPhone 6;iphone-003
)
Array
(
    [0] => Product Name
    [1] => product_serial
)

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

Array
(
    [0] => iPhone 6
    [1] => iphone-003
)
使用上述方法,
产品名称
产品系列
也会被插入到数据库中,这是应该防止的。另外,分隔符
时不输出正确的数组可以

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


附言:使用OpenOffice插入CSV数据。分隔符是否存在格式问题?

一般的经验法则是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文件可能有不同的列和行分隔符(有时列用逗号表示,有时用分号表示等等),这使得解析CSV非常困难。在本例中,您的列分隔符似乎是分号,因此修改函数参数可能会为您解决此问题:

while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
如果您确实必须支持多种类型的分隔符,以下代码段可能会帮助您:

$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);
}
检测从以下位置获取的代码段:


希望这能有所帮助。

跳过计数器会删除第一行,即列名,但没有获取有关分隔符的代码段。如何在我的代码片段中实现相同的功能?修改了我的答案,似乎检测分隔符是相当棘手的,许多帖子建议要求用户提供CSV文件。我已经修改了我的答案,这将解决您的CSV问题,但如果您的CSV有不同的分隔符(又名逗号和/或分号),那么您将面临艰难的旅程。。。。祝你好运。