PHP & Others

엑셀 파일을 업로드 해서 MYSQL에 밀어 넣는 소스

페이지 정보

본문

손님들이 엑셀로 정리한 파일들을 디비에 밀어 넣으려구 노가다(울트라 에딧으로 파인드엔 리플레이스... ㅠ.ㅠ)작업을 하다가 도저히 이래선 안되겠다 싶어서 php스쿨에 와봤지만 따른 초절정 고수님의 귀뜸만 보일뿐 정확한 방법이 안보여서 직접 제작한뒤 올려 봅니다.

고수님들이 보시기엔 별거 아니겠지만... 초보분들껜 좀 도움이 되지 않을까 싶어서..

우선 엑셀을 CSV파일로 저장해야 하고요.. 저장시엔 규격에 맞게 하는건 당연히 아실테고.. 저장된 CSV파일과 저장될 테이블 명을 넣고 전송 버튼을 누르면 서버에 파일을 임시로 올린뒤 읽어 들여서 디비에 저장한뒤 올린 CSV파일을 지우는 방식입니다.

엑셀에 맨 첫줄은 컬럼명이 들어 가는 줄이므로 꼭 컬럼명을 정확히 적어서 올려 주시면 됩니다.

그리고 맨 마지막 컬럼엔 빈칸이 있으면 콤마 카운트가 잘못되서리.. 에러가 납니다. 모든데이타가 다 들어 있는 열을 맨 마지막 열로 설정하시길 바랍니다.

그럼 조금이라도 유용하게 쓰이길 바라겠습니다. (--)(__)(--)


<?php
/*
이 코드는 mysql테이블이 이미 설정되 있을경우 엑셀로 정리한 데이터를 쉽게 넣을수 있게 만든 코드 입니다.

접속함수는 각자 서버 환경에 맞게 설정하시고 Database 이름엔 이미 생성된 삽입할 테이블 이름을 정확히 넣어 주셔야 합니다.

엑셀 파일에서 전체 데이터를 선택하신뒤 Ctl + F버튼을 눌러 , (콤마) 를 찾습니다. (,를 기준으로 나누기 때문에 기존 데이터에 , 가
있으면 배열에 갯수가 안맞아서 에러가 납니다) 다른 부호나 빈 공간으로 Replace 하시기 바랍니다.

엑셀파일은 이미 생성된 테이블의 규격에 맞게 정보를 정리 하신뒤(특히 날짜 07/15/05 등은... 2005-07-05등으로 정확히 넣어 주셔야 합니다.)

맨 첫째 줄은 필드의 이름을 정확히 넣으셔야 합니다. (예: 필드가 c_id, c_name, c_dob, c_addr1, c_addr2 처럼 5개일경우라도
원하시는 필드 2개만 필요하시면 컬럼 두개만 작성하셔도 무방합니다. 나머지는 NULL로 되어도 괜찮을떈 NULL로 입력 됩니다.)

마지막으로 제일 중요한건 맨 마지막 컬럼은 빈칸이 있으면 안됩니다. (콤마 숫자를 잘못세서 배열 갯수가 헷갈려 에러가 날수가 있습니다.)
모든 데이타가 다 들어가는 열을 맨 오른쪽으로 엑셀에서 옮기시기 바랍니다.

별거 아닌 코딩이므로 자유롭게 배포 하셔도 좋습니다.

허접합니다. 초보 분들께 조금이나 도움이 되기를... --;;;; kero(kennethjro@msn.com) */

require_once('Connections/csv.php'); // mysql 접속 함수와 장소는 각자 맞게 설정

