2013-01-25 4 views
1

CSV 파일을 데이터베이스로 가져 오는 작업을하고 있으며 여러 단계로 진행됩니다.PHP CSV 가져 오기 질문

  • 1 단계 : 사용자가 CSV 파일을 업로드

    은 다음 단계입니다.

  • 2 단계 : 사용자가 데이터를 데이터 형식에 연결합니다. 예를 들어, CSV의 레코드에 John,Doe,[email protected] 데이터가 포함되어있는 경우 사용자는 드롭 다운 상자에서 firstname을 선택하여 데이터 값 John에 연결하는 드롭 다운 상자의 성을 데이터 값 Doe에 연결하고 전자 메일 주소를 드롭 다운 상자가 데이터 값 [email protected]에 동료
  • 3 단계 : 데이터베이스에 데이터를 삽입이

내 질문은 다음과 같습니다

1/3 단계에, 나는에있는 것 내 소유물은 사용자가 선택한 컬럼과 원본 데이터입니다.

$data = array(
0 => array('John','Doe','[email protected]'), 
1 => array('Foo','Bar','[email protected]') 
); 

그리고 여기에 무엇을 내 열을 2 단계에서 선택하는 모양입니다 :

$columns = array('firstname','lastname','emailaddress') 

가 어떻게 할 수있는 SQL 쿼리를 만들려면 어떻게해야합니까 여기

는 원본 데이터가 모습입니다

INSERT into contacts (id,firstname,lastname,emailaddress) values (null,'John','Doe','[email protected]')

당신이 볼 수 있듯이 : 다음은 등 , sql 쿼리에는 배열 내에있는 순서대로 선택한 열이 있고 그 다음에 값이 있습니다. 열 순서대로 데이터를 선택했기 때문에 데이터가 올바른 순서로 있고 해당 위치의 특정 열과 연결되어 있다고 가정 할 수 있습니다 (예를 들어 데이터 값 ' John '은 columns 배열의 첫 번째 위치와 연관되어 있으며, 그 반대도 마찬가지입니다.

2./나는 사용자가 파일의 초기 업로드를 할 때 잠재적으로 빈 필드가있는 첫 번째 레코드가 포함 된 csv 파일을 보낼 수 있다고 생각했습니다. 문제는 사용자가 csv 레코드 내의 열 수를 기반으로 데이터에 연결할 열의 수를 결정하는 것입니다. 이 경우 두 개의 열이 있고 모든 후속 레코드에는 세 개의 열이 있습니다. 글쎄, 정확한 열 개수를 결정하기 위해 전체 레코드 집합을 반복하지 않을 것입니다. 이 문제를 어떻게 해결합니까? 어떤 아이디어?

편집

내가 CSV 파일의 구문 분석에 2 질문에 대한 답을 알아 낸 생각, 나는 각 레코드와 구문 분석의 마지막에 가장 높은 수의 수를 얻을 수있는 것은 내 수입니다. 그래? 그게 어떤 문제 야?

+1

두 번째 질문에 대해서는 언급하지 않았지만 해결 방법은 나와 함께 갈 것입니다. 가짜 코드 : if numFieldsCurrLine> maxFieldsSeen then maxFieldsSeen = numFieldsCurrLine; –

답변

1

CSV 파일의 데이터를 구문 분석하려면 fgetcsv를 확인하십시오. http://php.net/manual/en/function.fgetcsv.php

파일에서 한 줄을로드하고 CSV 필드의 배열을 반환합니다.

$data = array(); 
while (($lineFields = fgetcsv($handle)) !== false) { 
    $data[] = $lineFields; 
} 

여기서는 PHP5를 사용 중이며 $ handle로 파일을 열었다 고 가정합니다. PHP4에서 fgetcsv는 라인의 최대 길이를 읽을 두 번째 매개 변수가 필요합니다.쿼리에 대한

:

$sql = "INSERT into contacts (id," + implode(',', $columns) + ") values"; 

내가 값을 후 아무것도 포함하고 있지 않다. SQL 인젝션을 방지하기 위해 준비된 문을 작성해야합니다. 또한 MySQL을 사용하는 경우 id는 자동 증가 필드 여야하며 삽입에서 생략해야합니다 (MySQL이 생성하도록 함). Postgres를 사용하고 있다면, id 필드에 대한 순서를 만들어야합니다. 어쨌든 데이터베이스에서 ID를 생성하도록하십시오.

+0

답변과 의견을 보내 주셔서 감사합니다. 정확하게 내가 찾고 있던 것이 었습니다. – jkushner