비밀번호

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

  • 짧은주소 : http://dreamphp.com/s/a0ef

  • 작 성 자 : BiHonHomepage

  • 조 회 수 : 214

  • 등 록 일 : 2018-02-28 16:53:02


  • 최근에 본 상품 순으로 쿠키에 담아 처리하는 방법입니다.
    오래된 방식인데 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를 이용해 캡처하였습니다.

+ 이름

- 홈페이지

+ 내용

+ 비밀번호

* 4~20자

+ CAPTCHA

CAPTCHA Image [새로고침] (대소문자 무시)

  • 번호

  • 제목

  • 이름

  • 등록일

  • 조회수