점프기능 질문드립니다

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
점프기능 질문드립니다

QA

점프기능 질문드립니다

답변 1

본문

blogopk3 게시글 끌어올리기(점프) 이 글 참고했습니다.

팁자료실에도 올려놓았지만 완벽한 코드를 위해서 Q & A 게시판에도 올립니다!
나리야 빌더 사용중입니다.
view.skin.php에 원하는 곳에 추가를 하면 되시는데 게시판 리스트 정렬 필드는 날짜 최근것 부터 적용 하시면 됩니다.

지금 문제점이 admin일때 끌어올리기를 클릭하면 상단에 올라가긴 하는데 다른 게시물 가서 재 클릭 하면 기능이 작동하질 않고 카운트가 올라가질 않아요

아직 일반 유저는 테스트 해보진 않았는데 처음에는 정상적으로 상단에 올라가네요 다시 재 클릭 해보진 않았어요

그리고 로그아웃 한 후 다시 로그인 하면 횟수가 초기화 되네요

재 로그인시 그대로 횟수가 남아있어야 하는데 도저히 모르겠네요
문제점 개선하신 분들 답변 부탁드립니다!ㅠㅠ


<?php
                    // 세션 시작
                    session_start();
 
                    // 글 작성자 또는 관리자만 사용할 수 있도록 조건 설정
                    if ($view['mb_id'] != '' && ($member['mb_id'] == $view['mb_id'] || $is_admin)) {
                        $table = 'g5_write_' . $bo_table;
 
                        // 오늘 날짜
                        $today = date('Y-m-d');
                        $current_time = time();
 
                        // 세션을 사용하여 사용 횟수 추적
                        if (!isset($_SESSION['new_up_usage'])) {
                            $_SESSION['new_up_usage'] = [
                                'date' => $today,
                                'count' => 0, // 사용 횟수
                                'last_used' => 0, // 마지막 사용 시간
                                'refreshed' => false, // 새로 고침 여부를 추적하는 변수
                            ];
                        }
 
                        // 세션의 날짜가 오늘이 아니면 카운트를 초기화
                        if ($_SESSION['new_up_usage']['date'] != $today) {
                            $_SESSION['new_up_usage']['date'] = $today;
                            $_SESSION['new_up_usage']['count'] = 0;
                            $_SESSION['new_up_usage']['last_used'] = 0;
                            $_SESSION['new_up_usage']['refreshed'] = false; // 날짜가 바뀌면 새로 고침을 리셋
                        }
 
                        // 관리자(admin)은 시간에 관계없이 무제한 사용 가능
                        if ($is_admin) {
                            // 관리자일 경우, 사용 횟수는 무제한으로 표시
                            echo "<p>관리자님, 사용 횟수: {$_SESSION['new_up_usage']['count']}번</p>"; // 관리자도 횟수가 늘어남
                            ?>
                            <input id="request_url" type="hidden" value="<?php echo $_SERVER['REQUEST_URI']; ?>" />
                            <button class="btn btn-primary" onclick="new_up()" style="cursor: pointer;">끌어올리기</button>
                            <script type="text/javascript">
                                function new_up() {
                                    var newConfirm = confirm('이 글을 최신글로 등록하겠습니까?');
                                    if (newConfirm) {
                                        location.href = $("#request_url").val() + '&cmd=make_new';
                                    } else {
                                        alert("취소하셨습니다.");
                                    }
                                }
                            </script>
                            <?php
                        } else {
                            // 일반 사용자일 경우
                            // 2시간 제한 (초 단위)
                            $time_difference = $current_time - $_SESSION['new_up_usage']['last_used'];
                            $time_limit = 2 * 60 * 60; // 2시간을 초로 변환
                   
                            // 2시간 이내에 사용한 경우
                            if ($time_difference < $time_limit) {
                                $remaining_time = $time_limit - $time_difference;
                                echo "<p>다시 사용할 수 있는 시간: <span id='remaining_time'>" . gmdate("H:i:s", $remaining_time) . "</span> 후입니다.</p>";
                                echo "<p>현재 사용 횟수: {$_SESSION['new_up_usage']['count']}번, 남은 사용 횟수: " . (12 - $_SESSION['new_up_usage']['count']) . "번</p>";
                                ?>
                                <script type="text/javascript">
                                    var remainingTime = <?php echo $remaining_time; ?>;
                                    setInterval(function () {
                                        remainingTime--;
                                        document.getElementById('remaining_time').textContent = gmdate(remainingTime);
                                        if (remainingTime <= 0) {
                                            clearInterval();
                                        }
                                    }, 1000);
 
                                    function gmdate(seconds) {
                                        var hours = Math.floor(seconds / 3600);
                                        var minutes = Math.floor((seconds % 3600) / 60);
                                        var secs = seconds % 60;
                                        return (hours < 10 ? '0' : '') + hours + ':' + (minutes < 10 ? '0' : '') + minutes + ':' + (secs < 10 ? '0' : '') + secs;
                                    }
                                </script>
                                <?php
                            } else {
                                // "끌어올리기" 기능 버튼 텍스트로 표시
                                ?>
                                <input id="request_url" type="hidden" value="<?php echo $_SERVER['REQUEST_URI']; ?>" />
                                <button class="btn btn-primary" onclick="new_up()" style="cursor: pointer;">끌어올리기</button>
                                <script type="text/javascript">
                                    function new_up() {
                                        var newConfirm = confirm('이 글을 최신글로 등록하겠습니까?');
                                        if (newConfirm) {
                                            location.href = $("#request_url").val() + '&cmd=make_new';
                                        } else {
                                            alert("취소하셨습니다.");
                                        }
                                    }
                                </script>
                                <?php
                            }
 
                            // 하루에 12번 이상 사용을 제한
                            if ($_SESSION['new_up_usage']['count'] >= 12) {
                                echo "<p>하루에 12번만 사용할 수 있습니다. 내일 다시 시도해주세요.</p>";
                            }
                        }
 
                        // "끌어올리기" 기능을 실행하면 사용 횟수를 증가시킴
                        if (isset($_GET['cmd']) && $_GET['cmd'] === 'make_new' && !$_SESSION['new_up_usage']['refreshed']) {
                            // 글 번호를 새로 할당 (가장 작은 번호를 사용하여 첫 페이지 상단으로 이동)
                            $wr_num = 0; // 첫 번째로 위치시키기 위해 가장 작은 번호인 0을 할당
                   
                            // 원글의 wr_num 값이 0일 경우, 다른 글들의 wr_num을 증가시켜야 한다면
                            // 해당 게시글을 상위로 끌어올리기 위한 쿼리
                            sql_query("UPDATE $table SET wr_num = wr_num + 1 WHERE wr_num >= $wr_num");
 
                            // 원글 최신글로 날짜도 현재시간으로
                            $sql = "UPDATE $table SET `wr_num` = '$wr_num', wr_datetime = '" . G5_TIME_YMDHIS . "' WHERE `wr_id` = '{$view['wr_id']}'";
                            sql_query($sql); // sql_query 함수로 쿼리 실행
                   
                            // 해당 답글(댓글)도 최신글로
                            $sql = "UPDATE $table SET `wr_num` = '$wr_num', wr_datetime = '" . G5_TIME_YMDHIS . "' WHERE `wr_num` = '{$view['wr_num']}'";
                            sql_query($sql); // sql_query 함수로 쿼리 실행
                   
                            // 사용 횟수 증가
                            $_SESSION['new_up_usage']['count'] += 1;
                            $_SESSION['new_up_usage']['last_used'] = $current_time; // 마지막 사용 시간을 기록
                   
                            // 새로 고침 플래그 설정
                            $_SESSION['new_up_usage']['refreshed'] = true;
 
                            // 페이지 새로 고침 후 사용 횟수 반영
                            echo "<script>location.reload();</script>";
                        }

 
                    }
                    ?>

