유일키 $s_cart_id 가 서로 다른 컴퓨터에서 동일하게 할당될 수 있나요?
본문
A컴퓨터에서 비회원으로 장바구니에 넣은 상품이
일부 회원(B컴퓨터)의 장바구니에 노출이 되고 있어요.
매번 그런것은 아니구요.
그런 경우도 있고, 아닌 경우도 있어요.
예를들면 지금 당장 제가 동일 컴퓨터에서
비회원인 상태에서 1517289447 이 상품을 크롬 브라우저에서 장바구니에 넣고
웨일 브라우저에서 회원으로 로그인을 하고 장바구니를 보면 1517289447 이 상품이 없어요.
그런데, 매번은 아니고 가끔씩..
A컴퓨터에서 비회원이 장바구니에 넣은 상품이
B컴퓨터, C컴퓨터 (임의의 다른 컴퓨터)의 장바구니에 보여지는 것이에요.
유일키가 동일하게 할당이 된 경우인데요.
이럴 수가 있는지요?
shop.lib.php 파일에서
// cart id 설정
function set_cart_id($direct)
{
global $g5, $default, $member;
if ($direct) {
$tmp_cart_id = get_session('ss_cart_direct');
if(!$tmp_cart_id) {
$tmp_cart_id = get_uniqid();
set_session('ss_cart_direct', $tmp_cart_id);
}
} else {
// 비회원장바구니 cart id 쿠키설정
if($default['de_guest_cart_use']) {
$tmp_cart_id = get_cookie('ck_guest_cart_id');
if($tmp_cart_id) {
set_session('ss_cart_id', $tmp_cart_id);
//set_cookie('ck_guest_cart_id', $tmp_cart_id, ($default['de_cart_keep_term'] * 86400));
} else {
$tmp_cart_id = get_uniqid();
set_session('ss_cart_id', $tmp_cart_id);
set_cookie('ck_guest_cart_id', $tmp_cart_id, ($default['de_cart_keep_term'] * 86400));
}
} else {
$tmp_cart_id = get_session('ss_cart_id');
if(!$tmp_cart_id) {
$tmp_cart_id = get_uniqid();
set_session('ss_cart_id', $tmp_cart_id);
}
}
// 보관된 회원장바구니 자료 cart id 변경
if($member['mb_id'] && $tmp_cart_id) {
$sql = " update {$g5['g5_shop_cart_table']}
set od_id = '$tmp_cart_id'
where mb_id = '{$member['mb_id']}'
and ct_direct = '0'
and ct_status = '쇼핑' ";
sql_query($sql);
}
}
}
위 부분에 문제가 있는것 같은데요.
답변 2
그누보드에 있는 get_uniqid() 함수가 트랜젝션 처리가 안되어서 발생하는 문제입니다.
구형 db와 호환성을 위해 lock table 방식으로 유니크아이디를 처리하게 되는데, 완벽하게 무결성이 보장되지 않습니다.
해당 테이블을 innodb 로 변경하시고, 해당 함수내 코드를 트랜젝션 처리로 변경해주세요.
제가 팁란에 공유한걸로 테스트 해보시고, 문제없으면 기존 함수를 대체하세요.
1. 다른 브라우즈끼리는 쿠키를 공유할수 없습니다.
쿠키의 저장정보는 해당 브라우즈 프로그램에서 지정하는 위치에 있고 구조도 달라서 당연히 안됩니다 그러므로 다른 브라우즈의 비회원 장바구니는 가져올수 없음..
2. 동일장바구니 문제는 ss_cart_direct의 이름이 공통이라 가끔 그런듯하네요..
그냥 ss_cart_direct 를 ip마다 다르게
get_session('ss_cart_direct'.$_SERVER[REMOTE_ADDR]);
이런식으로 지정하시면 동일 장바구니 문제는 해결되겠네요.