웹마스터 팁

음...생초짜지만 업무데이터 관리를 위해 계정에 페이지를 만들다보니....
기본에 가지고있던 3000건 정도의 데이터를 입력하고 다시 디비를 수정하고 입력하는 작업이 필요했습니다.
그런데 일반 계정을 주는 싸이트에서 phpmyadmin을 사용해 텍스트파일로부터 데이터 입력을
보안관계로 막놓는 바람에 입력이 용의하지 않게 돼었지요. 여러모로 방법을 찾다 재미있는걸 찾아서
한글자 끄적여 봅니다...^^;;

우선 함수 사용에 앞서서 이방법은 phpmyadmin에서 사용하는 csv 파일을 디비로 입력하는걸
직접 코딩해서 사용하는 방법입니다. 일반적으로 엑셀이나 my_sql, access 에서는 csv형식으로
내보내기를 지원하며 입력역시 상당히 간편해서 좋더군요.

우선 사용되는 함수(몇개없지만) 소개합니다.
fopen("파일명", "모드") 입니다. 파일은 계정에 업로드한상태여야하며(혹은 직접 절대경로입력) 모드는
다음과 같이 나눠집니다.

  r        읽기전용
  r+      읽기, 쓰기
  w      쓰기전용, 존재하는 파일을 덮어쓰며 파일이 존재하지 않은면 생성합니다.
  w+     일기, 쓰기. 파일이 존재하지 않으면 생성합니다.
  a       붙여쓰기. 파일의 마지막 지점에 쓰여지머, 파일이 존재하지 않으면 생성합니다.
  a+      일기, 붙여쓰기. 파일의 마지막 지점에 쓰여지며, 파일이 존재하지 않으면 생성합니다.

음..... 좀되는군요. 이정도 있지만 디비입력에서는 거의 r 만사용하지요..^^

같이 쓰이는 함수로
fgetcsv("파일포인터, "길이", "구분자")  입니다. 일반적으로 구분자는 콤마( , )가 주로 사용되고 있지요.
파일포인터는 fopen()으로 지정하며, 길이는 문자수가아니고 줄수이지요.


사용해 보도록하지요. 우선 데이터를 csv형식으로 저장합니다. 그리고 계정에 업로드하지요.
같은 폴더에 파일을 두개 만듭니다.

첫번째 파일은 그냥 폼입니다. 버튼하나 달랑있는....=_=;;;;;

<html>

<head><title>파일입력</title></head>

<body>
<form name="form" action="csvinput.php">
<p>data.csv의 내용을 db에 저장합니다</p>
<input type="submit" value="입력시작">
</form>
</body>
</html>

이상으로 버튼하나 만들었습니다..=_=;;;
참고로 버튼위세 <input type="text" name="filename"> 를 사용해서 파일이름을 직접입력할수도 있지요.
그런데 파일과 디비마다 형식과 데이터가 다른관계로 그렇게 필요를 느끼지는 못했습니다..=_=;;


이제 입력부분을 담당할 csvinput.php파일을 작성해보도록하지요.

<?


$db=mysql_connect("localhost","계정아이디","계정패스워드");
mysql_select_db("디비네임",$db);

function csvupdate() {

global $db;

$fp=fopen("data.csv", "r"); // 읽기전용으로 파일을 열라고 형식을 입력하지요.

while($data=fgetcsv($fp, 3800, ",")) {
             //3800줄을 차례로 읽어서 데이터를 한줄단위로 긁어옵니다.
             //저장형식은 배열로 저장됩니다. 구분자는 콤마

$title=trim($data[0]);
$number=trim($data[1]);
$code=trim($data[2]);
    //언제나 그렇듯 배열은 시작은 '0' 이구요.
    //한줄에 있는 데이터를 긁어서 내용을 그대로 가져오지요.
    //긁어온 데이터를 각각의 변수에 저장합니다 구분하기 쉽게..=_=;;;
    //trim(); 은 아시죠 양쪽에 공백제거...=_=;;

mysql_query("insert into 테이블명 (title, number, code) values ('$title', '$number', $code')") or die(myslq_error());

   //시험삼에 3개의 데이터를 디비 한줄에 입력했지요. 만약에 부분입력이라면 아래와 같이 하지요.
$tmp=myslq_query("select * from 테이블명 where code='$code'", $db);
$temp=mysql_fetch_array($tmp);
$temp[code]=(int)$temp[code]; //값의 비교를 위해서 숫자형태로 바꾼거지요.

if($temp[code] == 0) {
      mysql_query("insert into 테이블명 (title, number, code) values ('$title', '$number', $code')") or die(myslq_error());
      echo ("<font color='red'>$code 와 일치하는 데이터가 없어서 $title 을 신규데이터로 입력합니다.<br></font>");
      //화면에 머 보이는게 있어야 작업상태를 알겠지요..=_=a
      //수정할려는데 없는자료니 빨간색으로 눈에 띄네~

} else {
      mysql_query("update 테이블명 set title='$title, number='$number' where code='$code'") or die (mysql_error());
      echo (" $code의 데이터를 $title 로 수정합니다.");
       //역시 머가보여야 어떻게 됐다는게 나오지요..=_=;;;
}

//우선 코드를 읽어들어서 해당코드가 있는가를 알아봤구요 없으면 새로입력하고 있으면 수정합니다..^^

} // while 문의 괄호는 여기까지.

} // 펑션은 여기까지


portupdate();

?>


실지로 3천건정도 입력하니 대략 1분30초~2분 가량 걸리더군요..=_=;;
저처럼 텍스트입력을 제한하는 싸이트에서 계정쓰시면서 다른곳의 자료를 끍어와야하시는분들은
구미에 맞게 만들어서 사용하면 편할건 같군요...
아참 실험에 사용할 csv 파일이 있어야하는군요. 다음과 같이 하지요.

data.csv    // 파일명입니다..=_=/

//이제부터 내용입니다..=_=;;

압정갯수,12000,1
클립갯수,24000,2
그냥한번,1,3
이게머게,3200,4

//이상 4줄으로 하지마.....귀차니즘이.....=_=;;
한번에 대량의 자료를 업데이트해야할경우 전 유용하게 썼습니다.
재가 입사한곳에선 자료를 엑셀파일로 5개파일에 저장하더라구요.
통합을 만들기도 힘들고 검색도 오래걸려서 웹상에 디비를 만들고 어디서든 볼수있게 페이지를 만들다가
하필이면 보안이라며 외부입력을 막아놓은 곳에 계정을 따서(싸니까 걍쓰는..=_=;;;)
이렇게 노가다했지만....단순 텍스트입력보다 검색해서 조건별로 입력이 가능하니까
상당히 유용하더군요. 입력해놓고 대량자료 수정및 업데이트에서 유용하게 사용했습니다.



그럼이만 물러가옵니다..=_=;;;
제가 만든페이지는 보안상 가르쳐드릴수가 없군요.
회사 데이터 누출이 심각한 문제를 야기할수도..=_=;;
틀린곳이 있으면 테클부탁드립니다..=_=/

참 만약에 자료내에 콤마를 쓰는 (환률) 데이터 같은경우 2,000 이런자료 같은경우 다음과 같습니다.
과자,"2,500",2003-12-30,소비    // 이렇게 ""로 묶어주면
다음과 같은 결과가 나오지요.
$data[0] => 과자
$data[1] => 2,500
$data[2] => 2003-12-30
$data[3] => 소비
참고사항이었습니다..=_=/

즐거운 한해 보내세요..=_=/   (일년동안 할인사 모두한거임...=_=a;;;)