【问题标题】:PHP CSV upload script, working with new lines?PHP CSV 上传脚本,使用新行?
【发布时间】:2012-08-01 10:36:43
【问题描述】:

我正在尝试将 CSV 导入 MySQL 数据库,其中每个新行应代表数据库中的一个新行。

这是我目前在 CSV 中的内容:

1one, 1two, 1three, 1four
2one, 2two, 2three, 2four

在应用程序中:

$handle = fopen($_FILES['filename']['tmp_name'], "r");
$data = fgetcsv($handle, 1000, ",");

$sql = "INSERT INTO tbl (col1, col2, col3, col4) VALUES (?, ?, ?, ?)";
$q = $c->prepare($sql);

$q->execute(array($data[0],$data[1],$data[2],$data[3]))

问题是只插入了前四个值,显然是由于缺少循环。

我可以想到两种解决方案:

1) 做一些“hacky” for 循环,记住索引的位置,然后对每个插入的数组值执行 n+1。

2) 意识到 fgetcsv 不是我需要的函数,还有更好的东西来处理新行!

谢谢!

【问题讨论】:

    标签: php mysql csv upload


    【解决方案1】:
    while ($data = fgetcsv($handle, 1000, ",")){
      //process each $data row
    }
    

    您可能还希望在 php.ini 中将 auto_detect_line_endings 设置为 true,以避免 Mac 创建的 CSV 出现问题。

    【讨论】:

      【解决方案2】:

      您为什么需要为此编写脚本?您可以在 1 个简单的查询中执行此操作:

      LOAD DATA LOCAL INFILE '/data/path/to/file.csv' INTO your_db.and_table
      FIELDS TERMINATED BY ', ' /* included the space here, bc there's one in your example*/
      LINES TERMINATED BY '\n' /* or, on windows box, probably by '\r\n'*/
      (`col1`, `col2`, `col3`, `col4`);
      

      仅此而已(在这种情况下,mysql 手册将提供更多可以指定的选项,例如OPITIONALLY ENCLOSED BY 等...)


      好的,就注入而言:在插入时 - 据我所知 - 不可能成为问题。数据绝不用于构建查询,MySQL 只是将其解析为 varchar 数据并插入数据(它不执行任何数据)。它进行的唯一操作是强制转换,如果需要,类型强制转换为 int 或 float。

      可能发生的情况是数据确实包含查询字符串,当您开始从表中选择数据时,这些查询字符串可能会造成损害。您可能可以设置您的 MySQL 服务器以转义此会话的某些字符,或者您可以在脚本中运行 str_replace('``','``',$allData); 或其他内容。
      底线是:我不完全确定,但总体而言,注射的风险应该很小。

      可以找到更多here

      当涉及到临时文件时,由于您使用的是$_FILES['filename']['tmp_name'],您可能希望使用自己的临时文件:file_put_contents('myLoadFile.csv',file_get_contents($_FILES['filename']['tmp_name']));,并在完成后删除该文件。很可能可以直接使用临时文件,但我没有尝试过,所以我不知道(今天也不打算尝试:-P)。

      【讨论】:

      • 谢谢,这是否适用于临时文件,例如我的示例,还是必须保存文件?此外,这将如何处理注入和坏字符,如“?
      猜你喜欢
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      相关资源
      最近更新 更多