【发布时间】: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,这就是它的用途。