【问题标题】:PHP Upload CSV and inject into existing mySQL table date formatsPHP 上传 CSV 并注入现有的 mySQL 表日期格式
【发布时间】:2015-07-22 21:10:08
【问题描述】:

所以我更改了我的脚本以使用 LOAD DATA LOCAL INFILE,因为它对我来说应该更快。问题是我无法正确填充日期。

我现在有这个。 (我尝试了 50 种不同的方法)

if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
    echo $target_file;

    // Get file for processing
    $sql = "
            LOAD DATA LOCAL INFILE \"C:/GIT/Production/csv/$target_file\"
            INTO TABLE exp_subs
            FIELDS TERMINATED BY ','
            OPTIONALLY ENCLOSED BY '\"'
            LINES TERMINATED BY '\n'
            (id,site_id,hash,member_id,card_id,coupon_id,plan_id,voucher_id,entry_id,recurring_interval,recurring_interval_count,amount,total_amount,total_cycles,status,renew,trial_starts_at,trial_ends_at,retry_count,retry_date,shipping_name,shipping_address1,shipping_address2,shipping_address3,shipping_city,shipping_state,shipping_zip,shipping_country,notes,test_mode,created_by,updated_by,canceled_by,next_billing_at,last_billed_at,@var1,@var2,@var3,@var4,@var5,@var6)
            SET ended_at = STR_TO_DATE(@var1, '%Y-%m-%d %H:%i:%S'),
            canceled_at = STR_TO_DATE(@var2, '%Y-%m-%d %H:%i:%S'),
            expires_at = STR_TO_DATE(@var3, '%Y-%m-%d %H:%i:%S'),
            created_at = STR_TO_DATE(@var4, '%Y-%m-%d %H:%i:%S'),
            updated_at = STR_TO_DATE(@var5, '%Y-%m-%d %H:%i:%S'),
            deleted_at = STR_TO_DATE(@var6, '%Y-%m-%d %H:%i:%S')
        ";

        mysql_query($sql) or die(mysql_error());
} else {
    echo "Sorry, there was an error uploading your file.";
}

这会将除日期之外的所有内容都包含在内。日期仍以“0000-00-00 00:00:00”的形式输入。如果我使用这样的更简单的版本,也会发生同样的事情:

if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
    echo $target_file;

    // Get file for processing
    $sql = "
        LOAD DATA LOCAL INFILE \"C:/GIT/Production/csv/$target_file\"
        INTO TABLE exp_subs
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '\"'
        LINES TERMINATED BY '\n'
    ";

    mysql_query($sql) or die(mysql_error());
} else {
    echo "Sorry, there was an error uploading your file.";
}

CSV 文件以这种格式保存日期:“4/21/2016 7:00”

如何将它们从上传的文件转换为我需要的方式?

【问题讨论】:

  • 恐怕这对我没有帮助。也许我没有关注,我了解如何在 PHP 中更改日期。我不知道如何更改文件数据中的日期,因为它是直接从 CSV 拉到 SQL 语句中的,并且 CSV 文件不允许所需的格式。
  • 您的解决方案是否有效?
  • 那太好了。谢谢
  • @shehary 感谢您昨天与我一起解决这个问题。我将发布最终为我工作的内容。与我们在事物上的位置有些不同,但这会通过并允许删除所有空行。我将在此处发布最终答案供您查看。

标签: mysql date csv formatting sql-insert


【解决方案1】:

我希望这可以帮助其他人...

这就是我最终得到的对我有用的东西。可能有更简单的方法,但我无法让另一种方法正常工作。

本质上,我必须创建一个行变量来跳过作为标题的 CSV 文件的第一行,然后,因为我有多个日期被发送,我必须打破 CSV 中的每一列或字段所以我可以获取作为日期传入的字段并从中创建一个日期字段,将它们转换为所需的格式,然后在将变量添加到 SQL INSERT 语句之前覆盖它。

最后,我不断插入数千行。 CSV 文件看到很多空白 (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,) 行并且也在添加它们,所以我最终检查了空白并在它为空白时结束 while 循环。

<?php
    include "connection.php"; //Connect to Database

    //Upload File
    if (isset($_POST['submit'])) {
        if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
            echo "<h1>" . "File ". $_FILES['filename']['name'] ." uploaded successfully." . "</h1>";
        }

        $csvRow = 1;

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

        $csvKey = 0; // Set the parent array key to 0

        while (($csvData = fgetcsv($csvHandle)) !== FALSE) {

            if($csvRow == 1){
                $csvRow++;
                continue;
            }

            $c = count($csvData); // Count the total keys in each row

            // 33-40 are dates that need to be converted
            $dateArray = array(33, 34, 35, 36, 37, 38, 39, 40);

            // ## Flag variable ##########
            $empty = true;

            for ($x = 0; $x < $c; $x++) { // Loop through the "columns"

                // ## Test each value ##########
                $empty = $empty && (empty($csvData[$x]));

                if(in_array($x, $dateArray)){
                    $date = date_create($csvData[$x]);
                    $FormattedDate = date_format($date,"Y-m-d H:i:s");
                    $csvData[$x] = $FormattedDate;
                }
            }

            $sql = "" . "INSERT INTO exp_subs(id,site_id,hash,member_id,card_id,coupon_id,plan_id,voucher_id,entry_id,recurring_interval,recurring_interval_count,amount,total_amount,total_cycles,status,renew,trial_starts_at,trial_ends_at,retry_count,retry_date,shipping_name,shipping_address1,shipping_address2,shipping_address3,shipping_city,shipping_state,shipping_zip,shipping_country,notes,test_mode,created_by,updated_by,canceled_by,next_billing_at,last_billed_at,ended_at,canceled_at,expires_at,created_at,updated_at,deleted_at) VALUES('$csvData[0]','$csvData[1]','$csvData[2]','$csvData[3]','$csvData[4]','$csvData[5]','$csvData[6]','$csvData[7]','$csvData[8]','$csvData[9]','$csvData[10]','$csvData[11]','$csvData[12]','$csvData[13]','$csvData[14]','$csvData[15]','$csvData[16]','$csvData[17]','$csvData[18]','$csvData[19]','$csvData[20]','$csvData[21]','$csvData[22]','$csvData[23]','$csvData[24]','$csvData[25]','$csvData[26]','$csvData[27]','$csvData[28]','$csvData[29]','$csvData[30]','$csvData[31]','$csvData[32]','$csvData[33]','$csvData[34]','$csvData[35]','$csvData[36]','$csvData[37]','$csvData[38]','$csvData[39]','$csvData[40]')";
            $result = mysql_query($sql) or die(mysql_error());

            // ## Stop loop if all empty ##########
            if ($empty) {
                break;
            }
            $csvKey++;
        }

        fclose($csvHandle);

        print "<br />Import done";
    } else {
        print "Upload new csv by browsing to file and clicking on Upload<br />\n";
        print "<form enctype='multipart/form-data' action='upload.php' method='post'>";
        print "File name to import:<br />\n";
        print "<input size='50' type='file' name='filename'><br />\n";
        print "<input type='submit' name='submit' value='Upload'></form>";
    }
?>

【讨论】:

    猜你喜欢
    • 2017-12-17
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多