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

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

QA

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>";
?>

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

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

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

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

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 파일은 이렇게 되어 있습니다.


<?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');
?>



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


    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>";
        }


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

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에 연결이 되는지 확인해 보세요


// 데이터베이스 연결 코드
$conn = new mysqli($db_host, $db_user, $db_password, $db_name);

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


2.

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

// 위의 코드에서 <td class="qaan04-a02"> 부분들을 
<td class='qaan04-a02'> 이렇게 수정하시면 됩니다.

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

말씀하신데로 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 에서 연결은 정상적으로 되는 것 같습니다.
죄송하지만 추가 조언 부탁드려도 될까요?
감사합니다.


<?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);
}

?>

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

 

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

실질적으로 페이지 상단에 include_once('./_common.php'); 이렇게만 되어있으면 db에는 접속된거라 생각하시면 되고 작업하실때 sql 및 변수명으로 작업하시면 됩니다. 위에 코드에서는 $conn 변수를 사용했기 때문에 db에 접속이 되어있다고 해도 함수를 호출하지 못하는 상황이였던 겁니다.

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

$conn

 대신

$g5['connect_db'] = $connect_db;

를 이용해 보세요.

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

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

제가 정말 초보다 보니 좀더 자세한 조언 부탁드립니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 125,873 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT