맴버 여분 필드에 db 저장 질문
본문
chatgpt랑 그누보드 질문 게시판 참조해서 이모티콘샵 기능을 만들고 있습니다.
g5_member 테이블에 emoticon1부터 emoticon20까지의 여분 필드를 생성했습니다.
예를 들어, 사용자가 emoticon1을 구매하면 해당 이모티콘의 가격만큼 포인트가 차감되고,
emoticon1 필드에 숫자 1
을 넣어서 구매한 이모티콘과 구매하지 않은 이모티콘을 구별하려고 합니다.
포인트 차감 부분은 문제없이 동작하지만 여분 필드에 숫자가 들어가지 않습니다.
무엇이 문제일까요?
<?php
$emojis = [
["id" => "emoticon1", "image" => "emoji1.png", "price" => 50],
["id" => "emoticon2", "image" => "emoji2.png", "price" => 100],
["id" => "emoticon3", "image" => "emoji3.png", "price" => 150],
["id" => "emoticon4", "image" => "emoji4.png", "price" => 75],
["id" => "emoticon5", "image" => "emoji5.png", "price" => 125],
["id" => "emoticon6", "image" => "emoji6.png", "price" => 60],
["id" => "emoticon7", "image" => "emoji7.png", "price" => 90],
["id" => "emoticon8", "image" => "emoji8.png", "price" => 110],
["id" => "emoticon9", "image" => "emoji9.png", "price" => 85],
["id" => "emoticon10", "image" => "emoji10.png", "price" => 95],
["id" => "emoticon11", "image" => "emoji11.png", "price" => 70],
["id" => "emoticon12", "image" => "emoji12.png", "price" => 105],
["id" => "emoticon13", "image" => "emoji13.png", "price" => 130],
["id" => "emoticon14", "image" => "emoji14.png", "price" => 150],
["id" => "emoticon15", "image" => "emoji15.png", "price" => 50],
["id" => "emoticon16", "image" => "emoji16.png", "price" => 120],
["id" => "emoticon17", "image" => "emoji17.png", "price" => 140],
["id" => "emoticon18", "image" => "emoji18.png", "price" => 160],
["id" => "emoticon19", "image" => "emoji19.png", "price" => 100],
["id" => "emoticon20", "image" => "emoji20.png", "price" => 170]
];
$mb = get_member($member['mb_id']);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$emojiId = $_POST['emoji_id'];
$emojiPrice = intval($_POST['emoji_price']);
if ($mb['mb_point'] >= $emojiPrice) {
// Update points
$point = -$emojiPrice; // 포인트 설정
$content = '이모티콘 구매 차감';
// insert_point 함수 호출로 포인트 차감
insert_point($member['mb_id'], $point, $content, '@passive', 'emotion' . uniqid(), 'emoticon_buy');
// Update user's emoticon column
$mb[$emojiId] = 1;
sql_query("UPDATE $g5_member SET $emojiId = 1 WHERE mb_id = '{$member['mb_id']}'");
echo "<script>alert('Purchase successful!');</script>";
} else {
echo "<script>alert('Not enough coins!');</script>";
}
}
foreach ($emojis as $emoji) {
echo "<div class='emoji-item'>";
echo "<img class='emoji' src='images/{$emoji['image']}' alt='Emoji'>";
echo "<p>Price: {$emoji['price']} coins</p>";
if (isset($mb[$emoji['id']]) && $mb[$emoji['id']] == 1) {
echo "<button class='bought-btn'>Already Purchased</button>";
} else {
echo "<form method='POST'>";
echo "<input type='hidden' name='emoji_id' value='{$emoji['id']}'>";
echo "<input type='hidden' name='emoji_price' value='{$emoji['price']}'>";
echo "<button type='submit' class='buy-btn'>Buy</button>";
echo "</form>";
}
echo "</div>";
}
?>
답변 2
일단 $g5_member 가 아니라 g5_member 로 바꿔보세요.
※ 확인 사항:
1. $g5_member 변수:
- $g5_member는 실제 테이블 이름이어야 합니다.
- $g5_member = 'g5_member';와 같이 정의했는지 확인하세요.
2. $emojiId 변수:
- $emojiId는 emoticon1, emoticon2 등으로 설정되며,
이는 데이터베이스 컬럼 이름과 일치해야 합니다.
- 컬럼 이름이 잘못되었거나 필드가 존재하지 않으면 쿼리가 실패합니다.
- $emojiId를 출력하여 확인하세요:
echo "Emoji ID: $emojiId";
3. sql_query 함수 결과:
- sql_query가 성공적으로 실행되었는지 확인하려면 결과를 점검해야 합니다:
$result = sql_query("UPDATE $g5_member SET $emojiId = 1 WHERE mb_id = '{$member['mb_id']}'");
if (!$result) {
echo "SQL Error: " . sql_error();
exit;
}
*$g5_member, $emojiId, mb_id 값의 유효성 검증.
// $g5_member 변수 검증
if (empty($g5_member)) {
echo "Table name not defined: \$g5_member is empty.";
exit;
}
// $emojiId 변수 검증
if (!preg_match('/^emoticon[0-9]+$/', $emojiId)) {
echo "Invalid emoji ID: $emojiId";
exit;
}
// $member['mb_id'] 값 검증
if (empty($member['mb_id'])) {
echo "Invalid member ID.";
exit;
}
*sql_error()와 MySQL 로그로 쿼리 실패 원인 확인.
$query = "UPDATE $g5_member SET $emojiId = 1 WHERE mb_id = '{$member['mb_id']}'";
$result = sql_query($query);
if (!$result) {
echo "SQL Error: " . sql_error();
exit;
}
*emoticon1 ~ emoticon20 필드 존재 여부 점검 및 추가.
SHOW COLUMNS FROM g5_member LIKE 'emoticon%';
ALTER TABLE g5_member
ADD COLUMN emoticon1 TINYINT(1) DEFAULT 0,
ADD COLUMN emoticon2 TINYINT(1) DEFAULT 0,
...
ADD COLUMN emoticon20 TINYINT(1) DEFAULT 0;