게시판을 보려면 게시글이 있어야지!

이름은 세션값으로 끌고온다!!
제목하고 내용, 첨부파일이 있다면 첨부파일까지 다 DB로 넘기기
그 전에 파일 업로드를 위한 테이블 먼저 생성
CREATE TABLE file_upload (
file_id VARCHAR(255) PRIMARY KEY,
file_name VARCHAR(255) NOT NULL,
file_save VARCHAR(255) NOT NULL,
up_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
file id는
게시물 작성할때 다른 파일을 중복된 이름으로 저장하면
기존에 저장돼있던 파일 위에 덮어씌워지기때문에 그런 오류를 방지하기 위해
랜덤값으로 이름을 저장하는데 그 이름을 저장하기 위한 컬럼이구
file name은
작성자가 게시할때 올린 첨부파일명을 저장하기 위한 컬럼
file save는 파일이 저장되는 경로명을 저장하기 위한 컬럼이다!
[ write.php ]
<?php
include 'lib.php';
?>
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>글쓰기</title>
</head>
<body>
<form name="board" method="POST" action="writeok.php" enctype="multipart/form-data">
<table border=1>
<tbody>
<tr>
<td>이름</td>
<td>
<?php
echo $_SESSION['name'];
?>
</td>
</tr>
<?php
if ($_SESSION['name'] == '관리자') { ?>
<tr>
<td>구분</td>
<td>
<select name="type">
<option value="notice">공지사항</option>
<option value="content">일반글</option>
</select>
</td>
</tr>
<?php } else {} ?>
<tr>
<td>제목</td>
<td><input type="text" name="title" style="width:700px"></td>
</tr>
<tr>
<td>내용</td>
<td><textarea name="content" style="width:700px; height: 500px;"></textarea></td>
</tr>
<tr>
<td>파일</td>
<td><input type="file" name="upload_file"></td>
</tr>
</tbody>
</table><br>
<input type="submit" value="저장하기">
</form>
</body>
</html>
아 그리고
작성자가 '관리자'일 때는
공지사항으로 작성할건지, 일반글로 작성할건지 선택하는 것두 있슨..

요로케요
(이건 관리자일때만 뜸)
암튼 이렇게 글을 작성하면
이 글을 DB로 넘겨줘야겠죵
[ writeok.php ]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<?php
include 'lib.php';
$title = $_POST['title'];
$content = $_POST['content'];
$day = date("Y.m.d");
$name = $_SESSION['name'];
$type = isset($_POST['type']) ? $_POST['type'] : 'content';
$notice = ($type == 'notice') ? 1 : 0;
$file_id = NULL;
if ($_FILES['upload_file'] != NULL ){
$tmp_name = $_FILES['upload_file']['tmp_name'];
$filename = $_FILES['upload_file']['name'];
$error = $_FILES['upload_file']['error'];
if ($error == 0) {
$e = substr($filename, strrpos($filename, '.') + 1);
$file_id = md5(uniqid(rand(), true));
$path = $file_id.'.'.$e;
$folder = "./uploads/$path";
move_uploaded_file($tmp_name, $folder);
mysqli_query($conn,
"INSERT INTO file_upload (file_id, file_name, file_save, up_time, notice) VALUES ('$file_id', '$filename', '$path', now(), '$notice');");
}}
$q = "INSERT INTO board (name, title, content, day, count, file_id, notice) VALUES ('$name', '$title', '$content', '$day', 0, '$file_id', '$notice')";
$result = mysqli_query($conn, $q);
if ($result) {
echo "<script>alert('글 작성 성공!'); window.location.href='board.php';</script>";
} else {
echo "글 작성 오류: ".mysqli_error($conn);
}
mysqli_close($conn);
?>
</body>
</html>
이게 진짜 어려웠는데
계속 맞게 한거같은데 저장되는 파일명이 $filename 으로 되는거임
보니까
$folder = './uploads/$path';
로 해서.. 안되는거였당
싱글쿼터는 변수 해석 안하고 문자열 그대로 출력하고,
더블쿼터는 변수를 해석해서 변수 치환을 해준다고함
큰따옴표로 바꿔주니까 파일 다운로드할때 파일명이 정상적으로 들어왔다
글고 아무리 공지사항으로 글을 작성해도 content로 넘어가!!!!!!!!!!!!
알고보니 그 전에는 if문으로
file이 있으면..~ "INSERT INTO 어쩌구" else
또 if 써서 공지사항이면~ "INSERT INTO 어쩌구...."
이렇게했더니 코드가 자꾸 꼬여서 file있을때의 sql 쿼리에는 notice 컬럼 안넣구
또 공지사항이 아닐때의 쿼리에도 notice 컬럼 빼먹고 이런식으로 복잡해져버려서ㅜㅜ
지피티의 도움을 받아서 삼항연산자 썼더니 코드도 간단해지구,,, 그랬어요
따봉 지피티야 고맙다~
'모의해킹' 카테고리의 다른 글
| PHP + MySQL 게시판 제작 - 파일 다운로드 (0) | 2026.02.16 |
|---|---|
| PHP + MySQL 게시판 제작 - 게시글 조회 (0) | 2026.02.16 |
| PHP + MySQL 게시판 제작 - 게시판 검색 기능 (0) | 2026.02.16 |
| PHP + MySQL 게시판 제작 - 게시판 리스트 (0) | 2026.02.16 |
| PHP + MySQL 게시판 제작 - 로그인 & 로그아웃 (0) | 2026.02.16 |