我正在尝试将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不是我需要的功能,并且有更好的处理新行!
谢谢!
答案 0 :(得分:2)
while ($data = fgetcsv($handle, 1000, ",")){
//process each $data row
}
您可能还希望在php.ini中将auto_detect_line_endings
设置为true,以避免Mac创建的CSV出现问题。
答案 1 :(得分: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']));
,并在完成后删除该文件。很可能是直接使用tempfile,但我没有尝试过,所以我不知道(今天不打算尝试:-P)。