본 게시글은 유튜브 생활코딩 온라인강의를 시청한 후 학습한 정보를 기록하는 목적의 게시글입니다.

생각의 흐름에 따라 작성된 게시글입니다. 가독성이 떨어질 수 있습니다.

생활코딩 유튜브

 

생활코딩

일반인에게 프로그래밍을 알려주는 온라인/오프라인 활동 입니다.

www.youtube.com

생활코딩 사이트

 

생활코딩

hello world 생활코딩의 세계에 오신 것을 환영합니다. 생활코딩은 일반인들에게 프로그래밍을 알려주는 무료 온라인, 오프라인 수업입니다.  어떻게 공부할 것인가를 생각해보기 전에 왜 프로그래밍을 공부하는 이유에 대한 이유를 함께 생각해보면 좋을 것 같습니다. 아래 영상을 한번 보시죠. 온라인 강의 소개 입문자의 가장 큰 고충은 '무엇을 모르는지 모르는 상태'일 겁니다. 온라인에는 프로그래밍을 익히는 데 필요한 거의 모든 정보가 있지만, 이 지식들은

opentutorials.org

생활코딩 WEP3 PHP & MySQL을 수강하기 위한 선수과목인

WEB2 - PHPDATABASE2 - MySQL에 대한 수강 기록입니다.

수강 일정은 야학의 수강계획표에 따릅니다.


#1.

이번에는 CRUD에서 Update를 구현해보고자 한다.

`글 수정`의 기능은 home에서는 나와선 안 될 것이고, 특정 글을 선택하였을 때에만 나와야 할 것이다.

이전에 글이 선택되지 않았을 경우 사용했던 조건문을 통해 이를 해결할 수 있다.

<?php if(isset($_GET['id'])) { ?>
  <a href="update.php?id=<?=$_GET['id']?>">update</a>
<?php } ?>

현재 우리 코드를 살펴보면 'id'값을 통해 글에 대한 정보를 출력하고 있으므로,

다시 이를 이용하여 id값이 선택되었을 경우에만 update링크가 출력될 수 있도록 바꿀 수 있다.

이후 update.php에 대한 코드는 아래와 같다.

<?php
function print_title(){
  if(isset($_GET['id'])){
    echo $_GET['id'];
  } else {
    echo "Welcome";
  }
}
function print_description(){
  if(isset($_GET['id'])){
    echo file_get_contents("data/".$_GET['id']);
  } else {
    echo "Hello, PHP";
  }
}
function print_list(){
  $list = scandir('./data');
  $i = 0;
  while($i < count($list)){
    if($list[$i] != '.') {
      if($list[$i] != '..') {
        echo "<li><a href=\"index.php?id=$list[$i]\">$list[$i]</a></li>\n";
      }
    }
    $i = $i + 1;
  }
}
?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>
      <?php
      print_title();
      ?>
    </title>
  </head>
  <body>
    <h1><a href="index.php">WEB</a></h1>
    <ol>
      <?php
      print_list();
      ?>
    </ol>
    <a href="create.php">create</a>
    <?php if(isset($_GET['id'])) { ?>
      <a href="update.php?id=<?=$_GET['id']?>">update</a>
    <?php } ?>
    <h2>
     <form action="update_process.php" method="post">
       <input type="hidden" name="old_title" value="<?=$_GET['id']?>">
       <p>
         <input type="text" name="title" placeholder="Title" value="<?php print_title(); ?>">
       </p>
       <p>
         <textarea name="description" placeholder="Description"><?php print_description(); ?></textarea>
       </p>
       <p>
         <input type="submit">
       </p>
     </form>
  </body>
</html>

여기서 index.php와 다른 코드는 input 태그의 `value` 속성이다.

기본적으로 create와 유사하나 우리가 수정하고자 하는 내용, 즉 (수정 전의) 이전 내용을 출력함으로써

보다 update스럽게 코딩을 바꿔줄 수 있다.

