반응형

소스를 보다보니까 회원가입시에 똑같은 아이디로 가입해도 가입이 되는 것을 알게됐다. 사용자가 회원가입 버튼을 눌렀을때 실제 사용중인 아이디이거나 이메일인지 체크하는 로직을 넣어 볼건데 ajax를 이용해 보자.

 

우선 회원가입페이지를 수정해보자.

 

/member/signup.php

<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/header.php";
?>

        <form class="row g-3 needs-validation" method="post" action="signup_ok.php">
        <div class="col-12">
            <label for="validationCustom01" class="form-label">이름</label>
            <input type="text" class="form-control" id="userame" name="username" placeholder="" required>
        </div>
        <div class="col-12">
            <label for="validationCustom02" class="form-label">아이디</label>
            <input type="text" class="form-control" id="userid" name="userid" placeholder="" required>
        </div>
        <div class="col-12">
            <label for="validationCustom02" class="form-label">비밀번호</label>
            <input type="password" class="form-control" id="passwd" name="passwd" placeholder="" required>
        </div>
        <div class="col-12">
            <label for="validationCustomUsername" class="form-label">이메일</label>
            <div class="input-group has-validation">
            <span class="input-group-text" id="inputGroupPrepend">@</span>
            <input type="email" class="form-control" id="email" name="email" placeholder="" required>
            </div>
        </div>
       
        <div class="col-12"><!-- button은 기본 type이 submit 이다. button을 submit으로 쓰지 않을때는 반드시 type="button"을 넣어줘야한다. -->
            <button type="button" class="btn btn-primary" id="signup">가입하기</button>
        </div>
        </form>
<script>
    $('#signup').click(function(){

        var userid = $("#userid").val();
        var email = $("#email").val();
       
        var data = {
            userid : userid,
            email : email
        };
            $.ajax({
                async : false,
                type : 'post' ,
                url : 'signup_check.ajax.php' ,
                data  : data ,
                dataType : 'json' ,//json으로 받음.
                error : function() {} ,
                success : function(return_data) {
                    if(return_data.cnt>0){//조회값이 있으면
                        alert('아이디나 이메일이 이미 가입된 정보입니다. 다시 한번 확인해주세요.');
                        return false;
                    }else{
                        $("form").submit();
                    }
                }
        });
       
    });
</script>
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>

가입하기 버튼을 클릭하면 ajax를 통해 사용중인 아이디인지 이메일인지 확인하고 처리해준다. ajax파일을 확인해보자.

 

/member/signup_check.ajax.php

<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
ini_set( 'display_errors', '0' );

$userid = $_POST['userid'];
$email = $_POST['email'];

$query2="select count(*) as cnt from members where userid='".$userid."' or email='".$email."'";
$result2 = $mysqli->query($query2) or die("query error => ".$mysqli->error);
$rs2 = $result2->fetch_object();

$data = array("cnt"=>$rs2->cnt);//cnt에 값이 있으면 이미 사용중인 값이다.
echo json_encode($data);

?>
       

아이디가 중복인지 이메일이 중복인지 알려줘도 되지만 보안상 안알려주는 것이 좋다. 사용자에게 너무 많은 정보를 주는 것은 좋지 않다. 친절한 것은 독이 될 수도 있다.

 

자 중복값이 없으면 저장해보자. 저장하기전에도 한번더 중복을 확인해준다.

 

/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);

$query2="select count(*) as cnt from members where userid='".$userid."' or email='".$email."'";//한번더 체크
$result2 = $mysqli->query($query2) or die("query error => ".$mysqli->error);
$rs2 = $result2->fetch_object();
if($rs2->cnt){
    echo "<script>alert('아이디나 이메일이 이미 가입된 정보입니다. 다시 한번 확인해주세요.');history.back();</script>";
    exit;
}

$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;
}

?>

이렇게 하면 된다. 회원 가입시의 소스를 보니 쿠폰 발급 함수가 있다. 저놈을 좀 수정해보자. 비주얼스튜디오코드를 사용하고 있다면 user_coupon 위에 커서를 놓고 F12키를 누르면 해당 함수가 정의된 있는 파일에 있는 함수로 바로 이동시켜준다.

 

/inc/lib.php

<?php

function user_coupon($userid, $cid, $reason){
    global $mysqli;
    $query="select cid from coupons where cid=".$cid;
    $result = $mysqli->query($query) or die("query error => ".$mysqli->error);
    $rs = $result->fetch_object();

    if($rs->cid==1){//회원가입시 지급되는 쿠폰은 1회만 지급해야 하므로 지급한 내역이 있는지 확인
        $query2="select count(*) as cnt from user_coupons where couponid=".$rs->cid." and userid='".$userid."'";
        $result2 = $mysqli->query($query2) or die("query error => ".$mysqli->error);
        $rs2 = $result2->fetch_object();

        if(!$rs2->cnt){//이미 지급된 적이 없으면
            $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(".$rs->cid.", '".$userid."', 1, '".$last_date."', now(), '".$reason."')";
            $ins=$mysqli->query($sql) or die($mysqli->error);
        }
    }else{
        if($rs->status==2){//실제 사용중인 쿠폰이면 쿠폰 발급
            $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(".$rs->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);
}

function my_mileage($userid){
    global $mysqli;
    $query="SELECT sum(mileage_plus) - sum(mileage_minus) as mymileage
            FROM testdb.mileage_history
            where userid='".$userid."' and status=1    
            and date(startdate)<=date(now()) and date(enddate)>=date(now())";
    $result = $mysqli->query($query) or die("query error => ".$mysqli->error);
    $rs = $result->fetch_object();
    $mymileage = $rs->mymileage;

    $sql2 = "INSERT INTO `mileage`
    (`userid`,
    `mileage`)
    VALUES
    ('".$userid."',
    ".$mymileage.") ON DUPLICATE KEY UPDATE mileage=mileage+".$mymileage;
    $ins2=$mysqli->query($sql2) or die($mysqli->error);

    return $mymileage;
}

?>

쿠폰 발급 부분도 중복 발급이 되지 않도록 수정해줬다. 다음엔 주문시 쿠폰 적용하는 것을 해보겠다.

 

반응형

+ Recent posts