if($_POST['dbName']) { //함수 db_name이 넘어 오면 실행 시킨다.

copy($csvFile,"copy.csv"); //csv 파일을 현재 디렉토리에 저장 시킨다

$csvLoad = file("copy.csv"); // 저장된 파일을 읽어 들인다

$csvArray = split("\n",implode($csvLoad)); // 행으로 나누어서 배열에 저장


for($i=1;$i<count($csvArray)-1;$i++) { // 행으로 나눠진 배열 갯수 만큼 돌린다($enter[0]에는 필드 이름이 있으므로 $i는 1번 부터 시작하고 총 갯수는 $csvArray에서 1를 뺀다

$field = split(",",addslashes($csvArray[$i])); //각 행을 콤마를 기준으로 각 필드에 나누고 DB입력시 에러가 없게 하기위해서 addslashes함수를 이용해 \를 붙인다

$value = "'" . trim(implode("','",$field)) . "'"; //나누어진 각 필드에 앞뒤에 공백을 뺸뒤 ''따옴표를 붙이고 ,콤마로 나눠서 한줄로 만든다.

$insertSQL = sprintf("INSERT INTO %s (%s) VALUES (%s)", $_POST['dbName'], $csvArray[0], $value); // php쿼리문을 이용해서 입력한다.

mysql_select_db($database_csv, $csv); //$database_csv 와 $csv 함수는 각자 맞게 설정
$Result = mysql_query($insertSQL, $csv) or die(mysql_error()); //$csv 함수는 각자 맞게 설정
}

unlink("copy.csv"); //입력이 된후 업로드된 파일을 삭제한다

if($Result) {
echo("<script>window.alert('New DB add!')</script>"); // 업로드가 성공적으로 되었으면 경고창을 띄워서 알려준다.
}
}
?>
<html>
<head>
<title>CSV File to MySQL</title>
</head>

<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data" name="form1">
<table width="200" border="0" cellpadding="5" cellspacing="0">
<tr>
<td>Database Name<br><input name="dbName" type="text" id="dbName"></td>
</tr>
<tr>
<td>CSV file<br><input name="csvFile" type="file" id="csvFile"></td>
</tr>
<tr>
<td><input type="submit" name="Submit" value="Submit"></td>
</tr>
</table>
</form>
</body>
</html>
 

[출처] 엑셀 파일을 업로드 해서 MYSQL에 밀어 넣는 소스|작성자 나무실

----------------------------------------------------------------------------------

프로그램 입니다. 저도 초보시절 고민 많이 했어요. 그래서 그때 만들어 사용하던 프로그램입니다. 좀 허술하지만 --- 이런식으로 넣고 있습니다.

<?
//file_up.php  =======================================//
##########################################################################
##  text화일을 붙여넣을수 있는 폼 구성화일 file_up.php과 db_convert.php 2개로 구성
##########################################################################

$Member_list = \"member_list.txt\";    //만들어질 text화일  -- 폴더에 쓰기 퍼미션 가능하도록 해야 한다.

