【问题标题】:Best way to error catch LOAD DATA LOCAL INFILE?错误捕获 LOAD DATA LOCAL INFILE 的最佳方法?
【发布时间】:2012-05-18 02:26:02
【问题描述】:

我是一个 MySQL 新手,正在整理我的 webapp 的核心代码。该代码会导入一个 CSV 文件(本地),该文件由 FileMaker 生成和清理并保留。

鉴于这将很快投入生产(并且可能是一个低于 500mb 的数据库),我很想知道是否有更好的错误检查/捕获可以防止出现问题或提醒我的服务器设置。我已经阅读了有关临时日志等的内容,而我的 MySQL 管理还没有达到标准。

最基本的代码是:

$m = mysql_connect('localhost', 'mytable', 'mypassword');
$db = 'mydb';
mysql_select_db($db) or die("Import Error - Couldn't select database: " . mysql_error());

$sql = 'load data local infile "inventory.csv"
        into table ibl_account_details_temp fields terminated by ","
        optionally enclosed by "\""
        lines terminated by "\r"
        (store_id, SKU, account, item_number, brand, description, size, category, price, qty, fees)
        ';

echo mysql_query($sql) or die(myqsl_error());

PS 编辑:我也想知道这种导入方法是否对 SQL 注入开放?

【问题讨论】:

  • 我看不出通过执行LOAD DATA INFILE 会有什么一阶 SQL 注入的风险,因为 MySQL 没有执行 CSV 文件的内容,它只是将其解析为 CSV。当然,这并没有说明二阶攻击的风险,但只要每个接受输入的查询(包括来自查询结果的输入)都使用参数化,你就应该是安全的。出于这个原因(以及其他原因),您应该使用 mysqli 或 PDO 来访问 mysql 而不是 mysql_* 函数。
  • 我之前使用了一个简单的插入语句,而 fgetcsv 在我的 18mb 文件中内存不足。我无法解决它,并且主机在 128mb 的内存中达到了最大值,并且需要让它/保持它的工作。也就是说,我使用 PDO 的所有其他地方 ;-)
  • 哦,当然,我不反对使用LOAD DATA INFILE 导入CSV,这就是它的用途。

标签: php mysql csv


【解决方案1】:

不幸的是,加载数据 infile 的错误处理非常糟糕。我几乎每天都在使用它,将其导入某种临时表并使用 PHP 和 MySQL 的组合来验证导入的内容已成为简单的例程。有人可能会说这是额外的工作,但它确实具有让我完全控制什么是“错误”的优势。简单地说,我使用它来尽可能高效地获取原始数据,然后在 php 脚本中构建我的错误检查和验证规则。

【讨论】:

  • 感谢您的快速回复。我的错误检查是在 FileMaker 中进行的,它非常严格,所以我在那里感觉很安全。顺便说一句,这条路线是否存在 SQL 注入的可能性?
  • 我不知道你的数据来自哪里,所以不能肯定,但这通常是用户输入的问题,所以大概不是。然后它会回到您在 FileMaker 中进行的关于您的成品安全性的清理工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多