티스토리 뷰

뭔가 글 제목이 영어 남용이 된 기분이지만...컴공이 뭐 그렇지...



php, Apache 연동, postgresql 연동 뭐 이런것들은 나보다 더 잘 설명해주시는 블로그가 많당! 


구글링 해보면 금방 따라할수있으니까 나는 코드 위주로...




웹알못이 겨우겨우 검색해가며 시간에 쫓겨 후다닥 작성했을때는 제대로 이해하지 못했던 코드 다시 파헤쳐보기!!!!



먼저, csv파일을 postgresql Table에 insert 하고 싶을때는, postgresql 내에 내가 data를 insert 하고 싶은 Table이 생성 되어있어야 한다.


물론, csv 파일의 뭐 첫줄만 읽어서 CREATE문을 사용한다던가 해서 php 파일로 Table 생성도 가능하다.


그러나 난 안썼으니까.........(모르는척)



일단, 내가 넣고자 하는 csv파일(flight.csv)은



이런식으로 생겼다.


이런 CSV파일 같은 경우는 맨 윗줄에 attribute의 이름이 나타나 있기 때문에, 


CREATE문을 사용해서 Table 생성부터 시작하고 싶으면 그것도 가능할것이다.




난, 여기의 파일들을 하나의 테이블에 넣는게 아니라 두개의 테이블로 나눠서 넣을 것이다!!


To, Departure, Arrival, Passenger은 flightreser 라는 table에,


Price, Mile은 price_information 라는 table에,


나머지 FlightNumber, From, Date, Airline 은 두 테이블에 다 넣을 것이다.


 


먼저 코드!!!!!




";
 $result=pg_exec($conn,$sql);
 $result2=pg_exec($conn,$sql2);
 pg_close($conn);
 fclose($handle); 
 ?>



오....복잡복잡!!! ㅋㅋㅋ


처음부터 차근차근 따져보쟈



$db_host="host=localhost";
$db_port="port=5432";
$db_passwd="user=postgres password=postgres";
$db_name="dbname=assignment";
$conn=pg_connect("$db_host $db_port $db_passwd $db_name");

if(!$conn){
  echo "db connect fail:";
}


이 부분은 postgresql과 php파일을 연동해주는 부분이다!


별다른 설정을 해주지 않고 생성하면 아마 host는 전부 localhost, port는 5432일거니까


각자에 알맞게 user, password, dbname만 바꿔주면 된다.



내 postgresql에는 이런식으로 Database와 Table 7개가 생성되어있다.




$handle = fopen("flight.csv", "r"); 
$row = 1; 
$sql=false;
$sql2=false;
$index=0;
$sql = "INSERT INTO flightreserv VALUES "; 
$sql2 = "INSERT INTO price_information VALUES ";
 while (($data = fgetcsv($handle, 1000,",")) !== false) { 
    $num = count($data); 
	if($row !==1){
		$sql .= " (";
		$sql2 .= " (";
		$sql .= "'".$index."',";
		for ($c=0; $c < $num; $c++) { 
				if($c==7||$c==0||$c==1 || $c==3){
					$sql .= "'" . $data[$c] . "', "; 
					$sql2 .= "'" . $data[$c] . "', "; 
				}
				else if( $c==2 || $c==4 ||$c==5||$c==6){
				    $sql .= "'" . $data[$c] . "', ";
				} 
				else if($c==8||$c==9){
					$sql2 .= "'" . $data[$c] . "', ";
				}
			} 
			$sql[strlen($sql)-2] = ')';
			$sql2[strlen($sql2)-2] = ')';
			$sql .= ", "; 
			$sql2 .= ", "; 	
	}
	$row++;
	$index++;
 } 

 $sql[strlen($sql)-2] = ';';
 $sql2[strlen($sql2)-2] = ';';

그리고 이부분은, csv 파일을 열고 SQL문을 생성해주는 부분이다.


csv파일은 fopen 함수를 이용해서 열어준다. 


나는 "flight.csv" 파일을 열것이고, 저기 "r"은 Read만 하겠다는 뜻이다.


