Web/Project

[Project] PHP 방명록 만들기 4) : 삭제 페이지 완성(delete.php)

chojja7188 2018. 1. 19. 22:01

안녕하세요, 초짜입니다.


저번 시간에는 추가 페이지인 insert.php를 만들고 list.php를 조금 수정했었습니다.


이번에는 이제 쓴 글을 삭제하는 페이지를 만들어보겠습니다.


우선 DB에 연결해야되므로


$conn = mysqli_connect("localhost", "사용자이름", "비밀번호");

$db = mysqli_select_db($conn, "데이터베이스이름");


를 입력해주세요.


제가 만들고 싶은 삭제 페이지는 이렇습니다.



이렇게 비밀번호 입력 칸이 있고


list.php에서 입력했던 비밀번호와 delete.php에서 입력한 비밀번호가 일치하면


글을 삭제하게 할 것입니다.


대충 HTML로 우선 틀을 잡아줍시다.


<form method="post" action="">

      <table border=1>

        <tr>

          <td>비밀 번호</td>

          <td><input type="password" name="pass" /></td>

          <td><input type="submit" value="확 인" /></td>

        </tr>

      </table>

    </form>


여기서 중요한 부분이 바로 action입니다.


action은 이제 form 태그에서 받은 값을 어떤 주소로 보낼지인데


제가 구상한 것은 list.php에서 delete.php로 a 태그로 이동할 때


echo "<td><a href='delete.php?id=$row[id]'>삭제</a></td></tr>";


이런 구문이 있었습니다.


id에 $row[id]값을 넣어서 delete.php에 전송하는 것을 볼 수 있습니다.


이렇게 전송받은 id값을 이용해서 그 id를 가진 필드의 비밀번호 값과


delete.php에서 입력한 비밀번호 값이 일치한다면 삭제한 후 alert가 뜨고 list.php로 이동하고


일치하지 않는다면 삭제되지 않고 alert가 뜨고 list.php로 이동하는 것입니다.


말이 길었네요. 우선 action에 들어갈 것을 생각해보자면


delete.php 자기 자신에게 전송해야 되고 id에 따라 비밀번호를 찾는 것이기 때문에


id 역시 전송해야 됩니다. 따라서 일단 이렇게 써둡시다.


<form method="post" action="<?=$_SERVER[PHP_SELF]?>?id=<?=$_GET[id]?>">


여기서 <?=와 ?>를 볼 수 있는데요. 이건 <?php와 ?>와 같다고 생각하시면 됩니다.


이젠 이제 비교를 하는 코드를 작성해봅시다.


우선 쿼리 변수에다가 전송받은 id와 같은 필드인 pass를 찾는 구문을 넣습니다.


그리고 그렇게 찾은 pass와 delete.php에서 입력받은 pass를 비교합시다.


두 pass가 같으면 삭제되는 구문을 사용하면 되겠습니다.


그렇게 완성한 코드는 이렇습니다.


<?php

    $sql="SELECT pass FROM guestbook WHERE id='$_GET[id]'";

    $result=$conn->query($sql);

    $row=$result->fetch_array();

    if($row[pass] == $_POST[pass])

    {

      $sql="DELETE FROM guestbook WHERE id='$_GET[id]'";

      $result=$conn->query($sql);

      echo "<script>alert('글이 삭제되었습니다');";

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

    }else{

      echo "<script>alert('비밀번호가 틀렸습니다');";

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

    }

     ?>


약간의 부연설명이 필요한 부분을 보자면


SELECT pass FROM guestbook WHERE id='$_GET[id]'";


부분을 해석해보자면 guestbook 테이블 안에서 id가 $_GET[id]인 pass를 찾는 것입니다.


여기서 $_GET[id]는 list.php에서 전송한 id값이 되겠습니다.


이렇게 해서 만들어진 코드는 이렇습니다.


<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title></title>

  </head>

  <body>

    <?php

    $conn=mysqli_connect("localhost", "사용자이름", "비밀번호");

    $db=mysqli_select_db($conn, "데이터베이스이름");

     ?>

    <form method="post" action="<?=$_SERVER[PHP_SELF]?>?id=<?=$_GET[id]?>">

      <table border=1>

        <tr>

          <td>비밀 번호</td>

          <td><input type="password" name="pass" /></td>

          <td><input type="submit" value="확 인" /></td>

        </tr>

      </table>

    </form>

    <?php

    $sql="SELECT pass FROM guestbook WHERE id='$_GET[id]'";

    $result=$conn->query($sql);

    $row=$result->fetch_array();

    if($row[pass] == $_POST[pass])

    {

      $sql="DELETE FROM guestbook WHERE id='$_GET[id]'";

      $result=$conn->query($sql);

      echo "<script>alert('글이 삭제되었습니다');";

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

    }else{

      echo "<script>alert('비밀번호가 틀렸습니다');";

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

    }

     ?>

  </body>

</html>


그런데 이렇게 할 경우 문제가 생길 것입니다.



보시다시피 삭제를 눌렀을 뿐인데 비밀번호가 틀렸다는 알림이 뜹니다.


그 이유를 보자면 저 alert는 $row[pass]와 $_POST[pass]가 같지 않을 때 뜨는 alert인데


저흰 아무것도 입력을 한 것이 없으므로 서로 다르게 된 것입니다.


이것을 막기 위해서 저는 다른 것을 추가해보겠습니다.


<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title></title>

  </head>

  <body>

    <?php

    $conn=mysqli_connect("localhost", "사용자이름", "비밀번호");

    $db=mysqli_select_db($conn, "데이터베이스이름");

    if($_GET[mode]!="delete")

    {

     ?>

    <form method="post" action="<?=$_SERVER[PHP_SELF]?>?id=<?=$_GET[id]?>&mode=delete">

      <table border=1>

        <tr>

          <td>비밀 번호</td>

          <td><input type="password" name="pass" /></td>

          <td><input type="submit" value="확 인" /></td>

        </tr>

      </table>

    </form>

    <?php

    exit;

  }

    $sql="SELECT pass FROM guestbook WHERE id='$_GET[id]'";

    $result=$conn->query($sql);

    $row=$result->fetch_array();

    if($row[pass] == $_POST[pass])

    {

      $sql="DELETE FROM guestbook WHERE id='$_GET[id]'";

      $result=$conn->query($sql);

      echo "<script>alert('글이 삭제되었습니다');";

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

    }else{

      echo "<script>alert('비밀번호가 틀렸습니다');";

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

    }

     ?>

  </body>

</html>


달라진 부분은 빨간색입니다.


만약에 mode가 delete가 아닐 경우에 비밀번호 입력 창이 뜨게 되는 것입니다.


form에서 submit을 누르면 이제 mode가 delete가 될 것이고 exit로 나간 후에


참, 거짓을 구분하는 것입니다.


다시 말하자면 mode가 delete이기 전에는 참, 거짓을 구분하지 않고


확인 버튼을 누르면 mode가 delete가 되기 때문에 그떄부터 참, 거짓을 구분하게 되는 것입니다.


한번 확인해보세요. 이제 잘 되실겁니다.


삭제를 만들었으니 다음에는 수정을 만들어보도록 하겠습니다.


이번 포스팅은 여기까지입니다, 감사합니다.


댓글 한번씩 달아주시면 감사하겠습니다!


초짜의 예전 블로그 가기