[PHP 7] MySQL 게시판 만들기 (1)

김와앙·2023년 10월 15일

PHP 7

목록 보기
8/20
  • 필요한 페이지
    📄lib. php (라이브러리용 php)
    📑list.php (작성한 글이 저장 완료되었을 때 보이는 페이지)
    📃write.php (글을 작성할 때 보이는 페이지)
    📃writePost.php (글을 다 쓰고 '저장' 했을 때 데이터를 받아서 mysql로 보내줄 페이지)
    📃view.php (게시판의 글들을 눌러서 쓴 글을 들어가 보는 페이지)

게시판용 데이터 테이블 생성

: 게시판 데이터가 저장될 공간이 필요함.

(new!) 필요한 데이터 칼럼 수 만큼 만들어준다.

라이브러리의 경우 이전과 동일하게 복.붙 하여 사용하면 된다.

✏️ write.php

: action 태그의 링크(writePost.php)로 데이터를 POST 방식으로 보낸다.

(이 간단한 모양을 짜는데도 아직 좀 서투르다,, html/css 기초를 밟아주겠다,,,,😇💢)

<form action="writePost.php" method="POST">

✓ method="post" 라고 소문자로 썼더니 데이터가 안넘어감.
대문자로 쓰면 넘어간다.

✏️ writePost.php

: POST 방식으로 데이터를 받는 경우 url 에 명시되지 않는다.
: insert into
: mysql 에 넣자!

print_r($_POST);
//print_r($_GET);  get 방식일 경우
  • Post 방식으로 넘어온 데이터들을 출력해 볼 수 있다.

배열의 형태로 잘 넘어간 걸 확인하면 데이터 넘기기는 정상임.
배열로 데이터를 확인할 때 잘 알아볼 수 있게
데이터는 항상 이름을 잘 매겨놓도록해야함.

그렇다면 이제 , 넘어온 데이터를 writePost 에서 mysql 로 넘겨줘야한다.

 	$name = $_POST['name'];
    $memo = $_POST['memo'];
    $subject = $_POST['subject'];

우선 데이터별로, 각 변수에다가 넘어온 데이터를 담아준다.

📌php 해킹 방지

$name = mysqli_real_escape_string($name);
//subject, memo 도 동일하게 해준다.

그리고 해킹 방지로 위의 코딩을 추가로 작성해준다고 한다.
일종의 2차 가공이랄까, 해주는게 좋다고 한다.

 	$regedate = date('Y-m-d H:i:s');
    $ip= $_SERVER['REMOTE_ADDR']; 📌


    $query = "insert into sing_board(name, memo, subject, regedate, ip) 
    values('$name','$memo','$subject','$regedate','$ip')";

    echo $query;

📌PHP 에서 사용자 ip 를 알려주는 함수다.
[REMOTE_ADDR] 이라고 치면 안되고, 안에 '' 필수.

데이터는 mysql문으로 새로 만든 sing_board 데이터 테이블에 넣어준다.

echo 로 출력해보면,

이렇게 나온다. (mysql에 잘 넘어가는 군! 🙄)

확인했으니 이제... 진짜 넣어주면 끝.

mysqli_query($connect, $query); // . . . -  > 📂

연결은 기초적인거니까 기억하기 !


쏘옥 - 잘 들어갔구나 (뿌듯)

또 복습 ! 동일하게, 저장버튼을 누른 뒤 다시 원래페이지로 돌아가도록 스크립트 작성해준다.

go back!

    <script>
        location.href ="list.php";
    </script>

✏️ list.php

: my sql 에 저장된 데이터를 가지고와서 나타내기 (select from)


    $query = "select * from sing_board order by idx desc";📌
    $result = mysqli_query($connect, $query);

    while($data= mysqli_fetch_array($result)){📌

?>   
        <tr> 
        <th><?=$data['idx']?></th>
        <th><?=$data['name']?></th>
        <th><?=$data['subject']?></th>
        <th><?= $data['regedate']?></th>
      </tr>
  
<?php
    }
?>
  • mysql_fetch_array () 함수는 DB 에 있는 레코드 셋을 php 배열로 가져와주는 함수이다.

+) substr() 함수
: 문자열의 길이를 줄여주는 함수
substr( 문자, 줄일 문자의 시작 idx, 마지막 idx)

 <th><?=substr($data['regedate'],0,10)?></th>


이렇게 문자열이 줄어든다.

이제 제목을 누르면 페이지가 view 로 이동하도록 한다.

<th>
<a href="view.php?idx=<?=$data['idx']?>"><?=$data['subject']?></a>
</th>

"view.php" 로 링크를 걸어준다음 GET 방식을 사용하여
( '?idx =' )내가 클릭한 제목의 idx 를 보낸다.

⭐️GET 방식은 url 전달!

✏️ view.php

: 제목을 누르면 글을 들어가서 보게하는 페이지.
: list.php 에서 보낸 idx 데이터를 받아서 보여주는 페이지.
: 추가 응용 기능 - 삭제 / 수정

✓데이터를 보냈으면 ? 데이터를 받아야한다!

