채택완료

php 특정 id의 특정 컬럼에 있는 값들을 테이블에 표시하고 특정 값들을 변형하여 표시하기

2023-07-26 (수) 17:10:52 2,734

안녕하세요.
다음과 같이 db 값을 가져와서 표시할려고 합니다.
그런데...
자꾸 에러가 나네요.
어떻게 하면 될까요.

페이지 이동을 클릭하여 페이지 오픈하면

"30일간 총 사용시간 :  --분   

테이블에

사용일 / 사용시간 / 시작전 단계 / 시작후 단계 / 변화된 단계(시작후 단계-시작전 단계) / 만족도"


이렇게 테이블을 만들려고 합니다.

그리고,
한페이지에 "사용일" 기준 최신순으로 10개씩 표시되고 밑에 다음 또는 1 2 3 4 이렇게 표시되게 하여 넘어 갈 수 있게 할려고 합니다.

먼저 MYSQL 은 이렇게 되어 있습니다.

테이블은 이렇게 되어 있습니다.

Copy
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일간 총 사용시간 관련해서는 이렇게 만들었습니다.

Copy
<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

이렇게 나타납니다.

그리고 테이블은
이것 순서대로 사용일 / 사용시간 / 시작전 단계 / 시작후 단계 / 변화된 단계(시작후 단계-시작전 단계) / 만족도

Copy
<?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개 / 댓글 7개

채택된 답변
+20 포인트
2023-07-26 (수) 19:53:29

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'가 따옴표로 묶여있지 않아서 오류가 발생 했을 수 있습니다.

다음과 같이 해볼 수 있을 것 같습니다.

Copy
<!-- 최근 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>";
?>

위의 예제를 참고하셔서 원하시는 로직으로 구현하시면 해결 될 수 있을 거라 생각합니다.

답변에 대한 댓글 3개

안녕하세요.
조언 정말로 감사드립니다. 꾸벅.

그런데...
말씀하신데로 적용했는데도 에러가 뜨네요.

말씀하신 내용 중 이 문제 인 것 같은데...

1. "$conn의 NULL 문제
include_once()로 인해 $conn이 초기화되지 않았을 가능성이 있으므로, mb_an01.php에서 $conn을 어디서 초기화하는지 확인해보세요."

사실 제가 설명하신 이 부분이 어떤 설명인지 몰라서 어떻게 해야 할지 모르겠습니다.
죄송한 말이지만 추가 설명 부탁드려도 될까요?

에러 내용은

abc 님께서 최근 30일 동안 사용하신 시간은
Fatal error: Uncaught Error: Call to a member function prepare() on null in D:\php\htdocs\theme\ety_mandalorian\mb_an01.php:66 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 66

입니다.

그리고
include_once()는 bbs/mb_an_01.php에 위치해 있는 파일에 있습니다.

bbs/mb_an_01.php 파일은 이렇게 되어 있습니다.
[code]
<?php
include_once('./_common.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
include_once(G5_LIB_PATH.'/register.lib.php');
include_once(G5_LIB_PATH.'/mailer.lib.php');
include_once(G5_LIB_PATH.'/thumbnail.lib.php');
include_once(G5_THEME_PATH.'/head.php');
include_once(G5_PATH.'/head.sub.php');
?>

<?php
if(!$member['mb_id'])
alert('로그인후 이용하세요.', G5_BBS_URL.'/login.php');
?>
<input type="hidden" name="w" value="<?php echo $w ?>">


<?php
include_once(G5_THEME_PATH.'/head.php');
?>
<br>
<?php
include_once(G5_THEME_PATH.'/mb_an01.php');
?>
<br>
<?php
include_once(G5_THEME_PATH.'/tail.php');
?>
[/code]


2. 그리고 말씀하신 "코드 중간에 있는 <td> 요소들에 있는 클래스명 'qaan04-a02'가 따옴표로 묶여있지 않아서 오류가 발생"에 대하여

[code]
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>";
}
[/code]

바꿨더니 이런 에러 문구가 나오네요.

Parse error: syntax error, unexpected 'app_anlzmain02' (T_STRING), expecting ';' or ',' in D:\php\htdocs\theme\ety_mandalorian\mb_an01.php on line 119


정말 감사하고 죄송한 말이지만...
추가 조언 부탁드립니다. 꾸벅
감사합니다.
1. dbconfig.php 파일에서 $conn 변수로 db에 연결이 되는지 확인해 보세요
[code]
// 데이터베이스 연결 코드
$conn = new mysqli($db_host, $db_user, $db_password, $db_name);

