후기를 주문당 한번만 작성하게 가능하게 하려면...
본문
후기를 주문당 한번만 작성하게 하려고
이리 알아보고 저리 알아보면서 쿼리를 짜보긴 했는데요...;;
로직을 어떤식으로 짜야할까요...??ㅠㅠㅠ
후기는 주문이 완료처리 되면 작성가능하게 세팅되어있습니다...;;
g5_shop_cart_table / g5_shop_item_use_table 을 가지고 이리저리 해보고 있는데
생각한대로 잘 되질 않아 문의 남겨봅니다ㅠㅠㅠ
/skin/shop/basic/itemuseform.skin.php
<input type="hidden" name="it_id" value="<?php echo $it_id; ?>">
<input type="hidden" name="is_id" value="<?php echo $is_id; ?>">
<input type="hidden" name="od_id" value="<?php echo $od_id; ?>">
/shop/itemuseformupdate.php
$is_id = (int) trim($_REQUEST['is_id']);
$od_id = trim($_REQUEST['od_id']); // od_id
// if( $w == "" ) < 아래 내용
$sql = "insert {$g5['g5_shop_item_use_table']}
set it_id = '$it_id',
mb_id = '{$member['mb_id']}',
is_score = '$is_score',
is_name = '$is_name',
is_password = '$is_password',
is_subject = '$is_subject',
is_content = '$is_content',
is_time = '".G5_TIME_YMDHIS."',
is_ip = '{$_SERVER['REMOTE_ADDR']}',
od_id = '$od_id' "; // 후기 등록시 주문번호도 저장
if (!$default['de_item_use_use'])
$sql .= ", is_confirm = '1' ";
sql_query($sql);
if ($default['de_item_use_use']) {
$alert_msg = "평가하신 글은 관리자가 확인한 후에 출력됩니다.";
} else {
$alert_msg = "사용후기가 등록 되었습니다.";
}
/shop/itemform.php
// 사용후기 작성 설정에 따른 체크
check_itemuse_write($it_id, $member['mb_id']);
$sql = " select od_id from {$g5['g5_shop_cart_table']}
where it_id = '$it_id'
and mb_id = '{$member['mb_id']}'
and ct_status = '완료'
order by od_id ";
$row = sql_fetch($sql);
$od_id = $row['od_id']; // cart_table에서 주문완료처리된 od_id 를 가져옴
$use_sql = " select count(*) as cnt
from {$g5['g5_shop_cart_table']} a
left join {$g5['g5_shop_item_use_table']} b
on ( a.od_id = b.od_id )
and ( a.it_id = b.it_id )
and ( a.mb_id = b.mb_id )
and ( a.ct_status = '완료' ) ";
$use_row = sql_fetch($use_sql);
if ( $use_row['cnt'] ){
alert_close("후기는 주문당 한번만 작성 가능힙니다.");
}
우선 제가 생각한 방법은... 후기 작성시 주문번호를 g5_shop_item_use_table 에 od_id 필드를 만들고 db에 저장하고
g5_shop_cart_table 과 g5_shop_item_use_table 2개의 테이블에서
od_id / it_id / mb_id 를 대조해서 모두 일치하는 거를 데이터를 카운팅하고
count 되면 alert 를 띄우는 식으로 한건데...
재구매후 완료처리하고 후기를 작성하려하면 위에 작성한 alert가 뜹니다...;;(od_id 값이 동일한거로 되어있어서 그런거같지만... 잘 몰라서..ㅠㅠ)
진짜... 저런거 로직짜려면 개발자분들 머리 아프시겠네요...ㅠㅠㅠㅠ 존경합니다...
!-->!-->!-->답변 7
쿼리에서 left join 하는데 그럼 후기가 없어도 row 가 1 은 나옵니다.
그냥 거기서 left 만 빼면 될거 같은데요?
간단하게 생각하시면
$use_row
[
'cnt'
] > 1 로 조건문을 바꾸면 되지 않을까요?
님이 주신 정보로는 주문 번호에 대한건 알수가 없죠 ^^
저랑 @bluewind777 님은 쿼리랑 소스만 보고 판단하니 그 이상을 알수가 없습니다.ㅋㅋ
근데 쭉 보니 위에 쿼리에서 order by od_id 이걸 order by od_id desc; 로 바꾸면 되지 싶기도 하네요
제가 보기에는 현재 로직에서 페이지하고 od_id 가 같이 움직이거나 따로 od_id 를 사용자로 하여금 선택하게 해야 할 것같습니다. 같이 움직이는 경우 od_id 가 url 파라메타로 같이 움직이겠고 선택이면 select option 처리해야겠죠?
-> 페이지에서 주문1개만 취급이면 url 파라메타 사용
-> 페이지에서 주문2개 이상 취급이면 선택처리
@백수1995 님 @bluewind777 님 두 분께 감사드립니다!!
살짝 아직 확실한 방법으로 구현된건 아니지만... 일단 제가 생각했던대로 결과는 잘 되는 듯합니다..
채택을 드려야하는데... 채택을 두분 다 드려야하는데ㅠㅠㅠㅠ 난감하네요;;ㅠㅠㅠ
구매이력이 없는 상품도 alert_close 가 실행되는 상황이 생겨서
$use_row['cnt'] 를 찍어보니 2가 출력되더라구요...;;
그래서 좀 더 확실하게 매칭시켜보려고 on and 를 잘못쓴거 같아 혹시나하는 마음에 sql on and 를 검색해보니
on 과 where 의 차이를 알려주는 글이 있더라구요... 그 글을 보고 해결한 방법입니다...;;
on 에서 where 로 바꿔줬습니다..;;
where 로 od_id / it_id / mb_id / ct_status 를 매칭시켜서 해보니
주문을 하지 않은 상품은 $use_row['cnt'] 가 0으로 제대로 출력됩니다..
/shop/itemform.php
$sql = " select od_id from {$g5['g5_shop_cart_table']}
where it_id = '$it_id'
and mb_id = '{$member['mb_id']}'
and ct_status = '완료'
order by od_id desc ";
$row = sql_fetch($sql);
$od_id = $row['od_id'];
$use_sql = " select count(*) as cnt
from {$g5['g5_shop_cart_table']} a join {$g5['g5_shop_item_use_table']} b
where b.od_id = '$od_id'
and a.it_id = '$it_id'
and a.mb_id = '{$member['mb_id']}'
and a.ct_status = '완료' ";
$use_row = sql_fetch($use_sql);
if ( $use_row['cnt'] > 1 ){
alert_close("후기는 주문당 한번만 작성 가능힙니다.");
}
드리블님 혹시 해결하셨나요?ㅠ 저도 이거하고있는데 소스공유좀 해주시면안될까요 ㅠ