후기를 주문당 한번만 작성하게 가능하게 하려면...

후기를 주문당 한번만 작성하게 가능하게 하려면...

QA

후기를 주문당 한번만 작성하게 가능하게 하려면...

본문

후기를 주문당 한번만 작성하게 하려고

 

이리 알아보고 저리 알아보면서 쿼리를 짜보긴 했는데요...;;

 

로직을 어떤식으로 짜야할까요...??ㅠㅠㅠ

 

후기는 주문이 완료처리 되면 작성가능하게 세팅되어있습니다...;;

 

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 만 빼면 될거 같은데요?

음... 님, 님 우선 답변 감사드립니다.

left 를 빼보니 후기 작성이 가능하기는합니다...

그런데 후기작성시 등록되어질 od_id 를 보니깐 이미 후기를 달았던 od_id 가 불러와지더라구요...;;

현재 2020012010573655 / 2020012011542442  이렇게 주문내역이 있고 둘다 완료처리 상태이고,

작성된 후기의 db에 od_id 값에 2020012010573655 < 이 주문번호는 이미 저장되어있고,

새로 작성될 후기에는 2020012011542442 < 이 주문번호가 불러와져야 하는데

<input type="hidden" name="od_id" value="<?php echo $od_id; ?>">

여기에 담기는 od_id 가 이미 후기작성에 사용된 2020012010573655 < 이 번호가 불러와집니다..;;ㅠㅠㅠ

휴...ㅠㅠㅠ 오기가 생겨서 꼭...! 성공하고싶은데 어렵네요 ㅎㅎ

간단하게 생각하시면 

 

$use_row['cnt'] > 1 로 조건문을 바꾸면 되지 않을까요?

답변 감사드립니다... > 1 로 조건을 바꿔봐도 동일하게 alert 창이 뜨네요;;ㅠㅠ

완료처리된 od_id 값이 이미 한번 후기 작성된 od_id 값을 불러 와서 alert이 뜨는거 같네요;;ㅠㅠㅠ

카트테이블에 ct_history 보면 완료처리된 시간을 기준으로 최근에 완료처리된 od_id 값을 불러오게 하면 가능할 것 같은데...

ct_history 에 담긴 데이터가 완료|admin|완료처리된 시간|아이피 이렇게 담기는데...

ct_history에서 시간만 가져와서 order by 시키려면 어떻게 불러와야하는지... 그 부분에서 막혔네요;;ㅠㅠㅠㅠ

개발자가 아니다보니... 이론상으로는 '이렇게 하면 될 것 같은데' 라는 생각은 하는데 막상 직접 구현을 못하니..ㅠㅠㅠ

밑에 님이 말씀하신대로 left join 을 join 으로 바꾸기만 해도 되겠는데요?

님이 말씀하신대로 해도 결국 시간 계산 같은게 들어가니 join 으로 바꿔서 한번 해보세요

원래대로 하면 위의 쿼리에 subquery 를 짜는게 좋아보이기는 하는데 그렇게는 힘들거 같으니까요

님이 주신 정보로는 주문 번호에 대한건 알수가 없죠 ^^

 

저랑 님은 쿼리랑 소스만 보고 판단하니 그 이상을 알수가 없습니다.ㅋㅋ

 

근데 쭉 보니 위에 쿼리에서 order by od_id 이걸 order by od_id desc; 로 바꾸면 되지 싶기도 하네요

아 제가 주문번호를 알려드린거는...

제 생각대로였다면... 이미 등록된 후기에는 2020012010573655 < 요 주문번호가 물려있어서

재구매 후 후기를 작성할때는 2020012011542442 < 요 주문번호를 가져와서 db에 저장해야되는데

2020012010573655 계속 이 주문번호만 가져오는 것 때문이었습니다...

알려주신 desc 추가하는 방법으로 최근 주문번호로 잘 불러와지는 것 같습니다;;

뭔가 찝찝하지만 해결은 된 것 같아요!! 감사드립니다!!

제가 보기에는 현재 로직에서 페이지하고 od_id 가 같이 움직이거나 따로 od_id 를 사용자로 하여금 선택하게 해야 할 것같습니다. 같이 움직이는 경우 od_id 가 url 파라메타로 같이 움직이겠고 선택이면 select option  처리해야겠죠? 

