이번 포스팅에서는 글을 읽을 수 있는 기능을 만들 것이다.
우선 저번 (4)에서 만든 board.php 안의 form에 글쓰기 버튼을 만들어서 write.php와 연결해준다.
<button onclick = "location.href = 'write.php'">글쓰기</button>
글 쓰기 form과 글 읽기 form은 css를 동일하게 적용할 것이니 글 읽기 기능을 먼저 만든 후 css를 한꺼번에 적용할 것이다.
제목 부분에 <a> 태그를 걸어 read.php로 이동할 수 있게 만든 후, 보기 간편하게 하기 위해 코드를 조금 수정해주었다.
<?php
if(array_key_exists('board_search', $_POST)){
board();
}
else{
$conn = mysqli_connect('localhost', 'ID', 'PW', 'DBname');
$sql = "SELECT * FROM board;";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_array($result)){
?>
<tr>
<td><?=$row['username']?></td>
<td><a href = 'read.php'><?=$row['title']?></a></td>
<td><?=$row['views']?></td>
<td><?=$row['date']?></td>
</tr>
<?php
}
mysqli_close($conn);
}
?>
그런데 클릭한 글을 불러오려면, 어떤 글을 클릭했는지 글을 특정할 파라미터를 추가해주어야 한다.
따라서 테이블에 id 값을 추가하고 파라미터로 id 숫자를 넘겨준 후, read.php에서는 get으로 id를 받아 해당 글의 제목과 글 내용을 불러오도록 해주자.
근데 id를 auto-increment로 설정하려 했더니 id가 primary key가 돼야 한다는 error가 발생했다.
[Error] Incorrect table definition; there can be only one auto column and it must be defined as a key
그래서 그냥 기존에 Primary Key로 설정했던 parameter 3개를 모두 get 넘겨주어 찾으려다가, 코드가 지저분해질 것 같아서 error를 해결해주었다.
ALTER table board DROP PRIMARY KEY;
기존의 Primary key를 삭제하려 하니 새로운 에러가 발생했다.
[Error] Cannot drop index 'PRIMARY': needed in a foreign key constraint
username에 Foreign key를 설정해주었기 때문에 이를 먼저 삭제해야 하는 에러였다.
ALTER table board DROP FOREIGN KEY username;
그래서 Foreign key를 먼저 삭제하려 하니 또 다른 에러가 발생했다.
[Error] Can't DROP 'username'; check that column/key exists
아니 왜 존재하는데 존재 안 한대? 찾아보니까 Foreign key constraint 때문이었다.
SHOW CREATE table board;
Foreign key에 boadr_ibfk_1의 형태로 Constraint가 생긴 것을 볼 수 있다.
alter table board drop foreign key board_ibfk_1;
이렇게 지우니 잘 지워졌다.
이제 primary key를 마저 지우고 id를 추가해주자.
ALTER table board DROP PRIMARY KEY;
ALTER table board add `id` int(5) AUTO_INCREMENT PRIMARY KEY;
이제 파라미터로 id를 넘겨서 read.php에서 제목과 내용을 출력해주자.
<tr>
<td><?=$row['username']?></td>
<td><a href = 'read.php?id=<?=$row['id']?>'><?=$row['title']?></a></td>
<td><?=$row['views']?></td>
<td><?=$row['date']?></td>
</tr>
[read.php]
<?php
if(isset($_GET['id'])){
$id = $_GET['id'];
$conn = mysqli_connect('localhost', 'ID', 'PW', 'DBname');
$sql = "SELECT * FROM board where id = '$id';";
$result = mysqli_query($conn, $sql);
if(mysqli_num_rows($result) > 0){
while($row = mysqli_fetch_array($result)){
echo $row['username'];
echo $row['title'];
echo $row['content'];
}
}
mysqli_close($conn);
}
?>
누른 글의 사용자 이름 + 제목 + 내용이 잘 출력되었다.
이제 css만 적용하면 완료!
글을 추가해보았는데, 기존에 title을 varchar(20)으로 설정해놓아서 저장이 안 되길래 길이를 50으로 늘려주었다.
ALTER table `board` MODIFY column title varchar(50);
잘 반영되었다.
'WEB HACKING > 웹 해킹[실습]' 카테고리의 다른 글
Php로 웹 개발하기 : 게시판(7) - Delete (0) | 2021.11.19 |
---|---|
Php로 웹 개발하기 : 게시판(6) - Create (0) | 2021.11.18 |
Python 자동화 코드 구현하기 : Blind SQL Injection (1) | 2021.11.16 |
Php로 웹 개발하기 : 게시판(4) - Create (0) | 2021.11.11 |
Php로 웹 개발하기 : 게시판(3) - Option Search (1) | 2021.11.10 |
댓글