이 질문에 댓글 쓰기 :

답변 1

*세션 유지와 데이터 영속성 문제는

  데이터베이스 또는 쿠키 활용으로 해결할 수 있음.

*관리자 및 일반 사용자 조건 처리 로직의 개선이 필요하며,

  특히 플래그(refreshed)와 관련된 로직은 명확히 정리해야 함.

*SQL 쿼리와 관련하여 wr_num 값 관리가 적절히 작동하는지 검증이 필요.

*날짜 초기화와 제한 조건이 정확히 적용되도록 구현

 

- 관리자는 세션의 refreshed 조건을 무시하도록 조건문을 수정하여,

  언제든지 "끌어올리기"를 사용할 수 있도록 개선


if ($is_admin || !$_SESSION['new_up_usage']['refreshed']) {
    // 관리자거나 새로 고침이 아직 적용되지 않은 경우 작동
}

- 세션 데이터를 데이터베이스로 대체하여,

  로그아웃 후에도 사용 횟수와 날짜가 유지되도록 구현. (제안 함)

  -- 제안된 SQL 테이블 구조


CREATE TABLE usage_tracker (
    user_id VARCHAR(50) NOT NULL,
    date DATE NOT NULL,
    usage_count INT DEFAULT 0,
    last_used TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (user_id, date)
);

- 로그인 시 데이터베이스에서 세션으로 불러오기


$sql = "SELECT usage_count, last_used FROM usage_tracker WHERE user_id = '{$member['mb_id']}' AND date = '$today'";
$result = sql_fetch($sql);
if ($result) {
    $_SESSION['new_up_usage'] = [
        'date' => $today,
        'count' => $result['usage_count'],
        'last_used' => strtotime($result['last_used']),
    ];
} else {
    $_SESSION['new_up_usage'] = [
        'date' => $today,
        'count' => 0,
        'last_used' => 0,
    ];
}

- 날짜가 변경되면 세션과 데이터베이스 기록을 동기화하여 초기화.


if ($_SESSION['new_up_usage']['date'] != $today) {
    reset_usage_tracker($user_id);
}

- 제한 2시간을 초과했을 경우, last_used 값을 갱신하여 제한 시간이 제대로 관리되도록 수정


if (!isset($_SESSION['new_up_usage']['last_used']) || $time_difference >= $time_limit) {
    $_SESSION['new_up_usage']['last_used'] = $current_time;
}

.

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 0
© SIRSOFT
현재 페이지 제일 처음으로