코딩 공부/PHP

PHP 게시판 페이지 만들기

천서리 2023. 4. 25. 22:47
QUOTE THE DAY

“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”

- 이글슨 (Eagleson)
반응형

PHP란?

PHP는 Hypertext Preprocessor의 약어로, 서버 측에서 실행되는 스크립트 언어입니다. PHP는 주로 동적 웹 페이지를 생성하고 관리하는 데 사용됩니다. PHP는 오픈 소스 언어이며, 웹 서버에서 무료로 실행될 수 있습니다.

 

PHP는 HTML과 함께 사용되며, PHP 코드를 HTML 문서 안에 포함시킬 수 있습니다. 이렇게 함으로써 PHP는 웹 페이지를 동적으로 생성하고 데이터베이스와 상호 작용할 수 있는 능력을 갖춥니다. PHP는 또한 파일 업로드, 이메일 전송, 세션 관리, 암호화, 데이터베이스 연결 등과 같은 기능도 제공합니다.

 

PHP는 많은 유명한 CMS(Content Management System) 및 프레임워크(Framework)에서 사용됩니다. 예를 들어, WordPress, Drupal, Joomla, Laravel, CodeIgniter 등이 있습니다.


board.php

<?php
    $sql = "SELECT b.boardID, b.boardTitle, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) ORDER BY boardID DESC LIMIT 100";
    $result = $connect -> query($sql);

    if($result){
        $count = $result -> num_rows;

        if($count > 0){
            for($i=0; $i<$count; $i++){
                $info = $result -> fetch_array(MYSQLI_ASSOC);

                echo "<tr>";
                echo "<td>".$info['boardID']."</td>";
                echo "<td><a href='boardView.php?boardID={$info['boardID']}'>".$info['boardTitle']."</a></td>";
                echo "<td>".$info['youName']."</td>";
                echo "<td>".date('Y-m-d', $info['regTime'])."</td>";
                echo "<td>".$info['boardView']."</td>";
                echo "</tr>";
            }
        } else {
            echo "<tr><td colspan='4'>게시글이 없습니다.</td></tr>";
        }
    }
?>

JOIN을 사용하여 회원 테이블(members)과 게시글 테이블(board)을 연결하고, 회원 ID와 게시글 작성자 ID가 일치하는 항목을 가져옵니다. 그리고 게시글 ID를 내림차순으로 정렬하며 최대 100개의 게시글만 조회합니다.

 

결과는 num_rows() 함수를 사용하여 조회된 결과의 행 수를 확인한 후, 해당 행 수가 0보다 큰 경우에는 for문을 사용하여 각 행의 정보를 가져와 HTML 테이블의 행으로 출력합니다. 행 출력시, 각 열의 정보를 표시하기 위해 HTML 태그와 PHP 변수를 조합하여 행을 생성합니다. 만약 조회된 게시글이 없는 경우 "게시글이 없습니다."라는 메시지를 출력합니다.

 

마지막으로, 코드 중 주석 처리된 부분은 변수 $info를 디버깅하기 위해 사용한 것으로, 해당 부분은 주석 처리하여 불필요한 출력을 막을 수 있습니다.

 

 


boardView.php

<?php
    $boardID = isset($_GET['boardID']) ? $_GET['boardID'] : '';
    // echo $boardID;
    $sql = "SELECT b.boardContents, b.boardTitle, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(m.memberID = b.memberID) WHERE b.boardID = {$boardID}";
    $result = $connect -> query($sql);
    if($result){
        $info = $result -> fetch_array(MYSQLI_ASSOC);
        echo "<tr><th>제목</th><td>".$info['boardTitle']."</td></tr>";
        echo "<tr><th>등록자</th><td>".$info['youName']."</td></tr>";
        echo "<tr><th>등록일</th><td>".date('Y-m-d', $info['regTime'])."</td></tr>";
        echo "<tr><th>조회수</th><td>".$info['boardView']."</td></tr>";
        echo "<tr><th>내용</th><td>".$info['boardContents']."</td></tr>";
    } else {
        echo "<tr><td colspan='4'>게시글이 없습니다.</td></tr>";
    }