뭐 "r" 말고 다른걸 써도 되겠지만 csv파일을 읽어오기만 할 목적이라면 그냥 "r"만 써주면 된다.


$row는 0으로 지정해줘도 되고, 1로 지정해줘도 된다. 난 그냥 1로 지정했다. ㅋㅋㅋㅋ


그리고 대망의 sql문... 두둥!


sql은 flightreserv 테이블에 데이터를 넣을 sql문이고,


sql2는 price_information 테이블에 데이터를 넣을 sql문이다.


데이터는 fgetscsv 메소드를 이용해 읽어온다.


fgetscsv 메소드는 data를 배열형식으로 읽어온다. 


그러니까 즉, fgetscsv 메소드는 csv파일의 한줄씩 데이터를 읽어온다.



$handle : fopen 시에 선언한 csv파일 리소스.


1000 : 읽어들일 문자수 지정. 최대 1000이라는 말이다. 1000넘는 문자는 짤린다. 그렇지만 그럴일이...잘....


"," :  ,를 기준으로 읽는다.(csv파일은 , 로 구분되어있다)



방금 보면서 알았는데 난 구현하다가 하다가 쿼리문의 편의를 위해 sql문에 index를 추가하였다.


사실 index 들어간 테이블이 썩 바람직한 테이블은 아니라 쓰실려면 빼고쓰는게 좋겠다...!!(동공지진)



$row != 1일때만 loop를 도는 이유는 csv파일의 맨 첫줄은 데이터가 아니기 때문이다!


혹시 csv파일의 첫줄부터 데이터가 있다면 저부분은 빼버려도 좋다.



$num이란 $data, 즉, csv파일의 한줄을 나타내는것이기 때문에 이 csv파일 읽기에서 $num=10이 되겠다.


$num만큼씩 loop를 돌면서 sql문을 만들어준다. 


사실 저거 직접 구현하려면 눈 빠진다.


어려운건 아닌데 하나만 잘못되도.................


$sql[strlen($sql)-2] = ')';
			$sql2[strlen($sql2)-2] = ')';
			$sql .= ", "; 
			$sql2 .= ", "; 	


이부분은 loop를 다 돌고 난 후에 자료 하나 넣었다, 는 뜻으로 "), "를 넣어주는 것이다...


왤케 비효율적이게 생겼지...^^


웹알못에겐 이정도가 최선이었다....하하



그리고 쭉쭉 loop를 돌면서 sql문을 생성한다. 쭉쭉




$sql[strlen($sql)-2] = ';';
 $sql2[strlen($sql2)-2] = ';';
 echo "$sql
"; $result=pg_exec($conn,$sql); $result2=pg_exec($conn,$sql2); pg_close($conn); fclose($handle);


마지막, 모든 자료를 넣고 난 후에는 컴공의 핵심, 숨을 쉬어줘야지


두개의 sql문에 세미콜론을 마지막에 넣어주고 pg_exec 함수를 이용해 sql문을 실행시킨다.


그리고 확인을 위해 echo "$sql" 도 했었는데



실행시켜보면 sql문이 약 이런식으로 나온다...^^ 스크롤바만 봐도.....얼마만한지 알수있다..



자 과연 진짜 table에 데이터가 추가가 되었을까????





실행전엔 사진과같이 table에 아무런 data가 없는 것을 알 수 있다.


 


실행후에는,





짜잔


데이터가 꽉 들어갔다.. 스크롤바...^^


엄청난 양의 데이터를 넣는데 1초도 안걸린다. 한 1초쯤 걸렸을지도.




그리고 이렇게 넣은 데이터로 php에서 select 문 등을 사용해서 마음껏 사용하면 된다 호호호




sql loop돌리는데 눈알빠질뻔 한거랑, 중간에 괄호하나 잘못들어갔던거 때문에 한참 멘붕한것만 빼면


무난무난하게 따라할수 있는 것들이었다.. 사실 저것들이 젤 문제지만



다음엔 이제 본격 data사용 SELECT문 사용하기 해봐야징

댓글