我尝试做的是上传产品CSV并获取标题并创建一个映射工具,允许用户将CSV标头与需要导入的字段进行匹配。我认为我需要获取列值而不是行值。
Mailchimp目前拥有非常酷的功能,因为我确信电子邮件营销中的所有其他大牌玩家都可以。导入后,系统会列出每个列名称,并允许用户选择将其映射到内置列的内容。
我研究了几种不同的预先存在的解决方案,这些解决方案似乎都是错误的,我只需要创建自己的自定义解决方案。
我目前正在使用PHP / MySQL。任何帮助或建议将不胜感激!
答案 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连接对象,表名和列数据,如图所示。
为您编写上传表单对我来说是微不足道的,但是这个课程应该有助于解决您的问题。
祝你好运!