?>
  1. GET 방식으로 전달받은 boardID 값을 변수 $boardID에 저장합니다. 이때, 삼항 연산자를 이용하여 $_GET['boardID'] 값이 존재하지 않으면 빈 문자열을 할당합니다.
  2. 데이터베이스에서 게시글 정보를 가져오기 위한 SQL 쿼리를 작성합니다. 게시글의 내용(boardContents), 제목(boardTitle), 등록자(youName), 등록일(regTime), 조회수(boardView)를 board 테이블과 members 테이블을 조인하여 가져옵니다. WHERE 구문을 이용하여 전달받은 boardID 값과 일치하는 게시글만을 가져옵니다.
  3. 작성한 SQL 쿼리를 실행하고, 결과 값을 $result 변수에 저장합니다.
  4. $result 변수의 값이 존재하는 경우, fetch_array 함수를 이용하여 결과 값을 배열 형태로 가져옵니다. MYSQLI_ASSOC 옵션을 이용하여 연관 배열 형태로 가져옵니다.
  5. 가져온 게시글 정보를 HTML 테이블 형태로 출력합니다. 이때, echo 함수를 이용하여 출력합니다. 출력되는 내용은 게시글의 제목, 등록자, 등록일, 조회수, 내용 등입니다. 게시글이 존재하지 않는 경우, '게시글이 없습니다.'라는 메시지가 출력됩니다.

 

<div class="board__btn mb100">
    <a href="boardModify.php?boardID=<?=$_GET['boardID']?>" class="btnStyle3">수정하기</a>
    <a href="boardRemove.php?boardID=<?=$_GET['boardID']?>" class="btnStyle3" onclick="return confirm('정말 삭제하시겠습니까?')">삭제하기</a>
    <a href="board.php" class="btnStyle3">목록보기</a>
</div>
  1. 첫 번째 <a> 태그에서는 boardModify.php 파일에 $_GET['boardID'] 값을 전달하여 해당 게시글을 수정할 수 있는 페이지로 이동하는 링크를 생성합니다.
  2. 두 번째 <a> 태그에서는 boardRemove.php 파일에 $_GET['boardID'] 값을 전달하여 해당 게시글을 삭제할 수 있는 페이지로 이동하는 링크를 생성합니다. 이때, onclick 이벤트가 설정되어 있어 사용자가 삭제 버튼을 클릭할 때 "정말 삭제하시겠습니까?" 라는 메시지를 출력하게 됩니다.
  3. 마지막 <a> 태그에서는 board.php 파일로 이동하는 링크를 생성하여 게시글 목록을 확인할 수 있도록 합니다.

 

이렇게 작성된 코드는 게시글 수정, 삭제, 목록보기 버튼을 쉽게 생성할 수 있으며, onclick 이벤트를 통해 사용자의 실수를 방지하고, 목록보기 버튼을 통해 게시글 목록을 쉽게 확인할 수 있도록 구성되어 있습니다.

 


boardModify.php

<?php
    include "../connect/connect.php";
    include "../connect/session.php" ;

    session_start();

    // 로그인한 사용자만 접근 가능하도록 설정
    if (!isset($_SESSION['memberID'])) {
        echo "<script>alert('로그인 후 이용해주세요.'); location.href='../login/login.php';</script>";
        exit;
    }

    // boardID가 존재하지 않을 경우
    if (!isset($_GET['boardID'])) {
        echo "<script>alert('잘못된 접근입니다.'); history.back();</script>";
        exit;
    }

    $boardID = mysqli_real_escape_string($connect, $_GET['boardID']);
    $memberID = mysqli_real_escape_string($connect, $_SESSION['memberID']);

    // 해당 게시글의 작성자와 로그인한 사용자가 다를 경우
    $sql = "SELECT boardID FROM board WHERE boardID = {$boardID} AND memberID = '{$memberID}'";
    $result = $connect->query($sql);

    if ($result->num_rows == 0) {
        echo "<script>alert('작성자만 수정할 수 있습니다.'); history.back();</script>";
        exit;
    }
?>
  1. 게시글을 수정하기 위해 필요한 boardID 값을 가져옵니다. 만약 boardID가 설정되어 있지 않은 경우 "잘못된 접근입니다." 라는 메시지를 출력하고 이전 페이지로 이동합니다.
  2. 해당 게시글의 작성자와 로그인한 사용자가 다를 경우 "작성자만 수정할 수 있습니다." 라는 메시지를 출력하고 이전 페이지로 이동합니다.
  3. $boardID와 $memberID 값으로 쿼리문을 작성하여 결과를 얻어내는 부분이 있습니다. 이 부분에서 mysqli_real_escape_string() 함수를 사용하여 SQL Injection 공격을 방지하고 있습니다.

 

 

 

반응형
Adventure Time - BMO