안녕하세요
저의 개발 과제는 여기까지입니다.
문의게시판까지 만들고 css 써서 좀 꾸미고 난 뒤에 부족한 게 있으면 추가하는
그런 목표였거든요!
시작하겠습니다.
일단 문의게시판은 비회원도 이용 가능하게 할 겁니다.
그러니 문의게시판 용의 데이터베이스가 새로 필요할 거고요.
게다가 이 게시판에는 비밀번호까지 입력하게 해서 만약 비밀번호가 맞으면 수정, 삭제가 가능하도록 하겠습니다.
당연히 볼 수 있고요.
저는 일단 login.php에 문의 게시판 버튼을 만들겠습니다.
<form action="inquiry_board.php">
<p><input type="submit" value="문의게시판"></p>
</form>
다음에 inquiry_board.php을 만들겠습니다.
작성을 하기 전에 데이터베이스에 추가를 하겠습니다.
phpmyadmin에 왼쪽 위에 '새로운' 눌러서 데이터베이스 생성
테이블 이름도 INQUIRY_INFO로 했습니다.
칼럼 수는 일단 식별자용으로 board_id, 작성자 이름 user_id, 비밀번호 pw, 작성된 제목 title, 작성된 내용 detail
날짜 date_value까지 솔직히 문의게시판인데 조회수랑 좋아요 수는 필요 없겠죠
이렇게 6개로 만들겠습니다.
저장하고 테이블을 만들었습니다.
그리고 제 env 파일에 새로운 데이터베이스 이름을 추가하겠습니다.
#sudo vi /etc/apache2/envvars
저장하고 나갑니다.
그리고 DB_INFO.php에 추가해야죠
이제 작성을 시작하겠습니다!
php문으로 가셔서 게시판에 있는 코드를 그대로 복사 붙이기 하겠습니다.
그리고 데이터베이스 명은 바꾸고 작성하겠습니다.
그리고 vscode의 좋은 기능이 있죠 ctrl+h 누르면 검색창이 나옵니다
이때 Replace에 db_board 말고 db_inquiry 저희가 방금 작성한 테이블 이름을 넣겠습니다.
작은 아이콘이 있는데 마우스 갖다 대면 Replace는 enter, Replace ALL은 ctrl+alert+enter 누르라네요
저는 전부 데이터베이스 이름을 바꾸기에 Replace ALL을 누르겠습니다.
그리고 좋아요 기능이 없으니 좋아요 관련 코드는 전부 지우겠습니다.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Welcome!</title>
</head>
<body>
<h1>INQUIRY_MENU</h1>
<?php
include 'DB_INFO.php'; //데이터 베이스 정보
//데이터베이스 연결
$conn = mysqli_connect($host,$username,$password,$db_inquiry);
//데이터베이스 오류시 종료
if(mysqli_connect_errno()) {
die("데이터 베이스 오류: ". mysqli_connect_error());
}
session_start(); //세션 시작
?>
<form method ="GET" action="inquiry_board.php">
<input type = "text" name="search" value="<?php echo mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['search']),FILTER_SANITIZE_SPECIAL_CHARS));?>" placeholder="검색" >
<input type="submit" value="검색">
<select name="sort" onchange="this.form.submit()">
<option value="">정렬 방식 선택</option>
<option value="date" <?php if(mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS))=='date'){echo ' selected';} ?> >날짜순</option>
<option value="author" <?php if(mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS))=='author'){echo ' selected';} ?> >작성자순</option>
</select>
<label for="date">날짜 선택:</label>
<input type="date" id="date_value" name="date_value" value="<?php echo isset($_GET['date_value']) ? $_GET['date_value'] : ''; ?>">
</form>
<p>
<?php
//한 페이지에 보여줄 게시물 수
$num_per_page = 5;
//현재 페이지 번호
if(isset($_GET['page'])) {
$page = mysqli_real_escape_string($conn,filter_var(strip_tags(intval($_GET['page'])),FILTER_SANITIZE_SPECIAL_CHARS));
} else {
$page = 1;
}
//검색이 입력된 경우
if(isset($_GET['search'])) {
$search = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['search']),FILTER_SANITIZE_SPECIAL_CHARS));
if(isset($_GET['date_value']) && strtotime($_GET['date_value'])) {
//날짜 선택한 경우, strtotime() 이용해 유효한 값인지 확인
$date_value = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['date_value']),FILTER_SANITIZE_SPECIAL_CHARS));
$date_value = DateTime::createFromFormat('Y-m-d', $date_value)->format('Y-m-d'); //날짜 값으로 다시 바꾼다
$sql = "SELECT * FROM $db_inquiry WHERE title LIKE '%$search%' AND date_value LIKE '%$date_value%'";
$total_sql = "SELECT count(*) AS cnt FROM $db_inquiry WHERE title LIKE '%$search%' AND date_value LIKE '%$date_value%'";
}
else {
//날짜가 선택이 안된 경우
$date_value = '';
$sql = "SELECT board_id,user_id,title,detail FROM $db_inquiry WHERE title LIKE '%$search%' ";
$total_sql = "SELECT count(*) AS cnt FROM $db_inquiry WHERE title LIKE '%$search%' ";
}
} else {
//검색이 입력되지 않은 경우
$search = '';
$date_value = '';
$sql = "SELECT * FROM $db_inquiry"; //전체 게시물 검색
$total_sql = "SELECT count(*) AS cnt FROM $db_inquiry"; //전체 게시물 수 조회
}
$total_result = mysqli_query($conn,$total_sql); //sql문 실행
$total_row = mysqli_fetch_assoc($total_result); //결과를 배열로 가져온다
$total_posts = $total_row['cnt']; //배열 중 cnt의 값을 가져온다
//전체 페이지 수
$total_pages = ceil($total_posts / $num_per_page);
//각 페이지 시작 인덱스
$start = ($page - 1) * $num_per_page;
//정렬해주는 조건문
if (isset($_GET['sort'])) {
$sort = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS));
if ($sort == 'date') {
//날짜순
$sql .= " ORDER BY date_value DESC";
} else if ($sort == 'author') {
//작성자순
$sql .= " ORDER BY id DESC";
}
}
$sql .= " LIMIT $start, $num_per_page"; //최대 5개씩 호출
//쿼리문 실행
$result = mysqli_query($conn, $sql);
if(mysqli_num_rows($result) > 0) {
//게시물 출력
while($row = mysqli_fetch_assoc($result)) {
$index = $row['board_id'];
$id = $row['user_id'];
$title = $row['title'];
echo '<p><a href="view_inquiry_board.php?index='.$index.'">'.$title.'</a> : '.$id.'작성함</p>';
}
} else {
echo "게시물이 없습니다!";
}
echo '<p> [ ';
// 현재 페이지를 10으로 나눈 몫에 10을 곱한 값에서 1을 빼면
// 현재 페이지가 몇 번째 페이지 블록에 있는지 알 수 있습니다.
$block_start = floor(($page-1)/10)*10;
if ($block_start > 1) {
// 이전 페이지 블록이 있다면, 다음 버튼을 출력합니다.
$next_block_start = $block_start - 10;
if($next_block_start == 0) {
$next_block_start += 1; //0페이지는 존재 하지 않기에 1더한다
}
echo '<a href="?page=' . $next_block_start .'"><< </a>';
}
// 이전 버튼 출력
if ($page > 1) {
echo '<a href="?page=' . ($page-1) .'">< </a> ';
}
// 페이지 링크 출력
for ($i = $block_start+1; $i <= min($block_start+10, $total_pages); $i++) {
if($i == $page) {
echo '<strong>'.$i.' </strong>';
} else {
echo '<a href="?page=' . $i .'">'.$i. '</a> ';
}
echo ' ';
}
// 다음 버튼 출력
if ($page < $total_pages) {
echo '<a href="?page=' . ($page+1) .'">> </a> ';
}
if ($block_start+10 < $total_pages) {
// 다음 페이지 블록이 있다면, 다음 버튼을 출력합니다.
$next_block_start = $block_start + 11;
echo '<a href="?page=' . $next_block_start .'">>></a>';
}
echo ' ]</p>';
?>
</p>
<p></p>
<form action="inquiry_write_board.php" method="POST">
<p><input type="submit" name="write" value="게시판 작성"></p>
</form>
<form action="login.php">
<p><input type="submit" value="로그인페이지로"></p>
</form>
<form action="board.php" method="GET">
<p><input type="submit" value="검색 초기화"></p>
<input type="hidden" name="search" value="">
<input type="hidden" name="sort" value="">
<input type="hidden" name="date_value" value="">
</form>
</body>
</html>
많이 기네요! 원래 코드는 객체 지향을 써서 각각 기능을 분류하고 해야 되는데.. 넘어가죠!
먼저 게시판 작성부터 하겠습니다.
마지막에 있는 게시판 작성 관련 form을 고치겠습니다.
<form action="inquiry_write_board.php" method="POST">
<p><input type="submit" name="write" value="게시판 작성"></p>
</form>
그리고 inquiry_write_board.php을 만들겠습니다.
write_board.php을 복붙 하겠습니다.
이때 저는 비밀번호까지 작성 가능하게 맨 밑에 추가 password 박스를 만들고
파일 관련 코드는 아예 없애겠습니다. 세션 ID 비교할 필요도 없죠!
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>문의게시판 작성 중</title>
</head>
<body>
<h1>문의게시판 작성!</h1>
<form action="inquiry_write_process_board.php" method="POST">
<label>ID:</label>
<input type="text" name="user_id" placeholder="작성자이름,특수기호X" required><br><br>
<p><input type="text" name="title" maxlegth="44" placeholder="제목 입력, 최대 44자까지 가능합니다" required></p>
<p><textarea name="detail" rows="20" cols="20" maxlength="254" placeholder="내용 작성,최대 254자 가능합니다" required></textarea></p>
<p><input type="password" name="pw" maxlegth="44" placeholder="비밀번호입력" required></p>
<p><input type="submit" value="올리기"></p>
</form>
<form action="inquiry_board.php">
<p><input type="submit" value="돌아가기"></p>
</form>
<p>
<?php session_start();
if (isset($_SESSION['write_error'])) {
echo $_SESSION['write_error'];
unset($_SESSION['write_error']);
}
?>
</p>
</body>
</html>
그리고 inquiry_write_process_board.php 만들고 코드 작성 하겠습니다.
거의 다 복붙에 pw 추가만 하는 거라 딱히.. 설명할 게 없네요! 질문 있으시면 언제나 물어보셔도 됩니다.
어쨌든 write_process_board.php을 복붙 하겠습니다.
그리고 pw는 받고 난 뒤에 해싱한 후 저장하게 하겠습니다.
데이터베이스 명 변경도 했습니다.
-inquiry_write_process_board.php
<?php
include 'DB_INFO.php'; //데이터 베이스 정보
session_start(); //세션 시작
//문의게시판 데이터베이스 연결
$conn = mysqli_connect($host,$username,$password, $db_inquiry);
//데이터베이스 오류시 종료
if(mysqli_connect_errno()) {
die("데이터 베이스 오류: ". mysqli_connect_error());
}
//POST로 전달된 정보 받기
if(isset($_POST['board_id'])){ //수정시 받아온다
$board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));
} else {
$board_id = null;
}
$title = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['title']),FILTER_SANITIZE_SPECIAL_CHARS));
$detail = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['detail']),FILTER_SANITIZE_SPECIAL_CHARS));
//POST으로 유저 이름 받기
$user_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['user_id']),FILTER_SANITIZE_SPECIAL_CHARS));
if(isset($_POST['pw'])){
//비밀번호가 있으면 해싱
$hashed_pw = password_hash($_POST['pw'], PASSWORD_DEFAULT);
}
if(isset($board_id)) {
//board_id가 있다는 것은 수정을 의미
$sql = "UPDATE $db_inquiry SET user_id='$user_id', title = '$title', detail='$detail' WHERE board_id='$board_id' ";
}
else {
//board_id가 없으니 새로 만드는 sql문
$sql = "INSERT INTO $db_inquiry (user_id, title, detail,pw) VALUES ('$user_id', '$title', '$detail','$hashed_pw')";
}
//sql문 실행
if(mysqli_query($conn,$sql)) {
//수정인 경우 바로 게시판 보이게 함
if(isset($board_id)) {
$_SESSION['write_error'] = '수정되었습니다!';
header("Location: view_inquiry_board.php?index=$board_id");
}
else {
$board_id = mysqli_insert_id($conn); // 새로 생성한 게시물의 id를 가져옴
$_SESSION['write_error'] = '작성되었습니다!';
header("Location: view_inquiry_board.php?index=$board_id");
}
} else {
$_SESSION['write_error'] = '작성 중 오류가 발생하였습니다.';
header("Location: view_inquiry_board.php");
}
exit();
?>
그리고 게시물 출력을 하겠습니다.
inquiry_board.php로 넘어가고
또 수정하겠습니다
if(mysqli_num_rows($result) > 0) {
//게시물 출력
while($row = mysqli_fetch_assoc($result)) {
$index = $row['board_id'];
$id = $row['id'];
$title = $row['title'];
echo '<p><a href="view_board.php?index='.$index.'">'.$title.'</a> : '.$id.'작성함 조회수: '.$row['views'].'</p>';
}
} else {
echo "게시물이 없습니다!";
}
이 코드에 하이퍼 링크를 고치겠습니다.
if(mysqli_num_rows($result) > 0) {
//게시물 출력
while($row = mysqli_fetch_assoc($result)) {
$index = $row['board_id'];
$id = $row['id'];
$title = $row['title'];
echo '<p><a href="view_inquiry_board.php?index='.$index.'">'.$title.'</a> : '.$id.'작성함 조회수: '.$row['views'].'</p>';
}
} else {
echo "게시물이 없습니다!";
}
그리고 inquiry_board.php을 만들고 또 코딩하겠습니다.
이번에는 view_board.php을 그대로 가져오면 되겠죠! 근데 파일은 없어도 되니 파일 관련 코드는 전부 지우겠습니다.
좋아요, 조회수 기능도요
데이터베이스 명 변경도 중요하죠!
그리고 코드 보여드리겠습니다.
-view_inquiry_board.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>문의게시물 보는중</title>
</head>
<body>
<p>
<?php
include 'DB_INFO.php'; //데이터 베이스 정보
//데이터베이스 연결
$conn = mysqli_connect($host,$username,$password,$db_inquiry);
//데이터베이스 오류시 종료
if(mysqli_connect_errno()) {
die("데이터 베이스 오류: ". mysqli_connect_error());
}
//GET방식으로 전달된 index 받는다
$board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['index']),FILTER_SANITIZE_SPECIAL_CHARS));
//작성된 게시물들 조회 문
$sql = "SELECT * FROM $db_inquiry WHERE board_id = '$board_id' ";
//쿼리문 실행
$result = mysqli_query($conn, $sql);
//게시물 출력
while($row = mysqli_fetch_assoc($result)) {
echo '<p>ID: '.$row['user_id'].'</p>';
echo '<p>Title: '.$row['title'].'</p>';
echo '<p>Detail: '.$row['detail'].'</p>';
echo '<p>Date: '.$row['date_value'].'</p>';
//게시물 수정 버튼을 보여준다
echo "<form method='GET' action='inquiry_fix_process_board.php'>
<input type='hidden' name='board_id' value='".$row['board_id']."'>
<p><button type='submit'>게시물 수정</button></p>
</form>";
//게시물 삭제 버튼을 보여준다
echo "<form method='POST' action='inquiry_delete_board.php'>
<input type='hidden' name='board_id' value='".$row['board_id']."'>
<p><button type='submit'>삭제</button></p>
</form>";
}
?>
</p>
<p>
<?php session_start();
if (isset($_SESSION['write_error'])) {
echo $_SESSION['write_error'];
unset($_SESSION['write_error']);
}
?>
</p>
<p></p>
<form action="inquiry_board.php">
<p><input type="submit" value="문의페이지로"></p>
</form>
<form action="login.php">
<p><input type="submit" value="로그인페이지로"></p>
</form>
</body>
</html>
그리고 게시물 수정, 게시물 삭제의 하이퍼 링크를 고치겠습니다.
//게시물 수정 버튼을 보여준다
echo "<form method='GET' action='inquiry_fix_process_board.php'>
<input type='hidden' name='board_id' value='".$row['board_id']."'>
<p><button type='submit'>게시물 수정</button></p>
</form>";
//게시물 삭제 버튼을 보여준다
echo "<form method='GET' action='inquiry_delete_board.php'>
<input type='hidden' name='board_id' value='".$row['board_id']."'>
<p><button type='submit'>삭제</button></p>
</form>";
그리고 먼저 수정 기능인 inquiry_fix_board.php 먼저 코딩하죠!
똑같이 파일 관련, 데이터베이스 명, 세션 ID 고치겠습니다.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>게시판 수정 중</title>
</head>
<body>
<?php
include 'DB_INFO.php'; //데이터 베이스 정보
//데이터베이스 연결
$conn = mysqli_connect($host,$username,$password,$db_inquiry);
//데이터베이스 오류시 종료
if(mysqli_connect_errno()) {
die("데이터 베이스 오류: ". mysqli_connect_error());
}
//GET방식으로 board_id 받기
$board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));
//작성된 게시물들 조회 문
$sql = "SELECT * FROM $db_inquiry WHERE board_id = '$board_id' ";
//쿼리문 실행
$result = mysqli_query($conn, $sql);
//결과값 가져오기
$row = mysqli_fetch_assoc($result);
?>
<form action="inquiry_write_process_board.php" method="POST">
<p><input type="text" name="user_id" maxlength="44" value="<?php echo $row['user_id']; ?>" placeholder="작성자이름"></p>
<p><input type="text" name="title" maxlength="44" value="<?php echo $row['title']; ?>" placeholder="제목 입력, 최대 44자까지 가능합니다"></p>
<p><textarea name="detail" rows="20" cols="20" maxlength="254" placeholder="내용 작성,최대 254자 가능합니다"><?php echo $row['detail']; ?></textarea></p>
<p><input type="submit" value="수정하기"></p>
<input type="hidden" name='board_id' value="<?php echo $row['board_id']; ?>">
</form>
<p>
<?php session_start();
if (isset($_SESSION['write_error'])) {
echo $_SESSION['write_error'];
unset($_SESSION['write_error']);
}
?>
</p>
</body>
</html>
데이터베이스에 id로 전부 통일할걸.. 후회하고 있습니다. 계속 id을 user_id로 바꿔야 되네요
어쨌든 이렇게만 해 두면 안 되겠죠 비밀번호를 작성을 해 만약 맞으면 이 내용을 보이게 하겠습니다.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>게시판 수정 중</title>
</head>
<body>
<?php
include 'DB_INFO.php'; //데이터 베이스 정보
session_start();
//데이터베이스 연결
$conn = mysqli_connect($host,$username,$password,$db_inquiry);
//데이터베이스 오류시 종료
if(mysqli_connect_errno()) {
die("데이터 베이스 오류: ". mysqli_connect_error());
}
//GET방식으로 board_id 받기
$board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));
//작성된 게시물들 조회 문
$sql = "SELECT * FROM $db_inquiry WHERE board_id = '$board_id' ";
//쿼리문 실행
$result = mysqli_query($conn, $sql);
//결과값 가져오기
$row = mysqli_fetch_assoc($result);
if(isset($_POST['pw'])) {
//비밀번호 값을 가져온다
$hashed_pw = $row['pw'];
if(password_verify($_POST['pw'],$hashed_pw)) {
//비밀번호가 맞으면
echo "<form action='inquiry_write_process_board.php' method='POST'>
<p><input type='text' name='user_id' maxlength='44' value='".$row['user_id']."' placeholder='작성자이름'></p>
<p><input type='text' name='title' maxlength='44' value='".$row['title']."' placeholder='제목 입력, 최대 44자까지 가능합니다'></p>
<p><textarea name='detail' rows='20' cols='20' maxlength='254' placeholder='내용 작성,최대 254자 가능합니다'>".$row['detail']."</textarea></p>
<p><input type='submit' value='수정하기'></p>
<input type='hidden' name='board_id' value='".$row['board_id']."'>
</form>";
} else {
//비밀번호 틀린경우
$_SESSION['write_error'] = '비밀번호가 틀립니다!';
header("Location: view_inquiry_board.php?index=".$board_id);
exit();
}
} else {
echo "<form method='POST' action='inquiry_fix_process_board.php?board_id=$board_id'>
<input type='password' name='pw' value=''>
<p><button type='submit'>인증하기</button></p>
</form>";
}
?>
<p>
</p>
</body>
</html>
다음은 inquiry_delete_board.php을 짜겠습니다.
delete_board.php에 복사 붙이기 하고 필요 없는 거랑 바꿀 거 바꾸고 코딩하겠습니다
당연히 비밀번호 인증 돼야만 실행하게 하겠습니다.
<?php
include 'DB_INFO.php'; //데이터 베이스 정보
session_start(); //세션 시작
//게시판 데이터베이스 연결
$conn = mysqli_connect($host,$username,$password, $db_inquiry);
//데이터베이스 오류시 종료
if(mysqli_connect_errno()) {
die("데이터 베이스 오류: ". mysqli_connect_error());
}
//POST로 전달된 정보 받기
$board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));
//삭제용 sql문 작성
$sql = "DELETE FROM $db_inquiry WHERE board_id='$board_id'";
//비밀번호 조회용 sql문 작성
$sql_pw = "SELECT pw FROM $db_inquiry WHERE board_id='$board_id'";
//쿼리문 실행
$result = mysqli_query($conn, $sql);
//결과값 가져오기
$row = mysqli_fetch_assoc($result);
if(isset($_POST['pw'])) {
//비밀번호 값을 가져온다
$hashed_pw = $row['pw'];
if(password_verify($_POST['pw'],$hashed_pw)) {
//실행
if(mysqli_query($conn,$sql)) {
//실행 후 게시판으로 이동
header("Location: inquiry_board.php");
} else {
//오류 발생 시 메시지 호출
$_SESSION['write_error'] = '삭제하는데 실패했습니다! 조금 있다 하십시오';
header("Location: view_inquiry_board.php");
}
} else {
//비밀번호 틀린경우
$_SESSION['write_error'] = '비밀번호가 틀립니다!';
header("Location: view_inquiry_board?index=$board_id");
}
} else {
echo "<form method='POST' action='inquiry_delete_board.php?board_id=$board_id'>
<input type='password' name='pw' value=''>
<p><button type='submit'>인증하기</button></p>
</form>";
}
exit();
?>
이러면 게시물 보기, 출력, 정렬, 수정, 삭제, 등록되었습니다!
한번 쭉 해보고 에러 나면 고치도록 하겠습니다.
작성해보겠습니다
한번 수정 눌러보겠습니다
잘 되었네요!
이제 삭제해보겠습니다
이렇게 해서 문의 게시판을 구현을 했습니다.
오늘은 여기까지 작성을 하겠습니다.
다음에 주소 API을 없애고 주소 찾는 코드를 제가 직접 짜겠습니다 감사합니다.
.
.
.
.
.
.
.
.
-inquiry_board.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Welcome!</title>
</head>
<body>
<h1>INQUIRY_MENU</h1>
<?php
include 'DB_INFO.php'; //데이터 베이스 정보
//데이터베이스 연결
$conn = mysqli_connect($host,$username,$password,$db_inquiry);
//데이터베이스 오류시 종료
if(mysqli_connect_errno()) {
die("데이터 베이스 오류: ". mysqli_connect_error());
}
session_start(); //세션 시작
?>
<form method ="GET" action="inquiry_board.php">
<input type = "text" name="search" value="<?php echo mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['search']),FILTER_SANITIZE_SPECIAL_CHARS));?>" placeholder="검색" >
<input type="submit" value="검색">
<select name="sort" onchange="this.form.submit()">
<option value="">정렬 방식 선택</option>
<option value="date" <?php if(mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS))=='date'){echo ' selected';} ?> >날짜순</option>
<option value="author" <?php if(mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS))=='author'){echo ' selected';} ?> >작성자순</option>
</select>
<label for="date">날짜 선택:</label>
<input type="date" id="date_value" name="date_value" value="<?php echo isset($_GET['date_value']) ? $_GET['date_value'] : ''; ?>">
</form>
<p>
<?php
//한 페이지에 보여줄 게시물 수
$num_per_page = 5;
//현재 페이지 번호
if(isset($_GET['page'])) {
$page = mysqli_real_escape_string($conn,filter_var(strip_tags(intval($_GET['page'])),FILTER_SANITIZE_SPECIAL_CHARS));
} else {
$page = 1;
}
//검색이 입력된 경우
if(isset($_GET['search'])) {
$search = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['search']),FILTER_SANITIZE_SPECIAL_CHARS));
if(isset($_GET['date_value']) && strtotime($_GET['date_value'])) {
//날짜 선택한 경우, strtotime() 이용해 유효한 값인지 확인
$date_value = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['date_value']),FILTER_SANITIZE_SPECIAL_CHARS));
$date_value = DateTime::createFromFormat('Y-m-d', $date_value)->format('Y-m-d'); //날짜 값으로 다시 바꾼다
$sql = "SELECT * FROM $db_inquiry WHERE title LIKE '%$search%' AND date_value LIKE '%$date_value%'";
$total_sql = "SELECT count(*) AS cnt FROM $db_inquiry WHERE title LIKE '%$search%' AND date_value LIKE '%$date_value%'";
}
else {
//날짜가 선택이 안된 경우
$date_value = '';
$sql = "SELECT board_id,user_id,title,detail FROM $db_inquiry WHERE title LIKE '%$search%' ";
$total_sql = "SELECT count(*) AS cnt FROM $db_inquiry WHERE title LIKE '%$search%' ";
}
} else {
//검색이 입력되지 않은 경우
$search = '';
$date_value = '';
$sql = "SELECT * FROM $db_inquiry"; //전체 게시물 검색
$total_sql = "SELECT count(*) AS cnt FROM $db_inquiry"; //전체 게시물 수 조회
}
$total_result = mysqli_query($conn,$total_sql); //sql문 실행
$total_row = mysqli_fetch_assoc($total_result); //결과를 배열로 가져온다
$total_posts = $total_row['cnt']; //배열 중 cnt의 값을 가져온다
//전체 페이지 수
$total_pages = ceil($total_posts / $num_per_page);
//각 페이지 시작 인덱스
$start = ($page - 1) * $num_per_page;
//정렬해주는 조건문
if (isset($_GET['sort'])) {
$sort = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS));
if ($sort == 'date') {
//날짜순
$sql .= " ORDER BY date_value DESC";
} else if ($sort == 'author') {
//작성자순
$sql .= " ORDER BY id DESC";
}
}
$sql .= " LIMIT $start, $num_per_page"; //최대 5개씩 호출
//쿼리문 실행
$result = mysqli_query($conn, $sql);
if(mysqli_num_rows($result) > 0) {
//게시물 출력
while($row = mysqli_fetch_assoc($result)) {
$index = $row['board_id'];
$id = $row['user_id'];
$title = $row['title'];
echo '<p><a href="view_inquiry_board.php?index='.$index.'">'.$title.'</a> : '.$id.'작성함</p>';
}
} else {
echo "게시물이 없습니다!";
}
echo '<p> [ ';
// 현재 페이지를 10으로 나눈 몫에 10을 곱한 값에서 1을 빼면
// 현재 페이지가 몇 번째 페이지 블록에 있는지 알 수 있습니다.
$block_start = floor(($page-1)/10)*10;
if ($block_start > 1) {
// 이전 페이지 블록이 있다면, 다음 버튼을 출력합니다.
$next_block_start = $block_start - 10;
if($next_block_start == 0) {
$next_block_start += 1; //0페이지는 존재 하지 않기에 1더한다
}
echo '<a href="?page=' . $next_block_start .'"><< </a>';
}
// 이전 버튼 출력
if ($page > 1) {
echo '<a href="?page=' . ($page-1) .'">< </a> ';
}
// 페이지 링크 출력
for ($i = $block_start+1; $i <= min($block_start+10, $total_pages); $i++) {
if($i == $page) {
echo '<strong>'.$i.' </strong>';
} else {
echo '<a href="?page=' . $i .'">'.$i. '</a> ';
}
echo ' ';
}
// 다음 버튼 출력
if ($page < $total_pages) {
echo '<a href="?page=' . ($page+1) .'">> </a> ';
}
if ($block_start+10 < $total_pages) {
// 다음 페이지 블록이 있다면, 다음 버튼을 출력합니다.
$next_block_start = $block_start + 11;
echo '<a href="?page=' . $next_block_start .'">>></a>';
}
echo ' ]</p>';
?>
</p>
<p></p>
<form action="inquiry_write_board.php" method="POST">
<p><input type="submit" name="write" value="게시판 작성"></p>
</form>
<form action="login.php">
<p><input type="submit" value="로그인페이지로"></p>
</form>
<form action="board.php" method="GET">
<p><input type="submit" value="검색 초기화"></p>
<input type="hidden" name="search" value="">
<input type="hidden" name="sort" value="">
<input type="hidden" name="date_value" value="">
</form>
</body>
</html>
-inquiry_delete_board.php
<?php
include 'DB_INFO.php'; //데이터 베이스 정보
session_start(); //세션 시작
//게시판 데이터베이스 연결
$conn = mysqli_connect($host,$username,$password, $db_inquiry);
//데이터베이스 오류시 종료
if(mysqli_connect_errno()) {
die("데이터 베이스 오류: ". mysqli_connect_error());
}
//POST로 전달된 정보 받기
$board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));
//삭제용 sql문 작성
$sql = "DELETE FROM $db_inquiry WHERE board_id='$board_id'";
//비밀번호 조회용 sql문 작성
$sql_pw = "SELECT pw FROM $db_inquiry WHERE board_id='$board_id'";
//쿼리문 실행(비밀번호)
$result = mysqli_query($conn, $sql_pw);
//결과값 가져오기
$row = mysqli_fetch_assoc($result);
if(isset($_POST['pw'])) {
//비밀번호 값을 가져온다
$hashed_pw = $row['pw'];
if(password_verify($_POST['pw'],$hashed_pw)) {
//실행
if(mysqli_query($conn,$sql)) {
//실행 후 게시판으로 이동
header("Location: inquiry_board.php");
} else {
//오류 발생 시 메시지 호출
$_SESSION['write_error'] = '삭제하는데 실패했습니다! 조금 있다 하십시오';
header("Location: view_inquiry_board.php");
}
} else {
//비밀번호 틀린경우
$_SESSION['write_error'] = '비밀번호가 틀립니다!';
header("Location: view_inquiry_board?index=$board_id");
}
} else {
echo "<form method='POST' action='inquiry_delete_board.php?board_id=$board_id'>
<input type='password' name='pw' value=''>
<p><button type='submit'>인증하기</button></p>
</form>";
}
exit();
?>
-inquiry_fix_process_board.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>게시판 수정 중</title>
</head>
<body>
<?php
include 'DB_INFO.php'; //데이터 베이스 정보
session_start();
//데이터베이스 연결
$conn = mysqli_connect($host,$username,$password,$db_inquiry);
//데이터베이스 오류시 종료
if(mysqli_connect_errno()) {
die("데이터 베이스 오류: ". mysqli_connect_error());
}
//GET방식으로 board_id 받기
$board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));
//작성된 게시물들 조회 문
$sql = "SELECT * FROM $db_inquiry WHERE board_id = '$board_id' ";
//쿼리문 실행
$result = mysqli_query($conn, $sql);
//결과값 가져오기
$row = mysqli_fetch_assoc($result);
if(isset($_POST['pw'])) {
//비밀번호 값을 가져온다
$hashed_pw = $row['pw'];
if(password_verify($_POST['pw'],$hashed_pw)) {
//비밀번호가 맞으면
echo "<form action='inquiry_write_process_board.php' method='POST'>
<p><input type='text' name='user_id' maxlength='44' value='".$row['user_id']."' placeholder='작성자이름'></p>
<p><input type='text' name='title' maxlength='44' value='".$row['title']."' placeholder='제목 입력, 최대 44자까지 가능합니다'></p>
<p><textarea name='detail' rows='20' cols='20' maxlength='254' placeholder='내용 작성,최대 254자 가능합니다'>".$row['detail']."</textarea></p>
<p><input type='submit' value='수정하기'></p>
<input type='hidden' name='board_id' value='".$row['board_id']."'>
</form>";
} else {
//비밀번호 틀린경우
$_SESSION['write_error'] = '비밀번호가 틀립니다!';
header("Location: view_inquiry_board.php?index=".$board_id);
exit();
}
} else {
echo "<form method='POST' action='inquiry_fix_process_board.php?board_id=$board_id'>
<input type='password' name='pw' value=''>
<p><button type='submit'>인증하기</button></p>
</form>";
}
?>
<p>
</p>
</body>
</html>
-inquiry_write_board.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>문의게시판 작성 중</title>
</head>
<body>
<h1>문의게시판 작성!</h1>
<form action="inquiry_write_process_board.php" method="POST">
<label>ID:</label>
<input type="text" name="user_id" placeholder="작성자이름,특수기호X" required><br><br>
<p><input type="text" name="title" maxlegth="44" placeholder="제목 입력, 최대 44자까지 가능합니다" required></p>
<p><textarea name="detail" rows="20" cols="20" maxlength="254" placeholder="내용 작성,최대 254자 가능합니다" required></textarea></p>
<p><input type="password" name="pw" maxlegth="44" placeholder="비밀번호입력" required></p>
<p><input type="submit" value="올리기"></p>
</form>
<form action="inquiry_board.php">
<p><input type="submit" value="돌아가기"></p>
</form>
<p>
<?php session_start();
if (isset($_SESSION['write_error'])) {
echo $_SESSION['write_error'];
unset($_SESSION['write_error']);
}
?>
</p>
</body>
</html>
-inquiry_write_process_board.php
<?php
include 'DB_INFO.php'; //데이터 베이스 정보
session_start(); //세션 시작
//문의게시판 데이터베이스 연결
$conn = mysqli_connect($host,$username,$password, $db_inquiry);
//데이터베이스 오류시 종료
if(mysqli_connect_errno()) {
die("데이터 베이스 오류: ". mysqli_connect_error());
}
//POST로 전달된 정보 받기
if(isset($_POST['board_id'])){ //수정시 받아온다
$board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));
} else {
$board_id = null;
}
$title = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['title']),FILTER_SANITIZE_SPECIAL_CHARS));
$detail = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['detail']),FILTER_SANITIZE_SPECIAL_CHARS));
//POST으로 유저 이름 받기
$user_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['user_id']),FILTER_SANITIZE_SPECIAL_CHARS));
if(isset($_POST['pw'])){
//비밀번호가 있으면 해싱
$hashed_pw = password_hash($_POST['pw'], PASSWORD_DEFAULT);
}
if(isset($board_id)) {
//board_id가 있다는 것은 수정을 의미
$sql = "UPDATE $db_inquiry SET user_id='$user_id', title = '$title', detail='$detail' WHERE board_id='$board_id' ";
}
else {
//board_id가 없으니 새로 만드는 sql문
$sql = "INSERT INTO $db_inquiry (user_id, title, detail,pw) VALUES ('$user_id', '$title', '$detail','$hashed_pw')";
}
//sql문 실행
if(mysqli_query($conn,$sql)) {
//수정인 경우 바로 게시판 보이게 함
if(isset($board_id)) {
$_SESSION['write_error'] = '수정되었습니다!';
header("Location: view_inquiry_board.php?index=$board_id");
}
else {
$board_id = mysqli_insert_id($conn); // 새로 생성한 게시물의 id를 가져옴
$_SESSION['write_error'] = '작성되었습니다!';
header("Location: view_inquiry_board.php?index=$board_id");
}
} else {
$_SESSION['write_error'] = '작성 중 오류가 발생하였습니다.';
header("Location: view_inquiry_board.php");
}
exit();
?>
-view_inquiry_board.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>문의게시물 보는중</title>
</head>
<body>
<p>
<?php
include 'DB_INFO.php'; //데이터 베이스 정보
//데이터베이스 연결
$conn = mysqli_connect($host,$username,$password,$db_inquiry);
//데이터베이스 오류시 종료
if(mysqli_connect_errno()) {
die("데이터 베이스 오류: ". mysqli_connect_error());
}
//GET방식으로 전달된 index 받는다
$board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['index']),FILTER_SANITIZE_SPECIAL_CHARS));
//작성된 게시물들 조회 문
$sql = "SELECT * FROM $db_inquiry WHERE board_id = '$board_id' ";
//쿼리문 실행
$result = mysqli_query($conn, $sql);
//게시물 출력
while($row = mysqli_fetch_assoc($result)) {
echo '<p>ID: '.$row['user_id'].'</p>';
echo '<p>Title: '.$row['title'].'</p>';
echo '<p>Detail: '.$row['detail'].'</p>';
echo '<p>Date: '.$row['date_value'].'</p>';
//게시물 수정 버튼을 보여준다
echo "<form method='GET' action='inquiry_fix_process_board.php'>
<input type='hidden' name='board_id' value='".$row['board_id']."'>
<p><button type='submit'>게시물 수정</button></p>
</form>";
//게시물 삭제 버튼을 보여준다
echo "<form method='GET' action='inquiry_delete_board.php'>
<input type='hidden' name='board_id' value='".$row['board_id']."'>
<p><button type='submit'>삭제</button></p>
</form>";
}
?>
</p>
<p>
<?php session_start();
if (isset($_SESSION['write_error'])) {
echo $_SESSION['write_error'];
unset($_SESSION['write_error']);
}
?>
</p>
<p></p>
<form action="inquiry_board.php">
<p><input type="submit" value="문의페이지로"></p>
</form>
<form action="login.php">
<p><input type="submit" value="로그인페이지로"></p>
</form>
</body>
</html>
진짜.. 거의 다 개발했습니다.. 이제 조금씩 수정만 하면 됩니다!
'개발과제' 카테고리의 다른 글
[노말틱 모의 해킹 취업반 추가 개발과제 ] css - 로그인 페이지 (0) | 2023.05.04 |
---|---|
[노말틱 모의 해킹 취업반 추가 개발과제 ] 주소 검색 기능 만들기 (0) | 2023.04.29 |
[노말틱 모의 해킹 취업반 10주차 개발과제 ] 마이페이지 개발 (0) | 2023.04.26 |
[노말틱 모의 해킹 취업반 9주차 개발과제 ] 게시판 만들기(5) - 각 별로 정렬되게 만들기 (0) | 2023.04.25 |
[노말틱 모의 해킹 취업반 9주차 개발과제 ] 게시판 만들기(5) - 좋아요기능 (0) | 2023.04.24 |