// 데이터베이스 연결 확인
if ($conn->connect_error) {
die("데이터베이스 연결 실패: " . $conn->connect_error);
}
[/code]

2.
[code]
echo "<td class="qaan04-a02">" . $row['mb_using_date'] . "</td>";

// 위의 코드에서 <td class="qaan04-a02"> 부분들을
<td class='qaan04-a02'> 이렇게 수정하시면 됩니다.
[/code]
안녕하세요.
조언 정말 감사드립니다.

말씀하신데로 2번째는 수정했구요.

1번은

dbconfig.php 파일을 밑에 내용처럼 말씀하신 부분을 추가해도 전에 말씀드렸던 똑같은 에러 사인이 나오네요.

"abc 님께서 최근 30일 동안 사용하신 시간은
Fatal error: Uncaught Error: Call to a member function prepare() on null in D:\php\htdocs\theme\ety_mandalorian\mb_an01.php:69 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 69"

line 69 내용은

$stmt = $conn->prepare($sql);

이구요.

db insert는 정상적으로 되는 걸로 봐서 dbconfig.php 에서 연결은 정상적으로 되는 것 같습니다.
죄송하지만 추가 조언 부탁드려도 될까요?
감사합니다.

[code]
<?php
if (!defined('_GNUBOARD_')) exit;
define('G5_MYSQL_HOST', 'localhost');
define('G5_MYSQL_USER', 'root');
define('G5_MYSQL_PASSWORD', '');
define('G5_MYSQL_DB', 'mbdata');
define('G5_MYSQL_SET_MODE', true);

define('G5_TABLE_PREFIX', 'g5_');

define('G5_TOKEN_ENCRYPTION_KEY', 'af968252af7844ab025f80cebe006932'); // 토큰 암호화에 사용할 키

$g5['write_prefix'] = G5_TABLE_PREFIX.'write_'; // 게시판 테이블명 접두사

$g5['auth_table'] = G5_TABLE_PREFIX.'auth'; // 관리권한 설정 테이블
$g5['config_table'] = G5_TABLE_PREFIX.'config'; // 기본환경 설정 테이블


중간생략


$g5['member_cert_history_table'] = G5_TABLE_PREFIX.'member_cert_history'; // 본인인증 변경내역 테이블

// 데이터베이스 연결 확인
if ($conn->connect_error) {
die("데이터베이스 연결 실패: " . $conn->connect_error);
}

?>
[/code]
2023-07-27 (목) 06:50:24

그누보드(common.php) 사용하시나요?

$conn

 대신

$g5['connect_db'] = $connect_db;

를 이용해 보세요.

답변에 대한 댓글 2개

댓글 감사드립니다.
맞습니다. 그누보드(common.php) 5 사용하고 있습니다.

그런데 말씀하신 이것은 어떻게 사용하는 건가요?
$g5['connect_db'] = $connect_db;

제가 정말 초보다 보니 좀더 자세한 조언 부탁드립니다.
$conn->query($sql);
대신
$connect_db->query( $sql);
2023-07-26 (수) 22:55:33

해당 오류는 $conn이 null로 설정되어 prepare() 함수를 호출할 수 없기 때문에 발생하는 오류입니다. 

dbconfig.php 파일에 데이터베이스 연결 설정이 정의되어 있고 $conn 변수가 선언되어야 합니다.

Copy
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을 전역 변수로 사용할 수 있도록 선언하거나 파라미터로 전달해야 합니다.

데이터베이스 테이블과 관련하여 문제가 있는 경우도 오류의 원인이 될 수 있으니, 테이블 이름, 컬럼 이름, 데이터 타입 등을 정확하게 확인하고 맞춰 주시면 해결이 될 수 있을 것으로 생각합니다.

답변에 대한 댓글 2개

안녕하세요.
조언해 주신데로 했더니 되었네요.
너무나 감사드립니다. 꾸벅
실질적으로 페이지 상단에 include_once('./_common.php'); 이렇게만 되어있으면 db에는 접속된거라 생각하시면 되고 작업하실때 sql 및 변수명으로 작업하시면 됩니다. 위에 코드에서는 $conn 변수를 사용했기 때문에 db에 접속이 되어있다고 해도 함수를 호출하지 못하는 상황이였던 겁니다.

답변을 작성하려면 로그인이 필요합니다.