PHP 엑셀 ( CSV ) 파일 업로드 하여 DB 저장
페이지 정보
본문
CSV 파일의 필드명만 데이타 테이블에 맞추면 된다.
테이블에 맞췄음에도 불구하고 입력 에러시 파일안에 특수 문자 검색을 해볼것.
*. CSV 파일 : xls.cvs
*. 파일 업로드 폼 : write.php
*. 받은파일 컨트롤 : write_proc.php
1. 디비 테이블 생성
CREATE TABLE IF NOT EXISTS `디비테이블` (
`idx` int(11) NOT NULL auto_increment,
`bo_table` varchar(50) NOT NULL,
`wr_id` varchar(10) NOT NULL,
`code` varchar(20) NOT NULL,
`wdate` varchar(50) NOT NULL,
PRIMARY KEY (`idx`)
)
2. data 폴더 생성후 퍼미션을 777 로 변경
3. xls.cvs
1번라인은 참고용으로 실제 디비에는 업로드되지 않습니다. csv 항목중 첫번째것만 디비에 업로드합니다.
code code2 code3
국화꽃 W 25
꽃미녀 W 26
여미지 M 27
4. write.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>CVS 파일 올리기</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body, td, a { font-size:12px; font-family:"돋움"; }
img { border:0; }
.hp_div { width:900px; padding:0 0 0 200px; }
.hp_div1 { font-family:"돋움"; font-size:11px; float:left; width:150px; height:20px; padding:5px 0 0 0; text-align:center; vertical-align:middle; background:#f5f5f4; color:#292929; }
.hp_div2 { font-family:"돋움"; float:left; width:300px; height:25px; padding:0 5px 0 5px; }
.hp_div3 { font-family:"돋움"; float:left; height:25px; }
</style>
</head>
<body>
<form method="post" name="form" action="write_proc.php" enctype="multipart/form-data" style="margin:0; padding:0;">
<input type="hidden" name="bo_table" value="<?php echo $bo_table; ?>">
<input type="hidden" name="wr_id" value="<?php echo $wr_id; ?>">
<div class="hp_div">
<div class="hp_div1">파일첨부</div>
<div class="hp_div2"><input type="file" name="upfile" id="upfile" style="width:300px; height:25px;"></div>
<div class="hp_div3" align="center"><input type="submit" value="올리기" style="width:50px; height:25px;"></div>
<div style="clear:both;"></div>
</div>
</form>
</body>
</html>
5. write_proc.php
<?php
$mysql_host = 'DB서버주소';
$mysql_user = 'DB아이디';
$mysql_password = 'DB비밀번호';
$mysql_db = 'DB이름';
//$dbconn = mysql_connect("$mysql_host","$mysql_user","$mysql_password") or die("데이터베이스 연결에 실패하였습니다.");
//mysql_select_db("$mysql_db", $dbconn);
$dbconn = mysqli_connect($mysql_host,$mysql_user,$mysql_password,$mysql_db);
// 그누보드5 사용시
//include_once "../common.php"; // 그누브도5 common.php 경로
//$dbconn = mysqli_connect(G5_MYSQL_HOST,G5_MYSQL_USER,G5_MYSQL_PASSWORD,G5_MYSQL_DB) ;
// 저장될 디비 테이블명
$TABLE_NAME = "디비테이블";
// 저장될 디렉토리
$upfile_dir = "./data";
//CSV데이타 추출시 한글깨짐방지
//setlocale(LC_CTYPE, 'ko_KR.utf8');
setlocale(LC_CTYPE, 'ko_KR.eucKR'); // CSV 한글 깨짐 문제
//장시간 데이터 처리될경우
set_time_limit(0);
echo ('<meta http-equiv="content-type" content="text/html; charset=utf-8">');
$upfile_name = $_FILES['upfile']['name']; // 파일이름
$upfile_type = $_FILES['upfile']['type']; // 확장자
$upfile_size = $_FILES['upfile']['size']; // 파일크기
$upfile_tmp = $_FILES['upfile']['tmp_name']; // 임시 디렉토리에 저장된 파일명
//echo "upfile_name = ". $upfile_name ."<br>";
//echo "upfile_type = ". $upfile_type ."<br>";
//echo "upfile_size = ". $upfile_size ."<br>";
//echo "upfile_tmp = ". $upfile_tmp ."<br>";
$uploadfile = $uploaddir . $_FILES['userfile']['name'];
//확장자 확인
if(preg_match("/(\.(csv|CSV))$/i",$upfile_name)) {
} else {
echo ("<script>window.alert('업로드를 할수 없는 파일 입니다.\\n\\r확장자가 csv 인경우만 업로드가 가능합니다.'); history.go(-1) </script>");
exit;
}
if ($upfile_name){
//폴더내에 동일한 파일이 있는지 검사하고 있으면 삭제
if (file_exists("{$upfile_dir}/{$upfile_name}") ) { unlink("{$upfile_dir}/{$upfile_name}"); }
if (!$upfile) {
//echo ("<script>window.alert('지정된 용량(2M)을 초과'); history.go(-1) </ script>");
// exit;
}
if ( strlen($upfile_size) < 7 ) {
$filesize = sprintf("%0.2f KB", $upfile_size/1000);
} else{
$filesize = sprintf("%0.2f MB", $upfile_size/1000000);
}
if (move_uploaded_file($upfile_tmp,"{$upfile_dir}/{$upfile_name}")) {
} else {
echo ("<script>window.alert('디렉토리에 복사실패'); history.go(-1) </script>");
exit;
}
}
// 기본 데이타 삭제후 저장하고자 할때는 아래 2개 주석 해지
//$sql = "delete from ". $TABLE_NAME ;
//$result = mysqli_query($dbconn,$sql);
// 저장된 파일을 읽어 들인다
$csvLoad = file("{$upfile_dir}/{$upfile_name}");
// 행으로 나누어서 배열에 저장
$csvArray = explode("\r\n",implode($csvLoad)); // 문장의 끝라인은 \r\n 입니다. (2014-11-14 RYO)
// 행으로 나눠진 배열 갯수 만큼 돌린다($csvArray[0]에는 필드 이름이 있으므로 $i는 1번 부터 시작하고 총 갯수는 $csvArray에서 1를 뺌니다
for($i=1;$i<count($csvArray)-1;$i++){
// 각 행을 콤마를 기준으로 각 필드에 나누고 DB입력시 에러가 없게 하기위해서 addslashes함수를 이용해 \를 붙입니다
$field = explode(",",addslashes($csvArray[$i]));
// 나누어진 각 필드에 앞뒤에 공백을 뺸뒤 ''따옴표를 붙이고 ,콤마로 나눠서 한줄로 만듭니다.
$value = "'" . trim(implode("','",$field)) . "'";
$value = iconv("euc-kr", "utf-8", $value); // CSV 한글 깨짐 문제 2014-11-14 해피정닷컴
// $field[0] 기존자료 중복체크
$query_check = "select * from ".$TABLE_NAME." where bo_table='".$bo_table."' and wr_id='".$wr_id."' and code='".$field[0]."' ";
//echo $query_check ."<br><br>";
$result_check = mysqli_query($dbconn,$query_check);
$data_check = mysqli_fetch_array($result_check);
$isset_check = $data_check["code"]; // 필드 데이타 하나를 호출합니다.
//echo $isset_check; // 정상보이는지 확인
if(isset($isset_check)) { // 자료 있을때
} else { // 자료 없을때
//echo "등록된 내용이 없습니다!\n"; //<<--- 메세지!
// php쿼리문을 이용해서 입력한다.
//$insertSQL = sprintf("insert into %s (%s) values (%s)", $TABLE_NAME , $csvArray[0], $value);
$insertSQL = sprintf("insert into ".$TABLE_NAME." (bo_table, wr_id, code) values ('".$bo_table."', '".$wr_id."', '".$field[0]."'); ", $TABLE_NAME , $csvArray[0], $value);
echo $insertSQL ."<br><br>";
$Result = mysqli_query($dbconn,$insertSQL) or die(mysqli_error());
}
}
// 입력이 된후 업로드된 파일을 삭제한다
unlink("{$upfile_dir}/{$upfile_name}");
//exit;
if ($Result) {
echo " <script>alert('저장되었습니다.'); document.location.href='write.php?bo_table=".$bo_table."&wr_id=".$wr_id."'; </script>";
echo ("<script>window.alert('자료를 성공적으로 저장하였습니다.');
history.go(-1)
</script>");
} else {
echo " <script>alert('추가된 자료가 없습니다.'); document.location.href='write.php?bo_table=".$bo_table."&wr_id=".$wr_id."'; </script>";
echo ("<script>window.alert('추가된 자료가 없습니다.');
history.go(-1)
</script>");
}
@mysqli_close();
?>
참고자료
http://nuax.tistory.com/entry/PHP-에서-CSV파일-업드로-후-MYSQL-DB에-입력하기
http://ncube.net/7970
http://www.autoboy.pe.kr/159
http://phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_function&wr_id=388809
테이블에 맞췄음에도 불구하고 입력 에러시 파일안에 특수 문자 검색을 해볼것.
*. CSV 파일 : xls.cvs
*. 파일 업로드 폼 : write.php
*. 받은파일 컨트롤 : write_proc.php
1. 디비 테이블 생성
CREATE TABLE IF NOT EXISTS `디비테이블` (
`idx` int(11) NOT NULL auto_increment,
`bo_table` varchar(50) NOT NULL,
`wr_id` varchar(10) NOT NULL,
`code` varchar(20) NOT NULL,
`wdate` varchar(50) NOT NULL,
PRIMARY KEY (`idx`)
)
2. data 폴더 생성후 퍼미션을 777 로 변경
3. xls.cvs
1번라인은 참고용으로 실제 디비에는 업로드되지 않습니다. csv 항목중 첫번째것만 디비에 업로드합니다.
code code2 code3
국화꽃 W 25
꽃미녀 W 26
여미지 M 27
4. write.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>CVS 파일 올리기</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body, td, a { font-size:12px; font-family:"돋움"; }
img { border:0; }
.hp_div { width:900px; padding:0 0 0 200px; }
.hp_div1 { font-family:"돋움"; font-size:11px; float:left; width:150px; height:20px; padding:5px 0 0 0; text-align:center; vertical-align:middle; background:#f5f5f4; color:#292929; }
.hp_div2 { font-family:"돋움"; float:left; width:300px; height:25px; padding:0 5px 0 5px; }
.hp_div3 { font-family:"돋움"; float:left; height:25px; }
</style>
</head>
<body>
<form method="post" name="form" action="write_proc.php" enctype="multipart/form-data" style="margin:0; padding:0;">
<input type="hidden" name="bo_table" value="<?php echo $bo_table; ?>">
<input type="hidden" name="wr_id" value="<?php echo $wr_id; ?>">
<div class="hp_div">
<div class="hp_div1">파일첨부</div>
<div class="hp_div2"><input type="file" name="upfile" id="upfile" style="width:300px; height:25px;"></div>
<div class="hp_div3" align="center"><input type="submit" value="올리기" style="width:50px; height:25px;"></div>
<div style="clear:both;"></div>
</div>
</form>
</body>
</html>
5. write_proc.php
<?php
$mysql_host = 'DB서버주소';
$mysql_user = 'DB아이디';
$mysql_password = 'DB비밀번호';
$mysql_db = 'DB이름';
//$dbconn = mysql_connect("$mysql_host","$mysql_user","$mysql_password") or die("데이터베이스 연결에 실패하였습니다.");
//mysql_select_db("$mysql_db", $dbconn);
$dbconn = mysqli_connect($mysql_host,$mysql_user,$mysql_password,$mysql_db);
// 그누보드5 사용시
//include_once "../common.php"; // 그누브도5 common.php 경로
//$dbconn = mysqli_connect(G5_MYSQL_HOST,G5_MYSQL_USER,G5_MYSQL_PASSWORD,G5_MYSQL_DB) ;
// 저장될 디비 테이블명
$TABLE_NAME = "디비테이블";
// 저장될 디렉토리
$upfile_dir = "./data";
//CSV데이타 추출시 한글깨짐방지
//setlocale(LC_CTYPE, 'ko_KR.utf8');
setlocale(LC_CTYPE, 'ko_KR.eucKR'); // CSV 한글 깨짐 문제
//장시간 데이터 처리될경우
set_time_limit(0);
echo ('<meta http-equiv="content-type" content="text/html; charset=utf-8">');
$upfile_name = $_FILES['upfile']['name']; // 파일이름
$upfile_type = $_FILES['upfile']['type']; // 확장자
$upfile_size = $_FILES['upfile']['size']; // 파일크기
$upfile_tmp = $_FILES['upfile']['tmp_name']; // 임시 디렉토리에 저장된 파일명
//echo "upfile_name = ". $upfile_name ."<br>";
//echo "upfile_type = ". $upfile_type ."<br>";
//echo "upfile_size = ". $upfile_size ."<br>";
//echo "upfile_tmp = ". $upfile_tmp ."<br>";
$uploadfile = $uploaddir . $_FILES['userfile']['name'];
//확장자 확인
if(preg_match("/(\.(csv|CSV))$/i",$upfile_name)) {
} else {
echo ("<script>window.alert('업로드를 할수 없는 파일 입니다.\\n\\r확장자가 csv 인경우만 업로드가 가능합니다.'); history.go(-1) </script>");
exit;
}
if ($upfile_name){
//폴더내에 동일한 파일이 있는지 검사하고 있으면 삭제
if (file_exists("{$upfile_dir}/{$upfile_name}") ) { unlink("{$upfile_dir}/{$upfile_name}"); }
if (!$upfile) {
//echo ("<script>window.alert('지정된 용량(2M)을 초과'); history.go(-1) </ script>");
// exit;
}
if ( strlen($upfile_size) < 7 ) {
$filesize = sprintf("%0.2f KB", $upfile_size/1000);
} else{
$filesize = sprintf("%0.2f MB", $upfile_size/1000000);
}
if (move_uploaded_file($upfile_tmp,"{$upfile_dir}/{$upfile_name}")) {
} else {
echo ("<script>window.alert('디렉토리에 복사실패'); history.go(-1) </script>");
exit;
}
}
// 기본 데이타 삭제후 저장하고자 할때는 아래 2개 주석 해지
//$sql = "delete from ". $TABLE_NAME ;
//$result = mysqli_query($dbconn,$sql);
// 저장된 파일을 읽어 들인다
$csvLoad = file("{$upfile_dir}/{$upfile_name}");
// 행으로 나누어서 배열에 저장
$csvArray = explode("\r\n",implode($csvLoad)); // 문장의 끝라인은 \r\n 입니다. (2014-11-14 RYO)
// 행으로 나눠진 배열 갯수 만큼 돌린다($csvArray[0]에는 필드 이름이 있으므로 $i는 1번 부터 시작하고 총 갯수는 $csvArray에서 1를 뺌니다
for($i=1;$i<count($csvArray)-1;$i++){
// 각 행을 콤마를 기준으로 각 필드에 나누고 DB입력시 에러가 없게 하기위해서 addslashes함수를 이용해 \를 붙입니다
$field = explode(",",addslashes($csvArray[$i]));
// 나누어진 각 필드에 앞뒤에 공백을 뺸뒤 ''따옴표를 붙이고 ,콤마로 나눠서 한줄로 만듭니다.
$value = "'" . trim(implode("','",$field)) . "'";
$value = iconv("euc-kr", "utf-8", $value); // CSV 한글 깨짐 문제 2014-11-14 해피정닷컴
// $field[0] 기존자료 중복체크
$query_check = "select * from ".$TABLE_NAME." where bo_table='".$bo_table."' and wr_id='".$wr_id."' and code='".$field[0]."' ";
//echo $query_check ."<br><br>";
$result_check = mysqli_query($dbconn,$query_check);
$data_check = mysqli_fetch_array($result_check);
$isset_check = $data_check["code"]; // 필드 데이타 하나를 호출합니다.
//echo $isset_check; // 정상보이는지 확인
if(isset($isset_check)) { // 자료 있을때
} else { // 자료 없을때
//echo "등록된 내용이 없습니다!\n"; //<<--- 메세지!
// php쿼리문을 이용해서 입력한다.
//$insertSQL = sprintf("insert into %s (%s) values (%s)", $TABLE_NAME , $csvArray[0], $value);
$insertSQL = sprintf("insert into ".$TABLE_NAME." (bo_table, wr_id, code) values ('".$bo_table."', '".$wr_id."', '".$field[0]."'); ", $TABLE_NAME , $csvArray[0], $value);
echo $insertSQL ."<br><br>";
$Result = mysqli_query($dbconn,$insertSQL) or die(mysqli_error());
}
}
// 입력이 된후 업로드된 파일을 삭제한다
unlink("{$upfile_dir}/{$upfile_name}");
//exit;
if ($Result) {
echo " <script>alert('저장되었습니다.'); document.location.href='write.php?bo_table=".$bo_table."&wr_id=".$wr_id."'; </script>";
echo ("<script>window.alert('자료를 성공적으로 저장하였습니다.');
history.go(-1)
</script>");
} else {
echo " <script>alert('추가된 자료가 없습니다.'); document.location.href='write.php?bo_table=".$bo_table."&wr_id=".$wr_id."'; </script>";
echo ("<script>window.alert('추가된 자료가 없습니다.');
history.go(-1)
</script>");
}
@mysqli_close();
?>
참고자료
http://ncube.net/7970
http://www.autoboy.pe.kr/159
http://phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_function&wr_id=388809
댓글목록
등록된 댓글이 없습니다.