쿠키를 이용한 최근 본 상품 구현 > Tip&Tech

본문 바로가기

Tip&Tech

쿠키를 이용한 최근 본 상품 구현

페이지 정보

작성자 BiHon 댓글 0건 조회 394회 작성일 18-02-28 16:53

본문

1519804351360986_5in432anugaktssmrlufhzf22zvmjchg1.gif

최근에 본 상품 순으로 쿠키에 담아 처리하는 방법입니다.
오래된 방식인데 PHP 최신 버전(7.0 이상)에서 실행되도록 다듬어 봤습니다.




<!DOCTYPE html>

<html lang="ko">

<head>

<meta charset="utf-8">

<title>최근 본 상품 예제</title>

</head>

<body>

<?php



error_reporting(E_ALL);

header('Content-Type: text/html; charset=utf-8');



/**

 * 최근 본 상품 번호 목록



 * @param       int    $no      상품 번호

 * @param       int    $limit   최대 개수

 * @return      array

 *

 * @author      BiHon

 * @link        http://dreamphp.com

 */

function latest_view(int $no=0, int $limit=10): array {

    $delimiter = '_';

    $cookie_key = 'latest_view';

    if ( isset($_COOKIE[$cookie_key]) ) {

        $res = explode($delimiter, $_COOKIE[$cookie_key]);

        $res = array_map(function($h){return (int)hexdec($h);}, $res);

    } else {

        $res = [];

    }

    if ( !$no ) return $res;

    if ( ($p = array_search($no, $res, TRUE)) !== FALSE ) {

        unset($res[$p]);

    }

    $res[] = $no;

    $res = array_splice($res, -$limit);

    setcookie($cookie_key

        , implode($delimiter, array_map(function($n){return dechex($n);}, $res))

        , time()+86400*7

        , '/'

        , 'localhost'

        );

    return array_reverse($res);

}



// 이하 사용 예



$no = (int)($_GET['no']??0);

$latest_view = latest_view($no);



$cc = range(238, 64, 12);

$colors = [];

foreach ($cc as $k=>$c)

    $colors[$k+1] = sprintf('%02x%02x%02x/000000', $c, $c, $c );



echo '* 최근 본 상품<br>'.PHP_EOL;

foreach ($latest_view as $no) {

    printf('<a href="?no=%d">'

        .'<img src="http://via.placeholder.com/120x50/%s?text=%s" '

        .'alt="%d"></a> '.PHP_EOL,

        $no, $colors[$no], 'BiHon '.$no, $no);

}



echo '<hr>* <a href="'.$_SERVER['PHP_SELF'].'">상품 목록</a><br>'.PHP_EOL;

foreach (range(15,1) as $k=>$no ) {

    printf('<a href="?no=%d">'

        .'<img src="http://via.placeholder.com/120x50/%s?text=%s" '

        .'alt="%d"></a> '.PHP_EOL,

        $no, $colors[$no], 'BiHon '.$no, $no);

}



?>

</body>

</html>







쿠키가 커질수록 부담도 덩달아 커집니다.

때문에 최근에 본 상품 번호를 쿠키에 저장하겠다면

필요로 하는 최소한의 정보만 담는 것이 낫습니다.





그래서 이 코드는 아래처럼 처리합니다.



- 상품 번호는 16진수로 변환해 저장. 그만큼 줄어듭니다.

- 구분 기호는 _를 사용. 쉼표(Comma ,)는 %2C로 변환되어 길어지거든요.

- 최대 제한(Limit). 예제에서는 10개 제한.

* 민감한 정보가 아니기에 secure, httponly 생략.



사용 가능한 가장 큰 번호는 2,147,483,647(PHP_INT_MAX, 32bit, 7fffffff)입니다.

최대 20개로 제한해, 가장 큰 상품 번호만 저장한다고 해도

쿠키명을 포함해 200 바이트 미만밖에 차지하지 않습니다.



때문에 여기에 정보를 좀 더 추가해 유용하게 활용할 수 있습니다.

이 부분은 사용 나름이니까 생략합니다.





* 참!

- 함수에서 형(Type) 선언, 반환 형식 선언은 PHP 버전 7.0부터.

- NULL 통합 연산자(??)도 PHP 7.0 버전부터.

- 배열 단축 표현 []은 PHP 5.4 버전부터.

- 익명 함수는 PHP 5.3 버전부터.

위 부분만 수정하면 하위 버전에서도 사용 가능합니다. (너무나 당연한 소리)




* ShareX를 이용해 캡처하였습니다.

댓글목록

등록된 댓글이 없습니다.

회원로그인


Copyright © 1998~2019 DreamPHP.com All rights reserved.