2012-08-03 3 views
1

MySQL 데이터베이스로 가져온 CSV를 가져 오려고합니다. 각 새 줄은 데이터베이스의 새 행을 나타내야합니다. 여기 PHP CSV 업로드 스크립트, 줄 바꿈 기능 사용?

내가 지금까지 CSV에있는 것입니다 :

$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])) 

문제는 첫 번째 네 개의 값이 삽입되는 것을 , 분명히 인해 :

1one, 1two, 1three, 1four 
2one, 2two, 2three, 2four 

을 그리고 응용 프로그램에서 루프의 부족.

나는 두 가지 옵션을 생각할 수

는이 문제를 해결하려면 다음

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 형으로 캐스팅되거나 부동 형이어야합니다.

데이터가 테이블에서 데이터를 선택할 때 해를 끼칠 수있는 쿼리 문자열을 포함 할 수 있습니다. 이 세션에서 특정 문자를 이스케이프 처리하도록 MySQL 서버를 설정할 수도 있고, 스크립트에서 str_replace('``','``',$allData); 또는 뭔가를 실행할 수도 있습니다.
결론은 확실하지 않지만, 주사의 위험은 전반적으로 적어야합니다. 작업이 완료되면 file_put_contents('myLoadFile.csv',file_get_contents($_FILES['filename']['tmp_name']));, 해당 파일을 삭제 : 그것은 임시 파일에 관해서

좀 더 당신이 $_FILES['filename']['tmp_name']을 사용하고 있기 때문에, 당신이 당신의 자신의 임시 파일을 사용할 수 있습니다, here

을 찾을 수 있습니다 . 임시 파일을 직접 사용하는 것이 가능할 수도 있지만 시도하지는 않았으므로 (그리고 오늘 시도하지 않을 것입니다 : -P).

+0

감사합니다. 내 예제와 같은 임시 파일로 작업할까요, 아니면 파일을 저장해야합니까? 또한, 어떻게이 주입과 나쁜 문자를 처리 할 것인가? –

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

은 또한 맥이 CSV를 만들어 문제를 방지하기 위해 php.ini 파일에서 true로 auto_detect_line_endings을 설정하실 수 있습니다.