상세 컨텐츠

본문 제목

php phpexcel 에서 불러온 자료중 중복없이 db저장하기

카테고리 없음

by 쓸쓸한사람 2023. 3. 9. 12:35

본문

쇼핑몰운영중에 필요한 관리웹을 만들어보고자, 프로그래머도 아닌 컴맹이 삽질중....

내가 나중에 다시 보기위해서 올림.....

중복값을 찾아서 비교하기 위해서 while문, foreach문으로 돌려보고,

in_array함수, array_search함수등 몇일을 삽질하다 결국은 count함수로 해결

맞는지는 모르고, 일단 돌아는 감, 필요하신분들은 참고만 하삼^^

 

 

일단 네이버스마트스토어 내가 올린 상품목록을 다운받아옴. 이글을 작성하기위해 내용은 지우고 제목만 남겨놓음.

 

엑셀에 있는 열을 전부 db에 저장하는게 아니고, 필요한 열만 올리기위해서

맨위 노란색으로 된 1행은 db에 저장시 참고하기 위해 임시적으로 만들어놓은 행.

예를들면 상품번호(열번호 A = 0), 상품명(열번호 E = 4), 판매가(열번호 K = 10) 만 선택해서 db에 저장할 예정

 

실제 업로드시에 1행(노란색)은 지우고, 내용은 있어야됨.

 DB는 아래와 같은걸로 가정하에 진행...... 

테이블 이름은 : naver_product

필드는 : no, product_number, product_name, pirce......정도라고하고,

 

 

폼으로 입력받는 파일이 있고, 입력받은 엑셀자료를 db에 저장하는 실행파일

폼으로 입력받는 파일은 맨 아래에......

이름은 phpexcel_up_action.php 정도로 만들면 되려나???

 

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

<?
include_once '../phpexcel/PHPExcel.php'; 
include_once '../db_connect.php';  // db연결

$objPHPExcel = new PHPExcel();
$allData = array();  // 불러온 엑셀을 담을수 있는 배열변수 생성

// db저장시 입력할 내용을 미리 변수로 지정

$insert1 = "INSERT INTO naver_product (product_number, product_name, pirce)";
$insert2 = " VALUES ('";
$insert3 = ")";

 

// 추가된 행과, 중복된 행의 갯수를 표시하기 위해 변수지정

$add_line = 0;
$err_line = 0;

 

// phpexcel로 엑셀파일을 불러오는 부분, 잘모르니 퍼온대로....
$filename = iconv("UTF-8", "EUC-KR", $_FILES['excelFile']['tmp_name']);
try {
    $objPHPExcel = PHPExcel_IOFactory::load($filename);
    $extension = strtoupper(pathinfo($filename, PATHINFO_EXTENSION));
    $sheetsCount = $objPHPExcel -> getSheetCount();
    for($sheet = 0; $sheet < $sheetsCount; $sheet++) {
        $objPHPExcel -> setActiveSheetIndex($sheet);
        $activesheet = $objPHPExcel -> getActiveSheet();
        $highestRow = $activesheet -> getHighestRow();   
        $highestColumn = $activesheet -> getHighestColumn();
        for($row = 2; $row <= $highestRow; $row++) {
            $rowData = $activesheet -> rangeToArray("A" . $row . ":" . $highestColumn . $row, NULL, TRUE, FALSE);
            $allData[$row] = $rowData[0];
        }
    }
}
 catch(exception $exception) {
}

 

// 여기서부터 phpexcel로 읽어드린 엑셀파일을 db에 저장하기 위해 엑셀값을 가져옴

 

// 먼저 각행별로 나눔 (1행, 2행, 3행......)