-> 페이지에서 주문1개만 취급이면 url 파라메타 사용

-> 페이지에서 주문2개 이상 취급이면 선택처리

님 두 분께 감사드립니다!!

 

살짝 아직 확실한 방법으로 구현된건 아니지만... 일단 제가 생각했던대로 결과는 잘 되는 듯합니다..

 

채택을 드려야하는데... 채택을 두분 다 드려야하는데ㅠㅠㅠㅠ 난감하네요;;ㅠㅠㅠ

구매이력이 없는 상품도 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("후기는 주문당 한번만 작성 가능힙니다.");
    }

시실 그내용은 sql 기본으로 on 과 where 의 차이가 아닙니다.

where 은 조건문이고 on 그러니까 join 문은 데이타 곱에 의한 매칭 시스템입니다.

뭐 이렇게 설명드려도 어려우시겠지만 하나하나 배워가시면 공부가 될겁니다.

sql 부터 차근차근 해보세요 ^^

아... on 절은 join 문으로 쿼리를 짤때 쓰고, where 은 말씀해주신대로 조건을 걸어주는 거는 이해했습니다!!

휴... php 도 그냥 있는 소스 가져다가 조건으로 구분짓고 그런 정도인데... sql 까지 건드리려다보니 너무 알아야할게 많네요 ㅎㅎ

재밌긴한데 로직을 어떻게 짜야 2~3번 일을 안하고, 깔끔한 코드가 나올까... 잘 알지도 못하면서 저런 생각까지 해가면서 구현하려니 더 어려운거 같아요;;ㅠㅠㅠㅠ

답변 감사드립니다~ 열심히 배우겠습니다!

드리블님 혹시 해결하셨나요?ㅠ 저도 이거하고있는데 소스공유좀 해주시면안될까요 ㅠ

휴가중이었어서... 이제야 확인했네요;;ㅠㅠ

도움이 되지 못해 죄송합니다....ㅠㅠ

제가 개발자가 아니어서 그때그때 개발로 처리해야하는 이슈발생하면 sir에 문의로 해결하고는 있는데 계속 개발을 만지는게 아니다보니...ㅠㅠ 기억이 가물가물합니다ㅠㅠㅠㅠ

답변달아놓은 소스가 다일것같은데요ㅠㅠㅠ

지금 본문의 내용과 적용됐다고 제가 올린 답변달아놓은거로만 유추해보면...

1. db phpmysql에서 shop_item_use_table 에 od_id라는 컬럼을 추가해줘야 하고,
2. cart_table 과 use_table 을 대조해서 use_table 에 od_id, mb_id, it_id, ct_status 의 값과 매칭시켜서 해당하는 db의 수를 체크해서 값이 있냐없냐에 따라 후기작성가능하게할지 alert 를 띄울지 정하는 것 같은데요...

지금 생각해본다고하면... 저기서 보완한다고하면 후기작성 버튼을 상세페이지에 심는게 아닌

주문상세내역에서 주문상품목록의 각 상품마다 후기작성 버튼을 심어주는게 나을수도 있겠다라는 생각도 듭니다.

해결됐다고 답변달아놓은것처럼하게 되면 이슈는... 최근 주문번호로만 대조되기 때문에

이전 주문건에 대해서는 후기를 달 수가 없어집니다...;; 그래서 bluewind 님 답변이 후기작성이 후기를 작성할 주문번호를 select 할 수 있게 처리해야한다 라고 말씀하신 것 같네요...

저때는 무슨 말씀인지 이해가 안됐었는데... 지금 다시 보니 이전 주문에 대한 후기 작성 처리를 위한 방법으로 말씀해주신것 같습니다.ㅠㅠㅠㅠ

무튼 말이 많아졌지만... 지금으로써는 제 기준에서는 저건 해결책은 아닌 것 같습니다ㅠㅠㅠ 그냥 야매로 당장 급하게 쓸 수는 있을지 몰라도... 로직을 좀 더 단단하게 짜야할 것 같아요ㅠㅠㅠ 도움이 되질 못해서 죄송합니다;;

답변을 작성하시기 전에 로그인 해주세요.
전체 1

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT