【问题标题】:Only 1 row of CSV to Mysql. Needs an array?只有 1 行 CSV 到 Mysql。需要数组吗?
【发布时间】:2022-11-10 23:32:01
【问题描述】:

我正在尝试将 csv 文件写入 Mysql 表。我已经让数据库接受 csv 文件的一行,但似乎无法弄清楚如何遍历表的每一行并将其全部写入数据库。我可以回显“修剪”列,它会在屏幕上打印所有数据。我假设我需要创建一个数组或一些循环来对数据库执行此操作,但只是无法弄清楚。

我正在尝试这样做,因此当用户登录时,它将运行此代码并更新/插入 csv 中的最新数据。很可能一天一次。

我是一个非常业余的人/知道足以成为危险的“编码器”,所以请原谅我的无知。

任何帮助将不胜感激。 以下是我到目前为止所拥有的...

$file = "../../inventory/dealer.csv";
        if (($handle = fopen("$file", "r")) !== FALSE) {
            while (($data = fgetcsv($handle, 1000)) !== FALSE) {
                foreach($data as $i => $content) {
                    $data[$i] = $conn->real_escape_string($content);
                }
                
                $stock = $data[14];
                $img = $data[13];
                $year = $data[3];
                $make = $data[4];
                $model = $data[6];
                $trim = $data[8];
                $url = $data[12];
                
                echo $data[8]."<br>"; // test only
                
                $sql = "INSERT INTO FT_Inventory (StockNumber, FirstImage, Year, Make, Model, Trim, DetailPageUrl)
                        VALUES ('$stock', '$img', '$year', '$make', '$model', '$trim', '$url')";
            }
            fclose($handle);
        }

【问题讨论】:

  • 你在哪里运行$sql?你对 SQL 注入持开放态度。摆脱real_escape_string,使用占位符,并将$data 绑定到执行,或者如果mysqli 则将其喷出...您也可能在没有PHP dev.mysql.com/doc/refman/8.0/en/load-data.html 的情况下执行此操作
  • 您忘记实际执行查询。但是,是的,这不是将数据批量加载到 mysql 中的最佳方式
  • @user3783243 SQL 注入?没有从外部来源提交的任何内容。除非 OP 将注入代码放在他自己的 CSV 文件中?
  • @user3783243 “外部来源”是任何人提交的东西。这里情况不同。没有任何迹象表明 dealer.csv 不是内部资源。如果dealer.csv 是用户上传的,那么您可能会有案例。即便如此,SQL 注入也不是那么简单。我假设您对 SQL 注入的了解来自销售“SQL 注入解决方案”的 Jackals。
  • @Misunderstood An "outside source" would be something submitted by anybody. That is not the case here...怎么会这样?你不知道文件来自哪里,或者谁填充了它,或者用了什么。治疗要安全得多全部输入作为潜在威胁。此外,即使这不是一个严重的威胁,此代码(以及您的答案中的版本)也可能容易受到简单、愚蠢的语法错误的影响,这些错误会破坏 SQL。参数化还可以防止该常见问题,因此值得为此而做。 real_escape_string 并没有抓住一切,而且已经过时了 20 年。

标签: php mysql


【解决方案1】:

在网络上进行更深入的研究后,我终于找到了一些可行的方法。我想我会把它上传到这里,以供将来希望做同样事情的人使用。谢谢大家的指导和帮助。

$file = fopen('../../inventory/dealer.csv', "r");
        fgetcsv($file);
        while(($column = fgetcsv($file, 1000, ",")) !== FALSE){
            $sql = "DELETE FROM FTInventory WHERE Trim != ''";
            $sql .= "INSERT INTO FTInventory (StockNumber, FirstImage, Year, Make, Model, Trim, DetailPageUrl)
                    VALUES('" . $column[14] . "', '" . $column[13] . "', '" . $column[3] . "', '" . $column[4] . "', '" . $column[6] . "', '" . $column[8] . "', '" . $column[12] . "')";
        
            $result->multi_query($conn, $sql);
            
        }

【讨论】:

    【解决方案2】:

    尝试这个:

    $file = "../../inventory/dealer.csv";
    if (($handle = fopen("$file", "r")) !== FALSE) {
      while (($data = fgetcsv($handle, 1000)) !== FALSE) {
        list(,,,$year,$make,,$model,,$trim,,,,$url,$img,$stock) = $data;
        sqli_query($conn,"INSERT INTO FT_Inventory (`StockNumber`,` FirstImage`,` Year`,` Make`,` Model`,` Trim`,`DetailPageUrl`)   VALUES('$stock', '$img', '$year', '$make', '$model', '$trim', '$url'))";
      }
    }
    

    笔记:list() 从数组中分配变量。
    PHP Manual: list()

    【讨论】:

    • @user3783243 那是你的小票吗?
    • 这不是一个小小的反对票。请查看您的代码的作用,它不如 OP 安全。您没有采取任何措施来防止 SQL 注入。请考虑您在回答和否决时所做的事情。浏览某人的回答/问题历史并对其进行投票几乎是小事的定义。
    猜你喜欢
    • 1970-01-01
    • 2016-06-07
    • 2016-03-29
    • 2021-12-10
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多