foreach($allData as $key=>$value)
{

// 한개의 행이 끝나면 다음행으로 넘어갈수있게 리셋해줌, 

// 리셋안해줄경우 1행, 1행,2행, 1행,2행,3행 <-이런식으로 출력됨

// 1행,2행,3행 으로출력되게 

unset($row_value); 

 

    // 예를들면 상품번호(열번호 A = 0), 상품명(열번호 E = 4), 판매가(열번호 K = 10) 만 불러올 예정 
    foreach($value as $key2=>$value2)
{
if ($key2 == "0") {     // 열번호가 0이면, 엑셀파일에 상품번호가 있는 열A에 들어있는 값을 $row_value 변수에 합쳐(?) 줌.
$row_value .= trim($value[$key2])."','";    //  현재 : 000','
// 중복값이 있는지 체크하기위해 변수생성, foreach에서 계속 값이 바뀜으로 값이 안바뀌게 일단 잡아놓음

$n_number = $value[$key2];   

 

} else if ($key2 == "4") {    // 열번호가 4면, 열E에 들어있는 값을 $row_value 변수에 합쳐(?) 줌. 
$row_value .= trim($value[$key2])."','";     //현재 000','444','
} else if ($key2 == "10") {    // 열번호가 10이면, 열K에 들어있는 값을 $row_value 변수에 합쳐(?) 줌.
$row_value .= trim($value[$key2])."','";     // 현재 000','444','1110','

}

// 네이버상품번호가 있으면 기존데이터에서 갯수를 센다

// group by를 안해주니, 데이터가 전혀없는데도 1이라는 숫자가 나왔다 ㅠㅠ
if ($n_number) {
$query3 = "SELECT product_number ,

COUNT(*) FROM product where product_number = '$n_number' GROUP BY product_number";

$result3 = $conn->query($query3);
$n_line = mysqli_num_rows($result3);    // 나온 갯수를 변수에 저장
} else if (!$n_number) 
{
$n_line = '0'; // 네이버상품번호가 없을경우 $n_line값을 0으로 변경해준다. 이걸안해주면 값이 이상하게 나옴ㅠㅠ
}

// 네이버 상품번호가 없을때, 중복이 아니므로 db에 저장
if ($n_line == '0')
{
$row_value = substr($row_value,0,-2);     // 현재 000','444','1110',' 이값이면 db 저장시 에러발생 맨뒤에 ,' 두개를 지워줌
$add_line++;     // db에 저장되는 갯수를 표시하기 위해 

// 테스트시 바로아래 쿼리와 맨아래 if문을 주석으로 중지시키고, 이 라인을 실행해서 출력되는 내용확인

// 오류발생시 출력되는 내용을 Mysql에 직접 쿼리를 줘보면 에러내용을 대충알수있슴

 

/* 맨 위에서 지정해준 변수내용대로 출력, 이 주석은 지워도댐

$insert1 = "INSERT INTO naver_product (product_number, product_name, pirce)";
$insert2 = " VALUES ('";
$insert3 = ")"; 

*/ "INSERT INTO naver_product (product_number, product_name, pirce)"  VALUES (' 000','444','1110'")

 

// echo "$insert1 $insert2 $row_value $insert3 ;\n";    // 테스트시 이앞에 주석만 제거, 위에는 그냥 주석문임

$query = "$insert1 $insert2 $row_value $insert3";
$result = mysqli_query($conn,$query);

echo "</br>";
echo "</br>";

// 그렇지 않고, 네이버 상품번호가 있을때
} else 
{
$err_line++;    // 중복된 행의 갯수를 1개 늘려준다
}

}

 

echo "</br></br></br></br>";
if ($result) 
{
?>     <script>
alert("<? echo $add_line ?>개의 행이 추가되었습니다.(중복 <? echo $err_line ?>개)");
location.replace('../product/product_list_view.php');
</script>

<? } else if ($row_value) {
?>     <script>
alert("추가할 상품이 없습니다.(중복 <? echo $err_line ?>개)");
location.replace('../product/product_list_view.php');
</script>

<? } else {
?>     <script>
alert("DB 저장시 오류가 발생했습니다");
location.replace('../product/product_list_view.php');
</script>
<?
}
 mysqli_close($conn);
?>

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

 

 

 

입력폼파일의 내용은

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

<div align=center>상품 등록하기
<form enctype="multipart/form-data" action="./phpexcel_up_action.php" method="post">
<table border="2">
<tr>
<td><input type="file" name="excelFile"/></td>
</tr>
<tr>
<td style="text-align:center;"><input type="submit" value="업로드"/></td>
</tr>
</form>
</div>
</html>

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