본문 바로가기
WEB HACKING/웹 해킹[실습]

Php로 웹 개발하기 : 게시판(5) - Read

by madevth 2021. 11. 17.
반응형

이번 포스팅에서는 글을 읽을 수 있는 기능을 만들 것이다.

우선 저번 (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);

잘 반영되었다.

반응형

댓글