반응형

 

 

마일리지도 쇼핑몰에서는 가장 중요한 것중에 하나다. 돈과 관련된 것들은 하나같이 다 중요하다.

 

우선 테이블을 만들어보자. 첫번째는마일리지의 종류를 저장할 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;
}


?>

로그인 이벤트는 하루에 한번만 마일리지를 받을 수 있도록 이미 받은 적이 있는지 꼭 확인해서 안받은 사람만 받도록 해야한다.

 

마일리지를 얻었을때는 등록하는 것이 어렵지 않은데 이걸 사용할때는 문제가 복잡해진다. 마일리지 사용에 대한 부분은 다음에 알아보도록 하자.

 

반응형

+ Recent posts