크롬80버전 결제 이슈, 영카트5 주요패치 확인!

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

컨텐츠몰 10% 할인 기간연장!
그누보드5
영카트5
매뉴얼
Q & A
제작의뢰
컨텐츠몰
부가서비스
소모임
커뮤니티
후기를 주문당 한번만 작성하게 가능하게 하려면...

QA

SIR 컨텐츠몰 10% 특별할인 - 코로나19 바이러스로 어려운 시기, SIR이 함께 하겠습니다.

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

본문

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

 

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

 

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

 

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

 

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 값이 동일한거로 되어있어서 그런거같지만... 잘 몰라서..ㅠㅠ)

 

진짜... 저런거 로직짜려면 개발자분들 머리 아프시겠네요...ㅠㅠㅠㅠ 존경합니다...

이 글을 내 페이스북 계정으로 보내기 이 글을 내 트위터 계정으로 보내기

이 질문에 댓글 쓰기 :

답변 6

채택됨

bluewind777님의 답변

쿼리에서 left join 하는데 그럼 후기가 없어도 row 가 1 은 나옵니다.

그냥 거기서 left 만 빼면 될거 같은데요?

주소복사
채택됨
답변의 댓글
coDribble님의 댓글
음... 님, 님 우선 답변 감사드립니다.

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 < 이 번호가 불러와집니다..;;ㅠㅠㅠ

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

백수1995님의 답변

간단하게 생각하시면 

 

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

주소복사
답변의 댓글
coDribble님의 댓글
답변 감사드립니다... > 1 로 조건을 바꿔봐도 동일하게 alert 창이 뜨네요;;ㅠㅠ

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

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

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

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

개발자가 아니다보니... 이론상으로는 '이렇게 하면 될 것 같은데' 라는 생각은 하는데 막상 직접 구현을 못하니..ㅠㅠㅠ
백수1995님의 댓글
밑에 님이 말씀하신대로 left join 을 join 으로 바꾸기만 해도 되겠는데요?

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

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

백수1995님의 답변

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

 

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

 

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

주소복사
답변의 댓글
coDribble님의 댓글
아 제가 주문번호를 알려드린거는...

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

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

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

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

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

bluewind777님의 답변

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

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

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

주소복사
답변의 댓글

coDribble님의 답변

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

 

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

 

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

주소복사
답변의 댓글

coDribble님의 답변

구매이력이 없는 상품도 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("후기는 주문당 한번만 작성 가능힙니다.");
    }
주소복사
답변의 댓글
백수1995님의 댓글
시실 그내용은 sql 기본으로 on 과 where 의 차이가 아닙니다.

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

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

sql 부터 차근차근 해보세요 ^^
coDribble님의 댓글
아... on 절은 join 문으로 쿼리를 짤때 쓰고, where 은 말씀해주신대로 조건을 걸어주는 거는 이해했습니다!!

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

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

답변 감사드립니다~ 열심히 배우겠습니다!
답변을 작성하시기 전에 로그인 해주세요.
전체 85,637 | RSS
고마운 분의 도움으로 질문을 해결하셨다면, 채택을 눌러서 감사의 마음을 전하세요.
어떻게 질문해야 할지 모른다면 질문하는 방법을 읽어 보신후 질문해 보세요.
QA 내용 검색

회원로그인

(주)에스아이알소프트 (06253) 서울특별시 강남구 도곡로1길 14, 6층 624호 (역삼동, 삼일프라자) 대표메일:admin@sir.kr
사업자등록번호:217-81-36347 대표:홍석명 통신판매업신고번호:2014-서울강남-02098호 개인정보보호책임자:이총

© SIRSOFT