또한 hidden 태그가 추가되었는데 이는 update_process를 설명하면서 후술하겠다.

마찬가지로 update_process 역시 post방식으로 정의해주면 update를 구현할 수 있다.

<?php
	rename('data/'.$_POST['old_title'], 'data/'.$_POST['title']);
	file_put_contents('data/'.$_POST['title'], $_POST['description']);
	header('Location: /index.php?id='.$_POST['title']);
?>

여기서 새로 등장한 함수가 바로 rename이다.

rename에 관한 공식문서는 이 글 참조

 

PHP: rename - Manual

- rename extension of files changeext($directory, $ext1, $ext2, $verbose)i wrote this function to rename the extention of some files in a folder and sub-folders inside it ..parameter 1 :  the directory name parameter 2 :  the first extention wich we want

www.php.net

rename ( string $oldname , string $newname [, resource $context ] ) : bool

변경하고자 하는 이름을 $oldname에 선언하고, 변경할 이름을 $newnamedp 선언한 이후,

파일 이름을 바꾸고, newname이 존재하는 경우는 이를 덮어쓰는 것으로 설명이 나와있다.

여기서 필요한 것이 $oldname인데 이 해결을 위하여,

create.php에서 hidden 타입으로 인풋태그를 정의하여 사용자에게는 보이지 않게

$id 변수를 old_title이란 이름으로 create_porcess.php에 넘겨주고 있다.

 

#2.

드디어 CRUD의 마지막 Delete를 구현할 차례이다.

삭제 역시, 수정 처럼 현재 글을 조회중일 때 활성화 되어야 할 것이다.

따라서 update를 구현할 때 사용한 조건문을 활용하면 쉽게 이를 구현할 수 있다.

<?php if(isset($_GET['id'])) { ?>
    <a href="update.php?id=<?=$_GET['id']?>">update</a>
    //삭제기능이 추가될 위치
<?php } ?>

그런데 삭제 기능의 경우, update나 create처럼 다른 폼으로 이동할 필요 없이,

현재 보고있는 글이 삭제되는 것만으로 그 기능을 온전히 구현할 수 있기 때문에 바로 process를 호출해도 충분하다.

<?php if(isset($_GET['id'])) { ?>
    <a href="update.php?id=<?=$_GET['id']?>">update</a>
    <a href="delete_process.php?id=<?=$_GET['id']?>">update</a>
<?php } ?>

그렇다면 delete_process에서는 dir에서 파일을 삭제하는 기능을 구현해야 할텐데,

그 때 사용하는 함수가 바로 unlink이다.

 

PHP: unlink - Manual

Deleted a large file but seeing no increase in free space or decrease of disk usage? Using UNIX or other POSIX OS?The unlink() is not about removing file, it's about removing a file name. The manpage says: ``unlink - delete a name and possibly the file it

www.php.net

unlink ( string $filename [, resource $context ] ) : bool

unlink 함수의 경우 filename을 받아 그 파일을 삭제하는 기능을 한다.

그렇다면 코드를 아래와 같이 구현할 수 있을 것이다.

<?php
    unlink('data/'.$_POST['id']);
    header('Location: /index.php');
?>

이로써 delete 구현 끝!

이라고 하기에는 조금 찝찝한 부분이 있다.

가령 지금처럼 delete를 구현하게 된다면, 링크로(get방식)으로 구현되기 때문에

만약 누군가가 url을 카피하고, 그 url에 담긴 id값을 바꾸는 방식으로

우리의 데이터를 전부 삭제할 수 있을 것이다.

이를 방지하기 위해 form과 post방식을 이용해서 링크를 수정해줄 필요가 있다.

<form action="delete_process.php" method="post">
      <input type="hidden" name="id" value="<?=$_GET['id']?>">
      <input type="submit" value="delete">
</form>

이렇게 코딩을 하게 되면 UI가 상당히 이질적이게 나오지만,

id값을 숨기면서 post방식으로 delete를 구현할 수 있게 된다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기