alert 관련하여 질문합니다.
본문
카카오톡의 프로모션용 이모티콘 비슷한 기능을 구현을 하고 있습니다.
링크에 들어가서 데이터베이스 테이블에 해당 필드가 없는 경우에 생성하고
매시지를 띄우고 그 다음에 promo_emoticon_1부터 5까지의 필드 값을 1로 집어넣고 promo_emoticon_date1부터 5까지 필드에 현재 날짜로 부터 30일 후의 날짜를 를 계산해서 집어넣고 메시지를 띄우고
이미 promotion_emoticon_1부터 5필드에 값이 1인경우 이미 받았다고 뜨도록 했습니다.
문제는 처음엔 잘되다가 로그아웃 하고 다시 로그인하면 크롬, 오페라에서 캐쉬 삭제를 하지 않으면 alert(메시지 출력이)가 안되는 현상이있습니다.
엣지, 파이어폭스에선 캐쉬 삭제 없이도 몇번 반복해 봐도 잘됩니다.
chatgpt로 해결을 시도했지만 명확한 해결책을 주지 못했습니다.
[code]
<?php
// 데이터베이스 연결을 포함하여 필요한 설정 로드
include_once('../common.php');
// 사용자가 회원인지 여부를 확인
if (!$is_member) {
// 비회원인 경우 경고 메시지를 표시하고 리디렉션
header('Content-Type: text/html; charset=utf-8');
echo "
<script>
document.addEventListener('DOMContentLoaded', function() {
alert('회원만 접속 가능합니다'); // 경고 메시지
window.location.replace('https://test.neonserver.space/'); // 메인 페이지로 리디렉션
});
</script>";
exit; // 스크립트 종료
}
// 프로모션 이모티콘 관련 필드를 자동으로 생성하는 로직
$columnAdded = false; // 컬럼이 추가되었는지 여부를 나타내는 변수
// 이모티콘 필드와 해당 날짜 필드 자동 생성 (1~30)
for ($i = 1; $i <= 30; $i++) {
$emoticonId = "promo_emoticon$i"; // 이모티콘 상태 필드명
$dateColumnId = "promo_emoticon_date$i"; // 이모티콘 만료 날짜 필드명
// g5_member 테이블에 이모티콘 상태 필드가 존재하지 않으면 추가
if (sql_num_rows(sql_query("SHOW COLUMNS FROM g5_member LIKE '$emoticonId';")) == 0) {
sql_query("ALTER TABLE g5_member ADD COLUMN $emoticonId TINYINT(1) DEFAULT 0;"); // 기본값은 0 (미지급 상태)
$columnAdded = true; // 컬럼이 추가되었음을 기록
}
// g5_member 테이블에 이모티콘 만료 날짜 필드가 존재하지 않으면 추가
if (sql_num_rows(sql_query("SHOW COLUMNS FROM g5_member LIKE '$dateColumnId';")) == 0) {
sql_query("ALTER TABLE g5_member ADD COLUMN $dateColumnId DATE DEFAULT NULL;"); // 기본값은 NULL
$columnAdded = true;
}
}
// 새 컬럼이 추가된 경우 경고 메시지 표시 후 리디렉션
if ($columnAdded) {
echo "
<script>
document.addEventListener('DOMContentLoaded', function() {
alert('무료 기간제 이모티콘 필드가 추가되었습니다.');
window.location.href = 'https://test.neonserver.space/'; // 리디렉션
});
</script>";
exit;
}
// 현재 회원의 아이디를 가져옴
$memberId = $member['mb_id'];
// 이모티콘 상태 및 만료 날짜 필드 배열 생성
$emoticonFields = []; // 이모티콘 상태 필드 배열
$emoticonDateFields = []; // 이모티콘 만료 날짜 필드 배열
// 30개의 이모티콘 필드 및 날짜 필드를 배열에 추가
for ($i = 1; $i <= 30; $i++) {
$emoticonFields[] = "promo_emoticon$i";
$emoticonDateFields[] = "promo_emoticon_date$i";
}
// 현재 회원의 이모티콘 상태를 조회하는 쿼리
$checkQuery = "SELECT " . implode(", ", $emoticonFields) . " FROM g5_member WHERE mb_id = '$memberId'";
$result = sql_fetch($checkQuery); // 쿼리 실행 및 결과 가져오기
$allReceived = true; // 모든 이모티콘이 지급되었는지 여부를 판단하는 변수
// 각 이모티콘 필드를 순회하며 지급 상태 확인
foreach ($emoticonFields as $field) {
if ($result[$field] != 1) { // 이모티콘이 지급되지 않은 경우
$allReceived = false; // 지급되지 않았음을 표시
break;
}
}
// 모든 이모티콘이 이미 지급된 경우 경고 메시지를 표시하고 리디렉션
if ($allReceived) {
echo "
<script>
document.addEventListener('DOMContentLoaded', function() {
alert('이미 이모티콘을 받았습니다.');
window.location.href = 'https://test.neonserver.space/'; // 리디렉션
});
</script>";
exit;
}
// 새로운 이모티콘 지급 및 만료 날짜 설정
$expiryDate = date('Y-m-d', strtotime('+30 days')); // 만료 날짜를 30일 후로 설정
// 각 이모티콘 필드에 지급 상태(1)와 만료 날짜를 업데이트
foreach ($emoticonFields as $key => $emoticonId) {
$dateField = $emoticonDateFields[$key]; // 해당 이모티콘의 만료 날짜 필드
sql_query("UPDATE g5_member SET $emoticonId = 1, $dateField = '$expiryDate' WHERE mb_id = '$memberId'"); // 업데이트 쿼리 실행
}
// 이모티콘 지급 완료 메시지 표시 후 리디렉션
echo "
<script>
document.addEventListener('DOMContentLoaded', function() {
alert('무료 기간제 이모티콘이 활성화되었습니다.');
window.location.href = 'https://test.neonserver.space/'; // 리디렉션
});
</script>";
exit; // 스크립트 종료
?>
[/code[]
답변 1
copilot 답은 아래처럼 해 보고 안되면 HTTP 헤더와 메타 태그를 사용하여 브라우저가 최신 콘텐츠를 가져오도록 하라고 하네요.
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<?php
// 데이터베이스 연결을 포함하여 필요한 설정 로드
include_once('../common.php');
// 사용자가 회원인지 여부를 확인
if (!$is_member) {
// 비회원인 경우 경고 메시지를 표시하고 리디렉션
echo "
<script>
document.addEventListener('DOMContentLoaded', function() {
alert('회원만 접속 가능합니다'); // 경고 메시지
window.location.replace('https://test.neonserver.space/'); // 메인 페이지로 리디렉션
});
</script>";
exit; // 스크립트 종료
}
// 프로모션 이모티콘 관련 필드를 자동으로 생성하는 로직
$columnAdded = false; // 컬럼이 추가되었는지 여부를 나타내는 변수
// 이모티콘 필드와 해당 날짜 필드 자동 생성 (1~30)
for ($i = 1; $i <= 30; $i++) {
$emoticonId = "promo_emoticon$i"; // 이모티콘 상태 필드명
$dateColumnId = "promo_emoticon_date$i"; // 이모티콘 만료 날짜 필드명
// g5_member 테이블에 이모티콘 상태 필드가 존재하지 않으면 추가
$checkColumnQuery = "SHOW COLUMNS FROM g5_member LIKE ?";
$stmt = $dbConnection->prepare($checkColumnQuery);
$stmt->bind_param("s", $emoticonId);
$stmt->execute();
if ($stmt->get_result()->num_rows == 0) {
$alterTableQuery = "ALTER TABLE g5_member ADD COLUMN ? TINYINT(1) DEFAULT 0;";
$stmt = $dbConnection->prepare($alterTableQuery);
$stmt->bind_param("s", $emoticonId);
$stmt->execute();
$columnAdded = true;
}
$stmt->bind_param("s", $dateColumnId);
$stmt->execute();
if ($stmt->get_result()->num_rows == 0) {
$alterTableQuery = "ALTER TABLE g5_member ADD COLUMN ? DATE DEFAULT NULL;";
$stmt = $dbConnection->prepare($alterTableQuery);
$stmt->bind_param("s", $dateColumnId);
$stmt->execute();
$columnAdded = true;
}
$stmt->close();
}
// 새 컬럼이 추가된 경우 경고 메시지 표시 후 리디렉션
if ($columnAdded) {
echo "
<script>
document.addEventListener('DOMContentLoaded', function() {
alert('무료 기간제 이모티콘 필드가 추가되었습니다.');
window.location.href = 'https://test.neonserver.space/'; // 리디렉션
});
</script>";
exit;
}
// 현재 회원의 아이디를 가져옴
$memberId = $member['mb_id'];
// 이모티콘 상태 및 만료 날짜 필드 배열 생성
$emoticonFields = []; // 이모티콘 상태 필드 배열
$emoticonDateFields = []; // 이모티콘 만료 날짜 필드 배열
// 30개의 이모티콘 필드 및 날짜 필드를 배열에 추가
for ($i = 1; $i <= 30; $i++) {
$emoticonFields[] = "promo_emoticon$i";
$emoticonDateFields[] = "promo_emoticon_date$i";
}
// 현재 회원의 이모티콘 상태를 조회하는 쿼리
$checkQuery = "SELECT " . implode(", ", $emoticonFields) . " FROM g5_member WHERE mb_id = ?";
$stmt = $dbConnection->prepare($checkQuery);
$stmt->bind_param("s", $memberId);
$stmt->execute();
$result = $stmt->get_result()->fetch_assoc();
$stmt->close();
$allReceived = true; // 모든 이모티콘이 지급되었는지 여부를 판단하는 변수
// 각 이모티콘 필드를 순회하며 지급 상태 확인
foreach ($emoticonFields as $field) {
if ($result[$field] != 1) { // 이모티콘이 지급되지 않은 경우
$allReceived = false; // 지급되지 않았음을 표시
break;
}
}
// 모든 이모티콘이 이미 지급된 경우 경고 메시지를 표시하고 리디렉션
if ($allReceived) {
echo "
<script>
document.addEventListener('DOMContentLoaded', function() {
alert('이미 이모티콘을 받았습니다.');
window.location.href = 'https://test.neonserver.space/'; // 리디렉션
});
</script>";
exit;
}
// 새로운 이모티콘 지급 및 만료 날짜 설정
$expiryDate = date('Y-m-d', strtotime('+30 days')); // 만료 날짜를 30일 후로 설정
// 각 이모티콘 필드에 지급 상태(1)와 만료 날짜를 업데이트
foreach ($emoticonFields as $key => $emoticonId) {
$dateField = $emoticonDateFields[$key]; // 해당 이모티콘의 만료 날짜 필드
$updateQuery = "UPDATE g5_member SET $emoticonId = 1, $dateField = ? WHERE mb_id = ?";
$stmt = $dbConnection->prepare($updateQuery);
$stmt->bind_param("ss", $expiryDate, $memberId);
$stmt->execute();
}
$stmt->close();
// 이모티콘 지급 완료 메시지 표시 후 리디렉션
echo "
<script>
document.addEventListener('DOMContentLoaded', function() {
alert('무료 기간제 이모티콘이 활성화되었습니다.');
window.location.href = 'https://test.neonserver.space/'; // 리디렉션
});
</script>";
exit; // 스크립트 종료
?>