if($Mode == Write) {
if(file_exists($Member_list)){
$fp=fopen($Member_list,\"r\");
$Member_list_Write=fread($fp,1000);
fclose($fp);
}
$contents = stripslashes($contents);
$Member_list_Write=$contents;
$fp=fopen($Member_list,\"w\");
fwrite($fp,$Member_list_Write);
fclose($fp);
}
?>

<html>
<head>
<title>전체 환경설정</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=euc-kr\">
</head>
<body>
<table width=\"100%\" border=\"1\" cellspacing=\"0\" cellpadding=\"1\" bordercolorlight=\"#7CA482\" bordercolordark=\"#FFFFFF\">
  <form action=\"<?echo\"$PHP_SELF?Mode=Write\";?>\" method=post>
  <tr bgcolor=\"#E5EFE7\" align=\"center\" height=30>
  <td><font size=2><b>회원리스트 </b></font></td>
  </tr>
  <tr>
  <td align=center>
<textarea name=\"contents\" rows=\"30\">
<?    // textarea에 영역지정 excel내용을 그냥 복사해서 넣는다.
if(file_exists($Member_list)){
include\"$Member_list\";
}
?>
</textarea>
<br>
<input type=\"submit\">
  </td>
  </tr>
  </form>
</table>
</body>
</html>



//db_convert.php =====================//

##########################################################################
##  저장한 화일을 DB에 변환하는 프로그램.
##########################################################################
// 글 입력 폼 //////////////////////////////////////////////////////////////////
include(\'dbconfig.inc.php\');

if ($action==\'convert\') {
function conv_chk(){
if(document.conv.comp.value == \"\" ) {
        document.conv.comp.focus();
            alert(\"회사명을 입력하세요\");
            return false;
        }
}

$name2=file(\"member_list.txt\"); //저장한 화일읽기
$name_n= count($name2); //줄수계산
$xid=mysql_Result($result, 0, \"id\"); //기존 DB의 최종 ID 번호를 읽어온다
?>

<form name=conv action=<?=$PHP_SELF?>? method=post onSubmit=\'return conv_chk()\'>
<input type=hidden name=action value=convert>
작업중: <?=$sql_ok?>                    <!--현재 작업을 확인하기위해--->
회사코드: <input type=text name=c_code size=10> <!--지금입력하는 DB가 어느 소속인지 지정코드 입력받기 --->
저장: <input type=radio name=sql_ok value=1>      <!--화면으로 확인먼저 할건지  DB입력할건지 가끔은 에러를 내는 경우가 있어서 화면 확인 모드 만들었음-->
삭제: <input type=radio name=sql_ok value=2> <!--잘못 입력 했을경우 코드 입력받아 선택적으로 지울 수 있게하기위해 --->
<input type=submit value=등록하기 name=submit>
</form>

<a href=\"file_up.php\" target=_mem>화일리스트 입력</a><br>

* EXCEL 화일을 선택한 후 복사해서 여기에 붙여넣으세요. 화면을 확인 후 저장 선택.

<?
if($sql_ok==2) { //잘못 입력된 화일이면 삭제하기
if($c_code) {
$sql0 = \"delete from $member where comp =\'$c_code\' \";
mysql_query ($sql0);
} else {
print\" <li>회사코드를 넣으세요\";
}
}

//  입력 루틴 시작 입력된 만큼 반복하기위해...

for ($im=0;$im < $name_n;$im++){
$m = $im+$xid+1; // 최종번호 읽어온것과 입력되는 값에서 카운트 계산하기.  일련번호 필요없을경우 없어도 됨.
$tname=chop($name2[$im]); //선택한 줄 읽기
$convert = explode(\" \",$tname);    //EXCEL을 tab 으로 구분해서 지정 문자열 나누기
$n_convert=count($convert); // 필드가 몇개인자 카운트

$convert[0]  =addslashes($convert[0] );
$convert[1]  =addslashes($convert[1] );
$convert[2]  =addslashes($convert[2] );
$convert[3]  =addslashes($convert[3] );
$convert[4]  =addslashes($convert[4] );
$convert[5]  =addslashes($convert[5] );
$convert[7]  =addslashes($convert[7] );
$convert[8]  =addslashes($convert[8] );
$convert[9]  =addslashes($convert[9] );
$convert[10] =addslashes($convert[10]);


print\"
<table border=1 bordercolordark=#ffffff bordercolorlight=#8394a5 cellpadding=5 cellspacing=0 width=98%>
<tr><td bgcolor=FFFFFF align=right valign=top width=80>name,      </td><td>$convert[1]              &nbsp;</td></tr>
<tr><td bgcolor=FFFFFF align=right valign=top width=80>book,      </td><td>$convert[2] &nbsp;</td></tr>
<tr><td bgcolor=FFFFFF align=right valign=top width=80>comp,      </td><td>$convert[3]      &nbsp;</td></tr>
<tr><td bgcolor=FFFFFF align=right valign=top width=80>part,title </td><td>$convert[4]/$convert[5] &nbsp;</td></tr>
<tr><td bgcolor=FFFFFF align=right valign=top width=80>Addr1,    </td><td>$convert[6]              &nbsp;</td></tr>
<tr><td bgcolor=FFFFFF align=right valign=top width=80>tel,   </td><td>($convert[7])   &nbsp;</td></tr>
<tr><td bgcolor=FFFFFF align=right valign=top width=80>mobile1,  </td><td>$convert[8]              &nbsp;</td></tr>
<tr><td bgcolor=FFFFFF align=right valign=top width=80>email,    </td><td>$convert[9]              &nbsp;</td></tr>
<tr><td bgcolor=FFFFFF align=right valign=top width=80>zip,      </td><td>$convert[10]              &nbsp;</td></tr>
</table>
<br>\";

if ($sql_ok==1){ //  DB 입력하기 모드일경우 다음 실행
//DB의 순서와 배열의 순서를 정렬해서 밪춰줌 =====

$sql=\"INSERT INTO $member (id,name,book,comp,part,title,Addr1,tel,mobile1,email,zip)
VALUES($m,\'$convert[1]\',
                \'$convert[2]\',
\'$convert[3]\',
                \'$convert[4]/$convert[5]\',
                \'$convert[6]\',
                \'$convert[7]\',
                \'$convert[8]\',
                \'$convert[9]\',
                \'$convert[10]\'
                )\";
mysql_query ($sql);
}
}
}
 

관련자료

등록된 댓글이 없습니다.
Today's proverb
친절은 사회를 움직이는 황금의 사슬이다.