반응형
소스를 보다보니까 회원가입시에 똑같은 아이디로 가입해도 가입이 되는 것을 알게됐다. 사용자가 회원가입 버튼을 눌렀을때 실제 사용중인 아이디이거나 이메일인지 체크하는 로직을 넣어 볼건데 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;
}
?>
쿠폰 발급 부분도 중복 발급이 되지 않도록 수정해줬다. 다음엔 주문시 쿠폰 적용하는 것을 해보겠다.
반응형
'PHP강좌 > 쇼핑몰만들기강좌' 카테고리의 다른 글
php+mysql 쇼핑몰 만들기 강좌 - #37. Ajax가 잘 작동하는지 확인해보자. feat.개발자도구 (0) | 2022.09.21 |
---|---|
php+mysql 쇼핑몰 만들기 강좌 - #36. 장바구니에서 쿠폰 적용하기. (1) | 2022.09.21 |
php+mysql 쇼핑몰 만들기 강좌 - #34. 장바구니에서 제품 삭제 (0) | 2022.09.14 |
php+mysql 쇼핑몰 만들기 강좌 - #33. 마일리지의 사용 (0) | 2022.09.13 |
php+mysql 쇼핑몰 만들기 강좌 - #33. 마일리지(를 얻을때) (0) | 2022.09.02 |