본 게시글은 유튜브 생활코딩 온라인강의를 시청한 후 학습한 정보를 기록하는 목적의 게시글입니다.
생각의 흐름에 따라 작성된 게시글입니다. 가독성이 떨어질 수 있습니다.
생활코딩 WEP3 PHP & MySQL을 수강하기 위한 선수과목인
WEB2 - PHP와 DATABASE2 - 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에 관한 공식문서는 이 글 참조
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이다.
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를 구현할 수 있게 된다.
최근댓글