:Get 방식으로 데이터가 보내졌으면 Get 으로 받는다!
콩콩팥팥

<?php       
    include "lib.php";

    $idx= $_GET['idx'];
    $idx = mysqli_real_escape_string($connect, $idx);

    $query = "select * from sing_board where idx ='$idx' ";
    $result = mysqli_query($connect, $query);

    $data = mysqli_fetch_array($result); 

    // print_r($data);

?>

배열로 나눠진 데이터를 배열형태로 잘 넣어주기만 하면

idx에 따른 게시글이 잘 보인다. ㅠ ㅅ ㅠ b

+) 내용 줄바꿈 반영하는 법 (php)

<tr>
    <th height=300>내용</th>
    <td>
        <?=nl2br($data['memo'])?>
    </td>
</tr>
  • 줄바꿈 반영되지 않는 경우 nl2br() 함수로 감싸주면 된다.

⛔️ Del.php (삭제)

<?php

     include "lib.php";

     $idx = $_GET['idx'];

 
     $query = "delete from sing_board where idx='$idx' ";
 
     mysqli_query($connect,$query);
 
     ?> 
 
 <script>
         location.href = "list.php";
 
  </script>

삭제의 경우 저번시간에 사용한 걸 그대로 가져와서 사용했다.
간단하다.

✍🏻 write.php (수정)

:수정 기능의 경우 write 페이지를 응용하여 만들어주면 된다.
:기존에 write.php 에서 썼던 데이터를 들고와서 보여줘야하기 때문이다.

  • 이렇게, write.php 이되? 내가 보던 그 게시글의 데이터가 그대로 있어야 수정페이지라고 할 수있다.
  • 내가 보던 게시글은 즉 인덱스로 구분이 되기때문에, 게시글의 인덱스를 받아
    write 페이지에 넣어주면 된다.
  • 있던 데이터를 가져오는 것이기 때문에 select * from 문을 작성해주면 된다. (동일하니까 생략.)
<form action="writePost.php" method="POST">
<table border="1" width="800" cellpadding=5>
   <tr>
    <th>이름</th>
    <td>
        <input type="text" name="name" style="width:100%;" value="<?=$data['name']?>" >
    </td>
   </tr>
   <tr>
    <th>제목</th>
        <td>
        <input type="text" name="subject" style="width: 100%;" value="<?=$data['subject']?>">
        </td>
    
   </tr>
   <tr>
    <th>내용</th>
    <td>
       <textarea name="memo" style="width:100%; height:300px" ><?=$data['memo']?></textarea>
    </td>
   </tr>
   <tr>
  • 그렇게 가져온 데이터를 value 값으로 넣어준다.
    이렇게 하면, 잘 작동하는데, 문제는 페이지에서 내가 이걸 수정하는 것인지, 새로 작성한 것인지 구분을 하지못하고 무조건 새글로 올려버린다는 것이다.

왜냐하면 글쓰기 데이터를 관리하는 writePost.php 가 무조건 insert 만을 하고 있기 때문이다.
(수정이 안되고 새글로 만들어짐.)

➡️ 따라서 , WritePost.php 에서 이 두가지를 구분해줘야한다.

수정된 글과 새 글 구분하기

key : 새 글을 쓸 때는 idx 가 넘어가지 않고, 수정할 때는 수정된 기존 인덱스의 정보가 넘어간다.

기존의 write .php 는 새 글만을 다뤘기 때문에 idx 가 따로 필요없었으나
수정을 하기 위해서는 기존 인덱스의 정보를 받아야 한다.

우선 idx 값을 보내기 위해 write.php 에

<input type="hidden" name="idx" value="<?=$idx?>">

이걸 추가해준다. 화면에 표시되지 않지만 idx를 보내준다.

 $name = $_POST['name'];
    $memo = $_POST['memo'];
    $subject = $_POST['subject'];
    $idx = $_POST['idx'];

    $name = mysqli_real_escape_string($connect, $name);
    $subject = mysqli_real_escape_string($connect, $subject);
    $memo = mysqli_real_escape_string($connect, $memo); //해킹 방지
    $idx = mysqli_real_escape_string($connect, $idx);

데이터를 보내면 뭐다? 받아야한다..

writePost 에서는 이렇게 인덱스 정보를 추가로 받게 해준다. 그리고,

⭐️ if- else 구문을 사용해서 수정글과 새글을 구분해준다.


    if($idx){//수정


        $query="update sing_board set name='$name',
        subject='$subject',📌
        memo='$memo' 
        where idx='$idx' ";

        mysqli_query($connect, $query);


    }else{
    $regedate = date('Y-m-d H:i:s');
    $ip= $_SERVER['REMOTE_ADDR'];


    $query = "insert into sing_board(name, memo, subject, regedate, ip) 
    values('$name','$memo','$subject','$regedate','$ip')";

    mysqli_query($connect, $query);

    }

인덱스가 있다면 수정글로 기존글을 업데이트만 해준다. 라는 조건문을 사용하여
만들어주면 된다.
그 외의 것은 다 새 글로 간주!

End -

profile
greedy college ssu.tudent 👩‍🎓

0개의 댓글