반응형
쇼핑몰에 이미지를 많이 사용하는건 알고 있을텐데 이 이미지를 웹서버에서 같이 사용하는 경우도 있지만 CDN을 사용하는 경우도 많다. 현재 테스트 환경상 CDN을 사용하는건 불가능하지만 마치 CDN을 사용하는것처럼 흉내를 내 보려고 한다.
우선 CDN을 사용하는것처럼 설정을 몇가지 해보자. 컨피그 파일을 만들어서 공유할건데 이 파일을 어디에 인클루드 하는게 좋을까?
모두가 사용하는 /inc/dbcon.php에 넣어보자
/inc/dbcon.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/config.php";
$hostname="localhost";
$dbuserid="testman";
$dbpasswd="1111";
$dbname="testdb";
$mysqli = new mysqli($hostname, $dbuserid, $dbpasswd, $dbname);
if ($mysqli->connect_errno) {
die('Connect Error: '.$mysqli->connect_error);
}
?>
이렇게 수정하고 /inc/안에 config.php 파일을 만든다.
/inc/config.php
<?php
$_CONFIG["CDN_SERVER"] = "http://localhost:8008";
?>
CDN주소를 컨피그에 넣어준다. 지금은 연습이니까 그냥 자기 주소를 넣어주면 된다. 이제 모든 이미지 저장 페이지에서 저 주소를 가져다 쓰게 될것이다. 이미지를 저장했던 파일들을 불러다 수정해준다. 우선 제품 등록부터 수정해보자.
/admin/product/pupok.php
<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
ini_set( 'display_errors', '0' );
if(!$_SESSION['AUID']){
echo "<script>alert('권한이 없습니다.');history.back();</script>";
exit;
}
$cate=$_POST["cate1"].$_POST["cate2"].$_POST["cate3"];//대중소분류를 모두 저장한다.
$name=$_POST["name"];//제품명
$delivery_fee=$_POST["delivery_fee"];//택배비
$price=$_POST["price"];//가격
$sale_price=$_POST["sale_price"];//세일가
$sale_ratio=$_POST["sale_ratio"];//세일비율
$cnt=$_POST["cnt"]??0;//재고
$contents=rawurldecode($_POST['contents']);//제품 설명
$ismain=$_POST["ismain"];//메인
$isnew=$_POST["isnew"];//신상품
$isbest=$_POST["isbest"];//베스트
$isrecom=$_POST["isrecom"];//추천
$locate=$_POST["locate"];//위치
$sale_end_date=$_POST["sale_end_date"];//판매종료일
$file_table_id=$_POST["file_table_id"];//이미지
$file_table_id=rtrim($file_table_id,",");//오른쪽 끝에 , 삭제
$optionCate1=$_POST["optionCate1"];//옵션분류
$optionCate2=$_POST["optionCate2"];//옵션분류
$wms=$_REQUEST["wms"];//재고
if($_FILES["thumbnail"]["name"]){//첨부한 파일이 있으면
if($_FILES['thumbnail']['size']>10240000){//10메가
echo "<script>alert('10메가 이하만 첨부할 수 있습니다.');history.back();</script>";
exit;
}
if($_FILES['thumbnail']['type']!='image/jpeg' and $_FILES['thumbnail']['type']!='image/gif' and $_FILES['thumbnail']['type']!='image/png'){//이미지가 아니면, 다른 type은 and로 추가
echo "<script>alert('이미지만 첨부할 수 있습니다.');history.back();</script>";
exit;
}
$save_dir = $_SERVER['DOCUMENT_ROOT']."/pdata/";//파일을 업로드할 디렉토리
$filename = $_FILES["thumbnail"]["name"];
$ext = pathinfo($filename,PATHINFO_EXTENSION);//확장자 구하기
$newfilename = date("YmdHis").substr(rand(),0,6);
$thumbnail = $newfilename.".".$ext;//새로운 파일이름과 확장자를 합친다
if(move_uploaded_file($_FILES["thumbnail"]["tmp_name"], $save_dir.$thumbnail)){
$thumbnail = $_CONFIG["CDN_SERVER"]."/pdata/".$thumbnail;
}else{
echo "<script>alert('이미지를 등록할 수 없습니다. 관리자에게 문의해주십시오.');history.back();</script>";
exit;
}
}
$sale_cnt = 0;//판매량
$query="INSERT INTO products
(name, cate, content, thumbnail, price, sale_price, sale_ratio, cnt, sale_cnt, isnew, isbest, isrecom, ismain, locate, userid, sale_end_date, reg_date, delivery_fee)
VALUES('$name'
, '".$cate."'
, '".$contents."'
, '".$thumbnail."'
, '".$price."'
, '".$sale_price."'
, '".$sale_ratio."'
, ".$cnt."
, ".$sale_cnt."
, '".$isnew."'
, '".$isbest."'
, '".$isrecom."'
, '".$ismain."'
, '".$locate."'
, '".$_SESSION['AUID']."'
, '".$sale_end_date."'
, now()
, '".$delivery_fee."'
)";
$rs=$mysqli->query($query) or die($mysqli->error);
$pid = $mysqli -> insert_id;
if($rs){
//옵션부분
$optionName1=$_REQUEST["optionName1"];//옵션명
$optionCnt1=$_REQUEST["optionCnt1"];//재고
$optionPrice1=$_REQUEST["optionPrice1"];//가격
$optionName2=$_REQUEST["optionName2"];//옵션명
$optionCnt2=$_REQUEST["optionCnt2"];//재고
$optionPrice2=$_REQUEST["optionPrice2"];//가격
if($_FILES["optionImage1"]["name"][0]){//첨부한 파일이 있으면
for($k=0;$k<count($_FILES["optionImage1"]["name"]);$k++){
if($_FILES['optionImage1']['size'][$k]>10240000){//10메가
echo "<script>alert('10메가 이하만 첨부할 수 있습니다.');history.back();</script>";
exit;
}
if($_FILES['optionImage1']['type'][$k]!='image/jpeg' and $_FILES['optionImage1']['type'][$k]!='image/gif' and $_FILES['optionImage1']['type'][$k]!='image/png'){//이미지가 아니면, 다른 type은 and로 추가
echo "<script>alert('이미지만 첨부할 수 있습니다.');history.back();</script>";
exit;
}
$save_dir = $_SERVER['DOCUMENT_ROOT']."/pdata/optiondata/";//파일을 업로드할 디렉토리
$filename = $_FILES["optionImage1"]["name"][$k];
$ext = pathinfo($filename,PATHINFO_EXTENSION);//확장자 구하기
$newfilename = date("YmdHis").substr(rand(),0,6);
$optionImage1 = $newfilename.".".$ext;//새로운 파일이름과 확장자를 합친다
if(move_uploaded_file($_FILES["optionImage1"]["tmp_name"][$k], $save_dir.$optionImage1)){
$upload_option_image[]=$_CONFIG["CDN_SERVER"]."/pdata/optiondata/".$optionImage1;
}
}
}
$k=0;
foreach($optionName1 as $on){
if($on){
$optQuery="INSERT INTO testdb.product_options
(pid, cate, option_name, option_price, image_url)
VALUES (".$pid.", '".$optionCate1."', '".$on."', ".$optionPrice1[$k].", '".$upload_option_image[$k]."')";
$ofs=$mysqli->query($optQuery) or die($mysqli->error);
$poid=$mysqli->insert_id;
$op1[]=$poid;
$k++;
}
}
$k=0;
foreach($optionName2 as $on){
if($on){
$optQuery="INSERT INTO testdb.product_options
(pid, cate, option_name, option_price)
VALUES (".$pid.", '".$optionCate2."', '".$on."', ".$optionPrice2[$k].")";
$ofs=$mysqli->query($optQuery) or die($mysqli->error);
$poid=$mysqli->insert_id;
$op2[]=$poid;
$k++;
}
}
$j=0;
if($op1 && $op2){
foreach($op1 as $c1){
foreach($op2 as $c2){
$wcode=$c1."_".$c2;
$wmsQuery="INSERT INTO testdb.wms
(pid, wcode, cnt)
VALUES (".$pid.",'".$wcode."',".$wms[$j].")";
$mysqli->query($wmsQuery) or die($mysqli->error);
$j++;
}
}
}else if($op1 && !$op2){
foreach($op1 as $c1){
$wcode=$c1;
$wmsQuery="INSERT INTO testdb.wms
(pid, wcode, cnt)
VALUES (".$pid.",'".$wcode."',".$wms[$j].")";
$mysqli->query($wmsQuery) or die($mysqli->error);
$j++;
}
}else if(!$op1 && $op2){
foreach($op2 as $c2){
$wcode=$c2;
$wmsQuery="INSERT INTO testdb.wms
(pid, wcode, cnt)
VALUES (".$pid.",'".$wcode."',".$wms[$j].")";
$mysqli->query($wmsQuery) or die($mysqli->error);
$j++;
}
}else if(!$op1 && !$op2){
$wmsQuery="INSERT INTO testdb.wms
(pid, wcode, cnt)
VALUES (".$pid.",'".$wcode."',".$wms[0].")";
$mysqli->query($wmsQuery) or die($mysqli->error);
}
if($file_table_id){//첨부한 이미지 테이블 업데이트
$upquery="update product_image_table set pid=".$pid." where imgid in (".$file_table_id.")";
$fs=$mysqli->query($upquery) or die($mysqli->error);
}
echo "<script>alert('등록했습니다.');location.href='/admin/product/product_list.php';</script>";
exit;
}else{
echo "<script>alert('등록하지 못했습니다. 관리자에게 문의해주십시오.');history.back();</script>";
exit;
}
?>
이미지를 저장해주는 부분에 컨피그에서 cdn 주소를 대입했다. 만일 실제 CDN이라면 함수나 클래스 또는 api를 이용해서 이미지를 저장하고 리턴값을 받았겠지만 그럴 형편이 안되니 그냥 이렇게만 했다.
/admin/product/product_save_image.php
<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
ini_set( 'display_errors', '0' );
if(!$_SESSION['AUID']){
$retun_data = array("result"=>"member");
echo json_encode($retun_data);
exit;
}
if($_FILES['savefile']['size']>10240000){//10메가
$retun_data = array("result"=>"size");
echo json_encode($retun_data);
exit;
}
if($_FILES['savefile']['type']!='image/jpeg' and $_FILES['savefile']['type']!='image/gif' and $_FILES['savefile']['type']!='image/png'){//이미지가 아니면, 다른 type은 and로 추가
$retun_data = array("result"=>"image");
echo json_encode($retun_data);
exit;
}
$save_dir = $_SERVER['DOCUMENT_ROOT']."/pdata/";//파일을 업로드할 디렉토리
$filename = $_FILES["savefile"]["name"];
$ext = pathinfo($filename,PATHINFO_EXTENSION);//확장자 구하기
$newfilename = date("YmdHis").substr(rand(),0,6);
$savefile = $newfilename.".".$ext;//새로운 파일이름과 확장자를 합친다
if(move_uploaded_file($_FILES["savefile"]["tmp_name"], $save_dir.$savefile)){//파일 등록에 성공하면 디비에 등록해준다.
$sfile=$_CONFIG["CDN_SERVER"]."/pdata/".$savefile;
$sql="INSERT INTO product_image_table
(userid, filename)
VALUES('".$_SESSION['UID']."', '".$sfile."')";
$result = $mysqli->query($sql) or die($mysqli->error);
$imgid = $mysqli -> insert_id;
$retun_data = array("result"=>"success", "imgid"=>$imgid, "savename"=>$savefile);
echo json_encode($retun_data);
exit;
}else{
$retun_data = array("result"=>"error");
echo json_encode($retun_data);
exit;
}
?>
이렇게 이미지를 저장하는 부분에 처리를 해줬다. 그럼 이미지를 불러오는 부분은 어떨까? 직접 확인해보자.
반응형
'PHP강좌 > 쇼핑몰만들기강좌' 카테고리의 다른 글
php+mysql 쇼핑몰 만들기 강좌 - #15. 제품 등록 시 Validation 체크 (필수값) (0) | 2022.03.31 |
---|---|
php+mysql 쇼핑몰 만들기 강좌 - #14 상품 등록시 트랜잭션 적용하기. (0) | 2022.03.29 |
php+mysql 쇼핑몰 만들기 강좌 - #12 WMS 시스템 연동하기(재고관리) (0) | 2022.03.26 |
php+mysql 쇼핑몰 만들기 강좌 - #11 제품 옵션분류가 2개이상이고 가격이 다를때 (0) | 2022.03.23 |
php+mysql 쇼핑몰 만들기 강좌 - #10 제품 상세 페이지 옵션에 이미지 보여주기 (0) | 2022.03.22 |