php 특정 id의 특정 컬럼에 있는 값들을 테이블에 표시하고 특정 값들을 변형하여 표시하기
본문
안녕하세요.
다음과 같이 db 값을 가져와서 표시할려고 합니다.
그런데...
자꾸 에러가 나네요.
어떻게 하면 될까요.
페이지 이동을 클릭하여 페이지 오픈하면
"30일간 총 사용시간 : --분
테이블에
사용일 / 사용시간 / 시작전 단계 / 시작후 단계 / 변화된 단계(시작후 단계-시작전 단계) / 만족도"
이렇게 테이블을 만들려고 합니다.
그리고,
한페이지에 "사용일" 기준 최신순으로 10개씩 표시되고 밑에 다음 또는 1 2 3 4 이렇게 표시되게 하여 넘어 갈 수 있게 할려고 합니다.
먼저 MYSQL 은 이렇게 되어 있습니다.
테이블은 이렇게 되어 있습니다.
CREATE TABLE `g5_member_using_history` (
`mb_no` INT(11) NOT NULL AUTO_INCREMENT,
`mb_id` VARCHAR(20) NULL DEFAULT '' COLLATE 'utf8_general_ci',
`mb_datetime` TIMESTAMP NOT NULL DEFAULT current_timestamp(),
`mb_using_date` DATE NOT NULL,
`mb_hours` VARCHAR(10) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci'
`mb_befor_level` VARCHAR(10) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci',
`mb_after_level` VARCHAR(10) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci',
`mb_satisfaction` VARCHAR(10) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci',
PRIMARY KEY (`mb_no`) USING BTREE,
INDEX `mb_datetime` (`mb_datetime`) USING BTREE,
INDEX `mb_id` (`mb_id`) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=28
;
그리고, 30일간 총 사용시간 관련해서는 이렇게 만들었습니다.
<table class="qaan03">
<thead>
<tr>
<td class="qaan03-a01">
<span style="font-size: 20px; font-weight: bold; ">
<?php if ($is_member) { ?> <?php echo $member['mb_name'] ?> <?php } ?></span>님께서 최근 30일 동안 사용하신 시간은
<?php
// 오늘 날짜와 30일 전 날짜 계산
$today = date('Y-m-d');
$thirtyDaysAgo = date('Y-m-d', strtotime('-30 days'));
// 특정 ID의 값들을 30일 전까지의 값들로 합산
$mb_id = mb_id; // 여기에 특정 ID를 입력하세요.
$sql = "SELECT SUM(mb_using_time) as totalValue FROM g5_member_alphastim_anxiety WHERE id = $mb_id AND mb_using_date BETWEEN '$thirtyDaysAgo' AND '$today'";
$result = $conn->query($sql);
// 쿼리 결과 확인
if ($result) {
$row = $result->fetch_assoc();
$totalValue = $row['totalValue'];
// 결과 출력
echo "$totalValue";
} else {
echo "쿼리 실행 에러: " . $conn->error;
}
?>
분 입니다.<br>
</td>
</tr>
</thead>
</table>
그런데 오류가 나네요.
오류내용은
Warning: Use of undefined constant mb_id - assumed 'mb_id' (this will throw an Error in a future version of PHP) in D:\php\htdocs\theme\ety_mandalorian\mb_an01.php on line 53
Fatal error: Uncaught Error: Call to a member function query() on null in D:\php\htdocs\theme\ety_mandalorian\mb_an01.php:55 Stack trace: #0 D:\php\htdocs\theme\ety_mandalorian\mb_an01.php(28): include_once() #1 {main} thrown in D:\php\htdocs\theme\ety_mandalorian\mb_an01.php on line 55
이렇게 나타납니다.
그리고 테이블은
이것 순서대로 사용일 / 사용시간 / 시작전 단계 / 시작후 단계 / 변화된 단계(시작후 단계-시작전 단계) / 만족도
<?php
// 페이지당 표시할 항목 개수
$items_per_page = 10;
// 현재 페이지 번호 가져오기
$current_page = isset($_GET['page']) ? $_GET['page'] : 1;
$start_from = ($current_page - 1) * $items_per_page;
// SQL 쿼리 작성
$sql = "SELECT mb_using_date, mb_hours, mb_befor_level, mb_before_level, mb_after_level, (mb_after_over_1hr_level - mb_before_level) AS d, mb_satisfaction
FROM g5_member_using_history WHERE id = 'mb_id' ORDER BY mb_using_date DESC LIMIT $start_from, $items_per_page";
// 쿼리 실행
$result = $conn->query($sql);
?>
<table class="qaan04">
<tr>
<th class="qaan04-a01">사용일</th>
<th class="qaan04-a01">사용시간</th>
<th class="qaan04-a01">시작전 단계</th>
<th class="qaan04-a01">시작후 단계</th>
<th class="qaan04-a01">변화된 단계(시작후 단계-시작전 단계)</th>
<th class="qaan04-a01">만족도</th>
</tr>
<?php
// 결과를 반복하여 출력
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td class="qaan04-a02">" . $row['mb_using_date'] . "</td>";
echo "<td class="qaan04-a02">" . $row['mb_hours'] . "</td>";
echo "<td class="qaan04-a02">" . $row['mb_before_level'] . "</td>";
echo "<td class="qaan04-a02">" . $row['mb_after_level'] . "</td>";
echo "<td class="qaan04-a02">" . $row['d'] . "</td>";
echo "<td class="qaan04-a02">" . $row['mb_satisfaction'] . "</td>";
echo "</tr>";
}
} else {
echo "<tr><td colspan='6'>No data found.</td></tr>";
}
?>
</table>
<?php
// 페이징 링크 표시
$sql = "SELECT COUNT(*) AS total FROM g5_member_using_history WHERE id = 'mb_id'";
$result = $conn->query($sql);
$row = $result->fetch_assoc();
$total_pages = ceil($row['total'] / $items_per_page);
echo "<div class='pagination'>";
for ($i = 1; $i <= $total_pages; $i++) {
echo "<a href='?page=" . $i . "'>" . $i . "</a> ";
}
echo "</div>";
?>
이것도 에러가 나는데...
이렇게 표시되네요.
Parse error: syntax error, unexpected 'mb_an01' (T_STRING), expecting ';' or ',' in D:\php\htdocs\theme\ety_mandalorian\mb_an01.php on line 82
그런데 이런 에러가 계속 뜨네요.
고수님들의 조언 부탁드립니다.
감사합니다.
답변 3
mb_id 변수의 정의 문제
mb_id가 사용된 부분에서 변수를 참조하는 것이 아니라 문자열로 인식하고 있으므로 'mb_id'로 문자열 상수로 취급되어 발생한 문제입니다.
$mb_id = mb_id;를 $mb_id = $member['mb_id'];로 수정하여 올바른 변수를 수정
$conn의 NULL 문제
include_once()로 인해 $conn이 초기화되지 않았을 가능성이 있으므로, mb_an01.php에서 $conn을 어디서 초기화하는지 확인해보세요.
qaan04-a02 클래스명 문제
코드 중간에 있는 <td> 요소들에 있는 클래스명 'qaan04-a02'가 따옴표로 묶여있지 않아서 오류가 발생 했을 수 있습니다.
다음과 같이 해볼 수 있을 것 같습니다.
<!-- 최근 30일 사용 시간 출력 -->
<table class="qaan03">
<thead>
<tr>
<td class="qaan03-a01">
<span style="font-size: 20px; font-weight: bold;">
<?php if ($is_member) { ?>
<?php echo $member['mb_name'] ?>
<?php } ?>
</span>님께서 최근 30일 동안 사용하신 시간은
<?php
// 오늘 날짜와 30일 전 날짜 계산
$today = date('Y-m-d');
$thirtyDaysAgo = date('Y-m-d', strtotime('-30 days'));
// 특정 ID의 값들을 30일 전까지의 값들로 합산 (Prepared Statement 사용)
$mb_id = $member['mb_id']; // 이전 코드에서 mb_id를 누락한 것으로 보임. $member['mb_id']와 같이 올바른 변수를 사용하세요.
$sql = "SELECT SUM(mb_hours) as totalValue FROM g5_member_using_history WHERE mb_id = ? AND mb_using_date BETWEEN ? AND ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("sss", $mb_id, $thirtyDaysAgo, $today);
$stmt->execute();
$result = $stmt->get_result();
// 쿼리 결과 확인
if ($result) {
$row = $result->fetch_assoc();
$totalValue = $row['totalValue'];
// 결과 출력
echo "$totalValue";
} else {
echo "쿼리 실행 에러: " . $conn->error;
}
?>
분 입니다.<br>
</td>
</tr>
</thead>
</table>
<!-- 사용 기록 테이블 -->
<table class="qaan04">
<tr>
<th class="qaan04-a01">사용일</th>
<th class="qaan04-a01">사용시간</th>
<th class="qaan04-a01">시작전 단계</th>
<th class="qaan04-a01">시작후 단계</th>
<th class="qaan04-a01">변화된 단계(시작후 단계-시작전 단계)</th>
<th class="qaan04-a01">만족도</th>
</tr>
<?php
// 페이지당 표시할 항목 개수
$items_per_page = 10;
// 현재 페이지 번호 가져오기
$current_page = isset($_GET['page']) ? $_GET['page'] : 1;
$start_from = ($current_page - 1) * $items_per_page;
// SQL 쿼리 작성 (Prepared Statement 사용)
$sql = "SELECT mb_using_date, mb_hours, mb_before_level, mb_after_level, (mb_after_level - mb_before_level) AS d, mb_satisfaction
FROM g5_member_using_history WHERE mb_id = ? ORDER BY mb_using_date DESC LIMIT ?, ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("sii", $mb_id, $start_from, $items_per_page);
$stmt->execute();
$result = $stmt->get_result();
// 결과를 반복하여 출력
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td class='qaan04-a02'>" . $row['mb_using_date'] . "</td>";
echo "<td class='qaan04-a02'>" . $row['mb_hours'] . "</td>";
echo "<td class='qaan04-a02'>" . $row['mb_before_level'] . "</td>";
echo "<td class='qaan04-a02'>" . $row['mb_after_level'] . "</td>";
echo "<td class='qaan04-a02'>" . $row['d'] . "</td>";
echo "<td class='qaan04-a02'>" . $row['mb_satisfaction'] . "</td>";
echo "</tr>";
}
} else {
echo "<tr><td colspan='6'>No data found.</td></tr>";
}
?>
</table>
<!-- 페이징 링크 표시 -->
<?php
// 총 페이지 수 계산
$sql = "SELECT COUNT(*) AS total FROM g5_member_using_history WHERE mb_id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $mb_id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$total_pages = ceil($row['total'] / $items_per_page);
// 페이징 링크 출력
echo "<div class='pagination'>";
for ($i = 1; $i <= $total_pages; $i++) {
echo "<a href='?page=" . $i . "'>" . $i . "</a> ";
}
echo "</div>";
?>
위의 예제를 참고하셔서 원하시는 로직으로 구현하시면 해결 될 수 있을 거라 생각합니다.
!-->해당 오류는 $conn이 null로 설정되어 prepare() 함수를 호출할 수 없기 때문에 발생하는 오류입니다.
dbconfig.php 파일에 데이터베이스 연결 설정이 정의되어 있고 $conn 변수가 선언되어야 합니다.
define('G5_MYSQL_HOST', 'localhost');
define('G5_MYSQL_USER', 'root');
define('G5_MYSQL_PASSWORD', '');
define('G5_MYSQL_DB', 'mbdata');
중간생략 ...
$g5['config_table'] = G5_TABLE_PREFIX.'config'; // 기본환경 설정 테이블
// 여기서부터 추가
$g5['member_cert_history_table'] = G5_TABLE_PREFIX.'member_cert_history'; // 본인인증 변경내역 테이블
// 데이터베이스 연결
$conn = new mysqli(G5_MYSQL_HOST, G5_MYSQL_USER, G5_MYSQL_PASSWORD, G5_MYSQL_DB);
// 데이터베이스 연결 확인
if ($conn->connect_error) {
die("데이터베이스 연결 실패: " . $conn->connect_error);
}
// 여기까지 추가
/theme/ety_mandalorian/mb_an01.php 파일에는 $conn 변수를 사용할 수 있게 되므로 에러가 발생하지 않을 것입니다.
만일 db insert는 정상적으로 되는데도 위와 같은 에러가 발생한다면 다음을 확인해 보셔야 할 것 같습니다.
$sql 변수에 SQL 쿼리가 올바르게 할당되었는지 확인해야 하고, SQL 쿼리가 올바르지 않거나 문법 오류가 있을 경우 prepare() 함수가 실패할 수 있으므로, $sql 변수의 값을 확인하고, 쿼리 문법에 문제가 없는지 다시 검토해보세요
mysqli 객체의 생성과 $conn 변수의 스코프를 확인해야 합니다. dbconfig.php에서 $conn을 정상적으로 생성하고 있는지 다시 확인하고, mb_an01.php 파일에서 $conn을 올바르게 참조하고 있는지 확인래 보세요.
$conn 변수가 함수 내부에서 사용되는 경우, 함수 내부에서 $conn을 전역 변수로 사용할 수 있도록 선언하거나 파라미터로 전달해야 합니다.
데이터베이스 테이블과 관련하여 문제가 있는 경우도 오류의 원인이 될 수 있으니, 테이블 이름, 컬럼 이름, 데이터 타입 등을 정확하게 확인하고 맞춰 주시면 해결이 될 수 있을 것으로 생각합니다.
!-->그누보드(common.php) 사용하시나요?
$conn
대신
$g5['connect_db'] = $connect_db;
를 이용해 보세요.