在创建用于导入和映射CSV的类似功能方面寻求帮助,类似于Mailchimp

时间:2014-05-23 15:43:50

标签: php mysql csv import mailchimp

我尝试做的是上传产品CSV并获取标题并创建一个映射工具,允许用户将CSV标头与需要导入的字段进行匹配。我认为我需要获取列值而不是行值。

Mailchimp目前拥有非常酷的功能,因为我确信电子邮件营销中的所有其他大牌玩家都可以。导入后,系统会列出每个列名称,并允许用户选择将其映射到内置列的内容。

我研究了几种不同的预先存在的解决方案,这些解决方案似乎都是错误的,我只需要创建自己的自定义解决方案。

我目前正在使用PHP / MySQL。任何帮助或建议将不胜感激!

1 个答案:

答案 0 :(得分:2)

根据您为我提供的内容,我将以下PHP类放在一起,希望能为您提供所需的功能。代码的底部演示了小类的用法。

<?php
class CSVtoSQL {
    private $filePath, $csvData;

    public function __construct($filePath) {
        $this->filePath = $filePath;
    }

    public function readDataIn() {
        $file = fopen($this->filePath, 'r');
        $data = fread($file, filesize($this->filePath));

        // Split CSV line by line.
        $lines = explode("\n", $data);

        // Split each line by commas to extract each value.
        for ($i = 0; $i < sizeof($lines); $i++) {
            $this->csvData[$i] = explode(',', $lines[$i]);
        }

        fclose($file);

        // Returns true if we managed to read data, false if we didn't.
        return (sizeof($this->csvData) > 0);
    }

    public function getHeadings() {
        if (sizeof($this->csvData) > 0) {
            // The first index of csvData has all the headings.
            return $this->csvData[0];
        }
        else {
            return null;
        }
    }

    public function pushToDatabase($con, $tableName, $columns) {
        $createColumnQuery = '';
        $insertQuery = 'INSERT INTO ' . $tableName . ' (';

        // Build column section of query.
        foreach ($columns as $column) {
            $createColumnQuery .= $column['name'] . ' ' . $column['type'] . ',';
        }

        // Remove trailing comma.
        $createColumnQuery = rtrim($createColumnQuery, ',');

        // Create table.
        $con->query('CREATE TABLE ' . $tableName . ' (' . $createColumnQuery . ')');

        // Create insert query template.
        foreach ($columns as $column) {
            $insertQuery .= $column['name'] . ',';
        }

        // Remove trailing comma.
        $insertQuery = rtrim($insertQuery, ',');

        // Insert values using our insertQuery string which looks like: "INSERT INTO <<table name>> (<<column 1>>, <<column 2>>"
        // Also skip the first line as that has the headings.
        for ($i = 1; $i < sizeof($this->csvData); $i++) {
            $values = '';

            foreach($this->csvData[$i] as $value) {
                $values .= '\'' . $value . '\',';
            }

            // Remove trailing comma.
            $values = rtrim($values, ',');
            $con->query($insertQuery . ') VALUES (' . $values . ')');
        }
    }
}

$csv = new CSVtoSQL('test.csv');
$csv->readDataIn();
var_dump($csv->getHeadings());
$con = new mysqli('127.0.0.1', 'root', '', 'testdb');
$columns = array(array('name'=>'col1', 'type'=>'VARCHAR(256)'),
                array('name'=>'col2', 'type'=>'VARCHAR(256)'),
                array('name'=>'col3', 'type'=>'VARCHAR(256)'));
$csv->pushToDatabase($con, 'test_table', $columns);
?>

创建CSVtoSQL类的新对象时,请通过CSV文件的路径(这可以是相对的或绝对的)。然后调用readDataIn()过程打开CSV,拉出行并将它们存储在对象中。然后,您可以选择通过调用getHeadings()来获取CSV中找到的标题数组。当您希望提示用户希望将每个CSV标题映射到的数据库列时,这对您很有用。最后,调用pushToDatabase()并提供MySQLi连接对象,表名和列数据,如图所示。

为您编写上传表单对我来说是微不足道的,但是这个课程应该有助于解决您的问题。

祝你好运!