PHP - 上传 CSV、插入到多个表并在其他地方显示

标签 php html mysql arrays csv

我正在尝试将一些流程的各个点连接起来。我有一个项目,需要每天通过网页上的表单上传 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/

相关文章:

javascript - (node)js 中的 'associative array' 数组

javascript - 推荐 joomla html 编辑器扩展/软件

javascript - 图像将整个 body 向右移动

mysql - 查询找到玩得最多的敌人

C# - 使用 session 变量将用户 ID 从选定的 GridView 列传递到另一个页面

php - 在最后一行插入值

php - curl ,跟随位置但只获取新位置的标题?

php - 在循环中插入数据并仅回显一次

php - 在抽象函数中将参数设为可选

html - 如何使用 react Hook 制作点状进度指示器组件?