구현해놓은것은 꽤 전이지만..게시판에 대한 글도 겸사겸사 작성해보려한다.
게시글 불러오기, 글 작성, 글 수정, 글 삭제와 같은 부분은 로그인이나 회원가입과 크게 다를게 없으니 간단히 설명하고자 한다.
첫번째로 게시판에 들어갈 데이터베이스를 만들어줬다.
사용하는 컬럼은 [ BNO, TITLE, Author, CONTENT, Date] 로 정해주었다.
board.php를 구현해주었고 총 완성된 모습은 아래와 같다.
우선 board.php에 접속했을때 게시글 목록 불러오기는
Content를 제외한 값들을 불러오도록 하였다.
(Content는 자세히보기시 불러오도록설정)
function boardv()
{
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'admin');
define('DB_PASSWORD', 'student1234');
define('DB_NAME', 'test');
// 데이터베이스 연결
$db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 게시판 아이템 조회 쿼리
$pageLimit = 8; // 한 페이지에 표시할 아이템 수
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
$startPoint = ($page - 1) * $pageLimit;
$sql = "SELECT bno, title, author, date FROM board LIMIT?,?";
$stmt = $db_conn->prepare($sql);
$stmt->bind_param("ii", $startPoint, $pageLimit);
$stmt->execute();
$result = $stmt->get_result();
if ($result) {
while ($row = mysqli_fetch_assoc($result)) {
// 각 행의 데이터를 변수에 저장
$bno = $row['bno'];
$title = htmlspecialchars($row['title']);
$author = htmlspecialchars($row['author']);
$date = $row['date'];
// 테이블 행 출력
echo '<tr>';
echo '<td>' . $bno . '</td>';
echo '<td><a href="view.php?bno=' . $bno . '">' . $title . '</a></td>';
echo '<td>' . $author . '</td>';
echo '<td>' . $date . '</td>';
echo '</tr>';
}
// 자원 해제
$stmt->close();
} else {
die('Query failed: ' . mysqli_error($db_conn));
}
}
이부분에서 페이징 기법이 나오는데 페이지 값을 GET으로 불러와 startpoint를 설정해주도록 하였다.
8개씩 보여주도록 하였으니 첫 페이지의 경우 select ... from board limit 0,8 이 실행되고
두번째 페이지의 경우 GET['page']=2 가 넘어와
select ... from board limit 9,8이 실행되는 방식이다.
글 수정/삭제
<?php
// selct
function update1($bno,$title,$content){
define('DB_SERVER','localhost');
define('DB_USERNAME','admin');
define('DB_PASSWORD','student1234');
define('DB_NAME','test');
$db_conn = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_NAME);
$sql = "UPDATE board SET title = '$title', content = '$content' WHERE bno = $bno";
$result=mysqli_query($db_conn, $sql);
$db_conn->close();
return $result;
}
function delete1($bno){
define('DB_SERVER','localhost');
define('DB_USERNAME','admin');
define('DB_PASSWORD','student1234');
define('DB_NAME','test');
$db_conn = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_NAME);
$sql = "DELETE from board WHERE bno = $bno";
$result=mysqli_query($db_conn, $sql);
$db_conn->close();
return $result;
}
?>
검색기능
우선 검색이 있을경우와 검색이 없을경우를 나눠주었다. (키워드가 있을경우 함수 search1() 실행, 없을경우 boardv()로 불러오기)
<thead>
<tr>
<th>BNO</th>
<th>TITLE</th>
<th>AUTHOR</th>
<th>DATE</th>
</tr>
</thead>
<tbody>
<?php
if (isset($_GET['keyword'])) {
search1($_GET['keyword']);
} else {
boardv();
}
?>
</tbody>
function search1($keyword){
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'admin');
define('DB_PASSWORD', 'student1234');
define('DB_NAME', 'test');
// 데이터베이스 연결
$db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
$sql = "SELECT * FROM board WHERE title LIKE '%$keyword%' OR content LIKE '%$keyword%' LIMIT ?,?";
// 게시판 아이템 조회 쿼리
$pageLimit = 8; // 한 페이지에 표시할 아이템 수
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
$startPoint = ($page - 1) * $pageLimit;
$stmt = $db_conn->prepare($sql);
$stmt->bind_param("ii", $startPoint, $pageLimit);
$stmt->execute();
$result = $stmt->get_result();
if ($result) {
while ($row = mysqli_fetch_assoc($result)) {
// 각 행의 데이터를 변수에 저장
$bno = $row['bno'];
$title = htmlspecialchars($row['title']);
$author = htmlspecialchars($row['author']);
$date = $row['date'];
// 테이블 행 출력
echo '<tr>';
echo '<td>' . $bno . '</td>';
echo '<td><a href="view.php?bno=' . $bno . '">' . $title . '</a></td>';
echo '<td>' . $author . '</td>';
echo '<td>' . $date . '</td>';
echo '</tr>';
}
// 자원 해제
$stmt->close();
} else {
die('Query failed: ' . mysqli_error($db_conn));
}
}
글 불러오기와 크게 다를건 없다.
데이터베이스 컬럼중 TITLE, CONTENT에 keyword가 포함되면 그 글만 뜨는 방식으로 불러오도록 설정하는것이기 때문에.
그 keyword 조건만 sql을 변경해주어 불러오도록 하였다.
해야할 공목록
- 쿠키탈취코드, 키로거
- 5? 6?주차 sql injection