마일리지도 쇼핑몰에서는 가장 중요한 것중에 하나다. 돈과 관련된 것들은 하나같이 다 중요하다.
우선 테이블을 만들어보자. 첫번째는마일리지의 종류를 저장할 mileage_type, 두번째는 마일리지의 토탈 값을 저장할 mileage, 세번째는 마일리지를 받을때마다 기록하는 mileage_history다. 하나하나 만들어보자.
CREATE TABLE `mileage_type` (
`tid` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(145) DEFAULT NULL,
`summary` mediumtext DEFAULT NULL,
`mileage` double DEFAULT NULL,
`period` int(11) DEFAULT NULL,
`status` tinyint(4) DEFAULT NULL,
`regdate` datetime DEFAULT current_timestamp(),
PRIMARY KEY (`tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `mileage` (
`mid` int(11) NOT NULL AUTO_INCREMENT,
`userid` varchar(145) NOT NULL,
`mileage` double DEFAULT NULL,
PRIMARY KEY (`mid`),
UNIQUE KEY `userid_UNIQUE` (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `mileage_history` (
`hid` int(11) NOT NULL AUTO_INCREMENT,
`userid` varchar(145) DEFAULT NULL,
`mileage_plus` double DEFAULT NULL,
`mileage_minus` double DEFAULT NULL,
`type` int(11) DEFAULT NULL,
`status` tinyint(4) DEFAULT NULL,
`startdate` datetime DEFAULT NULL,
`enddate` datetime DEFAULT NULL,
`regdate` datetime DEFAULT current_timestamp(),
PRIMARY KEY (`hid`),
KEY `idx_mileage_history_userid` (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
테이블은 이렇게 생성해주고 mileage_type에 데이터를 입력해준다.
INSERT INTO testdb.mileage_type (name,summary,mileage,period,status,regdate) VALUES
('회원가입감사마일리지','가입하신 모든 회원님들께 드립니다',1000.0,365,1,'2022-09-01 17:04:06.000'),
('로그인이벤트','매일 로그인을 할때마다 마일리지를 드립니다',100.0,100,1,'2022-09-01 17:05:11.000'),
('마일리지사용','마일리지를 사용하는 경우입니다',0.0,0,1,'2022-09-02 10:22:08.000');
이렇게 준비를 해놓고 소스를 수정해 보자. 테이블에 대한 설명을 따로 안한다. 설계는 본인이 하고 싶은대로 해도 된다.
회원 가입을하면 회원가입감사마일리지를 주려고 한다. 소스를 확인해보자.
/member/signup_ok.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
$userid=$_POST["userid"];
$username=$_POST["username"];
$email=$_POST["email"];
$passwd=$_POST["passwd"];
$passwd=hash('sha512',$passwd);
$sql="INSERT INTO members
(userid, email, username, passwd)
VALUES('".$userid."', '".$email."', '".$username."', '".$passwd."')";
$result=$mysqli->query($sql) or die($mysqli->error);
if($result){
user_coupon($userid, 1, "회원가입");
echo "<script>alert('가입을 환영합니다. 10% 할인 쿠폰을 발행해 드렸습니다.');location.href='/index.php';</script>";
exit;
}else{
echo "<script>alert('회원가입에 실패했습니다.');history.back();</script>";
exit;
}
function user_coupon($userid, $cid, $reason){
global $mysqli;
$query="select * from coupons where cid=".$cid;
$result2 = $mysqli->query($query) or die("query error => ".$mysqli->error);
$rs2 = $result2->fetch_object();
$last_date = date("Y-m-d 23:59:59", strtotime("+30 days")); //30일이 지나면 못쓴다.
$sql="INSERT INTO user_coupons
(couponid, userid, status, use_max_date, regdate, reason)
VALUES(".$rs2->cid.", '".$userid."', 1, '".$last_date."', now(), '".$reason."')";
$ins=$mysqli->query($sql) or die($mysqli->error);
}
?>
기존에도 소스안에 들어있는 함수가 있었다. 함수가 몇개 안되면 상관없지만 함수가 많아지면 함수만 따로 모아두는 것이 좋다. 함수만 모아놓은 파일을 만들고 그 파일을 인클루드 시키자. /inc 폴더 밑에 lib.php 라는 파일을 만들고 거기에 함수를 넣어주자.
/inc/lib.php
<?php
function user_coupon($userid, $cid, $reason){
global $mysqli;
$query="select * from coupons where cid=".$cid;
$result2 = $mysqli->query($query) or die("query error => ".$mysqli->error);
$rs2 = $result2->fetch_object();
$last_date = date("Y-m-d 23:59:59", strtotime("+30 days")); //30일이 지나면 못쓴다.
$sql="INSERT INTO user_coupons
(couponid, userid, status, use_max_date, regdate, reason)
VALUES(".$rs2->cid.", '".$userid."', 1, '".$last_date."', now(), '".$reason."')";
$ins=$mysqli->query($sql) or die($mysqli->error);
}
function get_mileage($userid, $type){
global $mysqli;
$query="select * from mileage_type where tid=".$type;
$result2 = $mysqli->query($query) or die("query error => ".$mysqli->error);
$rs2 = $result2->fetch_object();
$status = 1;
$enddate = date("Y-m-d 23:59:59", strtotime("+{$rs2->period} days"));
$sql="INSERT INTO `mileage_history`
(`userid`,
`mileage_plus`,
`mileage_minus`,
`type`,
`status`,
`startdate`,
`enddate`)
VALUES
('".$userid."',
".$rs2->mileage.",
0,
".$type.",
".$status.",
now(),
'".$enddate."')";
$ins=$mysqli->query($sql) or die($mysqli->error);
$sql2 = "INSERT INTO `mileage`
(`userid`,
`mileage`)
VALUES
('".$userid."',
".$rs2->mileage.") ON DUPLICATE KEY UPDATE mileage=mileage+".$rs2->mileage;// 없으면 입력하고 있으면 update 한다. 이때 가장 중요한것이 테이블을 만들때 기준이 되는 칼럼을 반드시 unique로 만들어야한다.
$ins2=$mysqli->query($sql2) or die($mysqli->error);
}
?>
이렇게 함수들을 모았다. 마일리지 함수도 들어가 있다. 이렇게 함수만 모아놓은 파일을 만들었으니 이 파일을 페이지마다 불러서사용해야 한다. 그러려면 모든 파일을 열때 이 파일도 인클루드 돼 있어야 한다. 그러므로 기존에 모든 파일에 인클루드 돼 있는 파일에 추가해주면 된다.
/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);
}
include $_SERVER["DOCUMENT_ROOT"]."/inc/lib.php";
?>
디비 연결해주는 파일의 마지막 부분에 함수 파일을 인클루드 시켜준다. 이런 방법도 여러가지가 있다. 각자 좋은 방법으로 해도 된다.
이제 signup_ok.php 파일도 수정해준다.
/member/signup_ok.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
$userid=$_POST["userid"];
$username=$_POST["username"];
$email=$_POST["email"];
$passwd=$_POST["passwd"];
$passwd=hash('sha512',$passwd);
$sql="INSERT INTO members
(userid, email, username, passwd)
VALUES('".$userid."', '".$email."', '".$username."', '".$passwd."')";
$result=$mysqli->query($sql) or die($mysqli->error);
if($result){
user_coupon($userid, 1, "회원가입");
get_mileage($userid,1);
echo "<script>alert('가입을 환영합니다. 10% 할인 쿠폰과 마일리지 1000원을 적립해 드렸습니다.');location.href='/index.php';</script>";
exit;
}else{
echo "<script>alert('회원가입에 실패했습니다.');history.back();</script>";
exit;
}
?>
이렇게 함수는 옮겨서 깨끗해졌고 함수 호출하는 부분만 남겨두었다.
함수로 돌아가보자. 회원가입을 하면 mileage에 전체 마일리지를 입력해주고 mileage_history에 마일리지를 입력받을때마다 사용할때마다 기록해준다. 그리고 마일리지는 대부분 사용 기한이 있기때문에 마일리지를 사용할 수 있는 시작일과 언제까지 사용할 수 있는지 지정해준다.
로그인 이벤트가 있으니 로그인시에도 마일리지 주는걸 넣어보자.
/member/login_ok.php
<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
$userid=$_POST["userid"];
$passwd=$_POST["passwd"];
$passwd=hash('sha512',$passwd);
$query = "select * from members where userid='".$userid."' and passwd='".$passwd."'";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
$rs = $result->fetch_object();
if($rs){
$_SESSION['UID']= $rs->userid;
$_SESSION['UNAME']= $rs->username;
$sql="update cart set userid='".$userid."' where ssid='".session_id()."'";//로그인하면 장바구니에 세션아이디가 같은 제품들의 userid를 업데이트한다.
$result=$mysqli->query($sql) or die($mysqli->error);
$query2 = "select count(*) as cnt from mileage_history where userid='".$userid."' and type=2 and status=1 and DATE(regdate) = DATE(NOW())";
$result2 = $mysqli->query($query2) or die("query error => ".$mysqli->error);
$rs2 = $result2->fetch_object();
if(!$rs2->cnt){//오늘 등록한 마일리지가 없으면 함수 실행
get_mileage($userid,2);//로그인 이벤트
}
echo "<script>alert('어서오십시오.');location.href='/';</script>";
exit;
}else{
echo "<script>alert('아이디나 암호가 틀렸습니다. 다시한번 확인해주십시오.');history.back();</script>";
exit;
}
?>
로그인 이벤트는 하루에 한번만 마일리지를 받을 수 있도록 이미 받은 적이 있는지 꼭 확인해서 안받은 사람만 받도록 해야한다.
마일리지를 얻었을때는 등록하는 것이 어렵지 않은데 이걸 사용할때는 문제가 복잡해진다. 마일리지 사용에 대한 부분은 다음에 알아보도록 하자.