我正在尝试将一些流程的各个点连接起来。我有一个项目,需要每天通过网页上的表单上传 CSV,该表单已经存在。每次加载 CSV 时,需要将 110 列拆分为大约 5 个不同的 MySQL 表。 CSV 将始终采用相同的顺序,但我需要确切地知道 CSV 中的哪些变量/列要放入特定的表和字段中。完成此操作后,我将需要仅通过查询在其他页面上显示数据(根据页面的不同,只会显示某些内容)。我有以下代码来测试将 CSV 放入数组中:
if(isset($_POST['submit']))
{
$array = $fields = array(); $i=0;
$file = $_FILES['file']['tmp_name'];
$handle = fopen($file, "r");
if($handle){
while (($row = fgetcsv($handle, 4096)) !== false) {
if (empty($fields)) {
$fields = $row;
continue;
}
foreach ($row as $k=>$value) {
$array[$i][$fields[$k]] = $value;
}
$i++;
}
echo "Success!";
var_dump($array);
if (!feof($handle)) {
echo "Error: unexpected fgets() fail\n";
}
fclose($handle);
}}?>
这似乎与 Var_dump 配合得很好。然后,我在一个只有十个字段的小型 CSV 上分别使用了以下代码:
while(($filesop = fgetcsv($handle, 4096, ",")) !== false)
{
$one = $filesop[0];
$two = $filesop[1];
$three = $filesop[2];
$four = $filesop[3];
$five = $filesop[4];
$six = $filesop[5];
$seven = $filesop[6];
$eight = $filesop[7];
$nine = $filesop[8];
$ten = $filesop[9];
$sql = "INSERT INTO staging (One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten) VALUES ('$one','$two', '$three','$four','$five','$six','$seven','$eight','$nine','$ten')";
}
if ($connect->query($sql) === TRUE) {
echo "You database has imported successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
我仍然很困惑如何将这些每日上传的 CSV 的 110 个字段映射到正确的表(10 个字段映射到一个表,25 个字段映射到另一个表,30 个字段映射到另一个表,等等),以便我可以使用变量在其他页面上显示某些字段。
更新:
数组的新代码:
$table_cols[5] ="workOrderNum,lowSideMIUNum,highSideMIUNum,accountNum,custName,address,locID,utility,serialNumber,serviceName";
$tablenames = array("staging","clients","meters","tests","costs","workorders");
for($tableno = 0;$tableno < sizeof($tablenames);$tableno++){
$q = "";
$q .= "INSERT INTO ".$tablenames[$tableno]." (".$table_cols[$tableno].") VALUES (";
$cols = explode("," ,$table_cols);
$data = array();
foreach($col as $key => $fldname) {
$data[] = "'".$coldata[$fldname]."'";
}
$q .= implode(",",$data).");";
}
echo'File submitted';
最佳答案
请参阅下面的更新 这部分答案留给上下文
您可以创建一个数组,其中包含要保存在每个表中的列的索引。然后为每个表运行一次插入,根据该表的数组中的索引获取列值。
$tbl1_idxs = array(1,4,10,20,15,22);
$tbl2_idxs = array(2,9,1,7,32,44);
$tbl3_idxs = array(27,15,65,110,12);
$q1 = "";
$q1 .= "INSERT INTO `Table1` (`fld1`,`fld2`,`fld3`,`fld4`,`fld5`,`fld6`) ";
$q1 .= "VALUES ('";
$q1 .= $filesop[tbl1_idxs[0]]."','";
$q1 .= $filesop[tbl1_idxs[1]]."','";
$q1 .= $filesop[tbl1_idxs[2]]."','";
$q1 .= $filesop[tbl1_idxs[3]]."','";
$q1 .= $filesop[tbl1_idxs[4]]."','";
$q1 .= $filesop[tbl1_idxs[5]]."');";
// Execute query #1....
$q2 = "";
$q2 .= "INSERT INTO `Table2` (`fld1`,`fld2`,`fld3`,`fld4`,`fld5`,`fld6`) ";
$q2 .= "VALUES ('";
$q2 .= $filesop[tbl2_idxs[0]]."','";
$q2 .= $filesop[tbl2_idxs[1]]."','";
$q2 .= $filesop[tbl2_idxs[2]]."','";
$q2 .= $filesop[tbl2_idxs[3]]."','";
$q2 .= $filesop[tbl2_idxs[4]]."','";
$q2 .= $filesop[tbl2_idxs[5]]."');";
// Execute query #2....
$q3 = "";
$q3 .= "INSERT INTO `Table3` (`fld1`,`fld2`,`fld3`,`fld4`,`fld5`,`fld6`) ";
$q3 .= "VALUES ('";
$q3 .= $filesop[tbl3_idxs[0]]."','";
$q3 .= $filesop[tbl3_idxs[1]]."','";
$q3 .= $filesop[tbl3_idxs[2]]."','";
$q3 .= $filesop[tbl3_idxs[3]]."','";
$q3 .= $filesop[tbl3_idxs[4]]."','";
$q3 .= $filesop[tbl3_idxs[5]]."');";
// Execute query #3....
更新答案
对于这么多列,我将改为按列名称进行映射。有几种方法可以使其变得易于管理。
无论如何,我不会将 CSV 的每一列的硬变量名称放在关联数组中,而是将它们放在关联数组中,并且键与表的列名称相匹配。然后,您可以为每个表提供一个以逗号分隔的列列表。
您仍然需要 203 行代码来将 CSV 字段映射到名称,但维护哪个列进入哪个表至少是可读的。更改将每个 CSV 列分配给变量的现有代码应该是简单的正则表达式搜索和替换。
$coldata = array();
$coldata['name'] = $filesop[0];
$coldata['addr1'] = $filesop[1];
$coldata['addr2'] = $filesop[2];
$coldata['city'] = $filesop[3];
$coldata['state'] = $filesop[4];
$coldata['zip'] = $filesop[5];
$coldata['country'] = $filesop[6];
$coldata['gender'] = $filesop[7];
$coldata['age'] = $filesop[8];
$coldata['birthdate'] = $filesop[9];
$table_cols = array();
$table_cols[0] = "name,gender,age";
$table_cols[1] = "name,addr1,addr2,city,state,zip";
$table_cols[2] = "name,age,birthdate";
$tablenames = array("staging","info","other");
for($tableno = 0;$tableno < sizeof($tablenames);$tableno++) {
$q = "";
$q .= "INSERT INTO ".$tablenames[$tableno]." (".$table_cols[$tableno].") VALUES (";
$cols = explode(",",$table_cols[$tableno]);
$data = array();
foreach($col as $key => $fldname) {
$data[] = "'".$coldata[$fldname]."'";
}
$q .= implode(",",$data).");";
// Execute query in $q
}
关于PHP - 上传 CSV、插入到多个表并在其他地方显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42447272/