2012-08-03 54 views
1

我试图将CSV导入到MySQL数据库中,其中每个新行应代表数据库中的新行。PHP CSV上传脚本,使用新行?

这里是我迄今为止在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)做一些“哈克”的循环,可以记忆索引的位置,那么n在每个插入确实+ 1数组值。

2)意识到fgetcsv不是我需要的函数,并且有更好的方法来处理新行!

谢谢!

回答

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']));,并删除该文件一旦你完成。很可能是直接使用临时文件,但我没有尝试过,所以我不知道(今天不打算试试:-P)。

+0

谢谢,这将工作与临时文件,就像我的例子,或有文件被保存?另外,这将如何处理注入和不好的字符,如“? – 2012-08-03 11:43:21

2
while ($data = fgetcsv($handle, 1000, ",")){ 
    //process each $data row 
} 

您也不妨设置auto_detect_line_endings为true在php.ini中,以避免问题与Mac创建的CSV。