【问题标题】:How can I get different rows into tables from a CSV file?如何从 CSV 文件中将不同的行放入表中?
【发布时间】:2020-07-23 09:54:53
【问题描述】:

我想将我的 csv 上传文件的第 1 行放入表 tab1........ 并将第 2 行放入表 tab2

我试过了:

$myid = 231;
if (isset($_POST["submit"])) {
    $file = $_FILES['file']['tmp_name'];
    if (($handle = fopen($file, "r")) !== FALSE) {
        $row = 0;
        while (($data = fgetcsv($handle, 100000, ",")) !== FALSE) {
            if ($row == 1) {
                $row++;
                continue;
            }
            $row++;
            foreach (['tab1', 'tab2'] as $table) {
                $stmt = $pdo->prepare("UPDATE $table SET fname=?, lname=? WHERE id=?");
                $stmt->execute([$data[0], $data[1], $myid]);
            }
        }
        fclose($handle);
    }
}

【问题讨论】:

  • 在您的代码中什么不起作用?你有错误吗?您是否尝试过打印您创建的语句?对吗?
  • 是的,错误是两个表都只获取了csv的最后一个文件
  • 倒数最后一行。
  • if ($row == 1) .... $row 递增后,在下一个循环中再次递增,这是你认为应该做的吗?
  • 是的,每次只能插入一行@Luuk

标签: php mysql csv


【解决方案1】:

问题是因为每次在 while 循环周围插入表的 foreach 循环都会插入两个表。如果 $row==1 并且 tab2 是 $row==2,您只想插入 tab1。试试这个(未经测试):

$myid = 231;
if (isset($_POST["submit"])) {
    $file = $_FILES['file']['tmp_name'];
    if (($handle = fopen($file, "r")) !== FALSE) {
        $row = 0;
        $tables = ['tab1', 'tab2'];

        while (($data = fgetcsv($handle)) !== FALSE && $row<3) {
            if ($row > 0) {
              $stmt = $pdo->prepare("UPDATE ".$tables[$row-1]." SET fname=?, lname=? WHERE id=?");
              $stmt->execute([$data[0], $data[1], $myid]);
            }
            $row++;
        }
        fclose($handle);
    }
}

我创建了一个包含 2 个表的数组,然后根据行号更新相关表。

当我们达到 2 行时,我还添加了一个中断,以防 CSV 的行数超出您的预期。

【讨论】:

  • 是的,这很好用...谢谢...但是如果我有更多的表怎么办?如果我在表数组中添加一个表,这仍然有效吗?
  • 假设您的意思是第 3 行将进入表 3,那么是的,将表添加到数组并将 while 循环更改为 $row
猜你喜欢
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 2019-06-09
  • 2015-02-03
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 2017-06-24
相关资源
最近更新 更多