【问题标题】:Validate Headers ON CSV & TXT验证 CSV 和 TXT 上的标头
【发布时间】:2014-11-04 16:38:21
【问题描述】:

我有一个基本的导入工具,我们正在使用它使用 PHP 将其上传到我们的数据库中。 这是一个示例脚本。 我的问题是如何在导入前验证标头?基本上检查一个值以确保正确的文件被导入。我在网上到处找,但似乎找不到答案 我的标题是

SKU、价格、有效

将数据 LOW_PRIORITY LOCAL INFILE '$file' 加载到表 sample.your_temp_table 由 ' ' 终止的字段中 可选地由 '\"' 包围 由 '\n' 终止的行忽略 1 行 //继续运行剩下的脚本

我的问题是如何在脚本运行之前验证标头? 我正在使用

$file = $_GET['file']; $file = urldecode ($file); //上传文件

【问题讨论】:

  • $_GET 值直接传递到您的查询是super bad idea。请绝对确定那是properly escaped
  • 我明白了。您会推荐什么更好的解决方案?
  • 逃避事物是更好的解决方案。更好的是:使用支持绑定到占位符的 PDO 等数据库层。

标签: php mysql validation


【解决方案1】:

我认为您需要阅读$file 的第一行并将其与一组标题列表进行比较:

$requiredHeaders = array('SKU', 'Price', 'Active'); //headers we expect

$f = fopen($file, 'r');
$firstLine = fgets($f); //get first line of csv file
fclose($f); // close file    

$foundHeaders = str_getcsv(trim($firstLine), ',', '"'); //parse to array

if ($foundHeaders !== $requiredHeaders) {
   echo 'Headers do not match: '.implode(', ', $foundHeaders);
   die();
}

//run import script…

【讨论】:

  • 感谢您的快速响应。我不确定 $f = fopen($file, 'r');剩下的我可以试试,我会告诉你的。
  • 值得注意的是,通过更多的编码,您可以使INSERT 语句适应存在的标头。
  • 如果您在标题X 和列x 之间有一个映射表,那么您可以识别存在哪些标题,确定您将插入哪些列,并进行适应性调整进口商。这样,如果列丢失或重新排序,您的 INSERT 仍然有效。
  • 在这种情况下,我没有直接插入,我使用的是临时表,而不是执行更新语句,因为它实际上是一次进入多个表。我有一个文件,它实际上是一个亚马逊文件,标题位于 4 行下方。阅读该行的最佳方法是什么?使用长度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 2019-03-13
  • 2014-10-19
  • 2015-09-09
  • 1970-01-01
相关资源
最近更新 更多