이제 이전 포스팅에서 배웠던 내용을 모두 활용하여 웹 사이트를 만들겁니다.
이 웹 사이트는 당연히 생활코딩에서 진행한 내용이고, 전체 코드를 보여드린 뒤 하나씩 설명하는 방식으로 진행할겁니다. 넵 아마도요.
기능은 동영상으로 준비했습니다.
따로 설명하기가 너무 귀찮아서요..ㅎ 안보셔도 좋습니다. 워낙 간단한 기능들이기 때문이죠.
이 모든 코드는
https://github.com/Nesquitto/PHP_MySQL-Study
이곳에 저장되어 있습니다!
물론 이 포스팅에도 모든 코드가 올라가긴 합니다.
index.php
먼저 index.php 코드입니다.
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
$sql = "SELECT * FROM topic";
$result = mysqli_query($conn, $sql);
$list = '';
while($row = mysqli_fetch_array($result)){
//<li><a href=\"index.php?id=19\">MySQL</a></li>
$list = $list."<li><a href=\"index.php?id={$row['id']}\">{$row['title']}</a></li>";
}
$article = array(
'title'=>'Wellcome',
'description'=>'hello Web'
);
$update_link = '';
$delete_link = '';
$author = '';
if(isset($_GET['id'])) {
$filtered_id = mysqli_real_escape_string($conn, $_GET['id']);
$sql = "SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.id WHERE topic.id = {$filtered_id}";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
$article['title'] = htmlspecialchars($row['title']);//htmlspecialchars를 통해 XSS를 막을 수 있다.
$article['description'] = htmlspecialchars($row['description']);
$article['name'] = htmlspecialchars($row['name']);
$update_link = '<a href="update.php?id='.$_GET['id'].'">update</a>';
$delete_link = '
<form action="process_delete.php" method="post">
<input type = "hidden" name = "id" value = "'.$_GET['id'].'">
<input type = "submit" value = "delete">
</form>
';
$author = "<p>by ".$article['name']."</p>";
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WEB</title>
</head>
<body>
<h1><a href="index.php">WEB</a></h1>
<a href="author.php">author</a>
<ol>
<?=$list;//echo $list와 같은 효과를 낸다.?>
</ol>
<a href="create.php">create</a>
<?=$update_link ?>
<?=$delete_link ?>
<h2><?=$article['title']?></h2>
<?=$article['description']?>;
<?=$author?>
</body>
</html>
뭔가 엄청나게 길다고 느껴지는데요... 잘 보시면 html코드는 한참 밑에 있다는 것을 알 수 있죠.
대부분의 줄이 변수를 정의하는데 많이 사용했는데요. 전체적으로 페이지를 구성하는 부분을 더 잘 보고 빠르게 필요한 부분만 확인하기 위해서입니다.
만약 강의도 없이 저 혼자 만들었으면 엄청 더러워서 여러분은 이해할 수 없을지도 모릅니다.
대부분의 코드가 이렇게 작성되어 있답니다.
아 설명을 시작하기 전에 당부드릴 말은 코드 전체를 설명하는 것이기 때문에 모든것을 세세하게 설명하기에는 한계가 있습니다.
위에서 $result까지는 저번 포스팅에서 설명했으니 넘어가도록 하겠습니다.
$list = '';
while($row = mysqli_fetch_array($result)){
//<li><a href=\"index.php?id=19\">MySQL</a></li>
$list = $list."<li><a href=\"index.php?id={$row['id']}\">{$row['title']}</a></li>";
}
이 부분은 데이터베이스에서 레이블의 각 title필드를 통해 목록을 구성하고 $list에 저장합니다.
말 그대로 저 코드를 넣고 $list를 php에서 사용한다면 목차를 불러올 수 있죠.
참고로
$list = $list."<li><a href=\"index.php?id={$row['id']}\">{$row['title']}</a></li>";
$list .="<li><a href=\"index.php?id={$row['id']}\">{$row['title']}</a></li>";
이 둘은 서로 같은 의미입니다. 좀 더 짧게 쓸 수 있는 방법이죠.
$article = array(
'title'=>'Wellcome',
'description'=>'hello Web'
);
이 부분은 기본적으로 index.php에 들어가서 데이터를 선택하지 않았을 때 넣어두는 데이터를 설정해 놓습니다.
$article 변수는 이후에 제목과 설명을 출력할 때 사용하는 변수가 되며, 기본적으로 title에는 wellcome이 description에는 hello web이라는 데이터가 들어가 있습니다.
저기에서 wellcome, hello web이 출력됩니다.
$update_link = '';
$delete_link = '';
$author = '';
이 부분은 '이런 변수도 있다'라는 형식으로 먼저 넣어준 겁니다. 변수가 정의되어 있지 않은 상태에서는 사용할 수 없으니까요.
if(isset($_GET['id'])) {
$filtered_id = mysqli_real_escape_string($conn, $_GET['id']);
$sql = "SELECT *
FROM topic
LEFT JOIN author
ON topic.author_id = author.id WHERE topic.id = {$filtered_id}";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
$article['title'] = htmlspecialchars($row['title']);
$article['description'] = htmlspecialchars($row['description']);
$article['name'] = htmlspecialchars($row['name']);
$update_link = '<a href="update.php?id='.$_GET['id'].'">update</a>';
$delete_link = '
<form action="process_delete.php" method="post">
<input type = "hidden" name = "id" value = "'.$_GET['id'].'">
<input type = "submit" value = "delete">
</form>
';
이 부분은 어떻게 설명해야될지 참 고민됩니다...
음 천천히 설명해보자면.
if(isset($_GET['id']))
이 부분에서는 링크에서 127.0.0.1/index.php?id=3 와 같이 있을 때 id값이 존재하는지를 판단합니다.
없으면 이 if문을 건너뛰게 되고 이런 경우는 위에서 보셨던 사진처럼 페이지에 처음 들어와서 아무런 데이터도 선택하지 않았을 때입니다.
만약 데이터가 id=3 처럼 존재한다면 수행하게 되는데요.
중괄호를 설명하기 전에 보안측면에서 사용한 함수를 몇개 설명하겠습니다.
mysqli_real_escape_string($conn, string)
: string에 입력된 데이터가 mysql에서 명령어로 인식되지 않도록 합니다.
htmlspecialchars(string)
: string에 입력된 데이터 중 html 특수문자를 일반문자로 인식되도록 합니다.
그냥 보시고 '아 이걸 사용한 이유는 보안때문이구나' 라고 생각하시면 됩니다.
이제 괄호 안을 한줄 한줄 설명하겠습니다.
$filtered_id = mysqli_real_escape_string($conn, $_GET['id']);
이건 보안때문입니다. 아시겠죠? 그냥 '$filtered_id에 보안처리 된 $_GET['id']가 들어있구나' 하면 됩니다.
$sql = "SELECT *
FROM topic
LEFT JOIN author
ON topic.author_id = author.id
WHERE topic.id = {$filtered_id}";
이게 한줄입니다. 참 길죠? 내용은 단순히 관계형 데이터베이스를 불러오는 명령어를 $sql에 저장할 뿐입니다.
아 topic.id의 값이 $filtered_id, 즉 $_GET['id'] 라고 하네요.
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
불러온 데이터를 $result에 저장하고 배열 형식으로 정리합니다. 이전 포스팅에서 배웠습니다.
$article['title'] = htmlspecialchars($row['title']);
$article['description'] = htmlspecialchars($row['description']);
$article['name'] = htmlspecialchars($row['name']);
정리된 데이터를 필드별로 보안처리 해서 $article 변수에 배열형식으로 다시 저장했습니다.
$update_link = '<a href="update.php?id='.$_GET['id'].'">update</a>';
$delete_link = '
<form action="process_delete.php" method="post">
<input type = "hidden" name = "id" value = "'.$_GET['id'].'">
<input type = "submit" value = "delete">
</form>
';
$update_link라는 변수는 update.php로 이동하는 하이퍼링크가 저장되어 있고
$delete_link라는 변수는 delete 버튼을 누르면 process_delete.php로 id값을 보내는 명령이 저장되어 있네요.
모두 php 파트에서 배운 내용입니다.
$author = "<p>by ".$article['name']."</p>";
마지막으로 이 부분은 $author에 mysql에서 name 필드로 저장되어 있는 데이터를 by [name]으로 출력하기 위해 만든 부분입니다.
이렇게 if문 안을 정리해 보았습니다.
이제 html 부분입니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WEB</title>
</head>
<body>
<h1><a href="index.php">WEB</a></h1>
<a href="author.php">author</a>
<ol>
<?=$list;//echo $list와 같은 효과를 낸다.?>
</ol>
<a href="create.php">create</a>
<?=$update_link ?>
<?=$delete_link ?>
<h2><?=$article['title']?></h2>
<?=$article['description']?>;
<?=$author?>
</body>
</html>
이렇게 생겼는데 뭐 별거 없어보이죠?
정말 별거 없습니다.
다 위에서 설명한 내용입니다. 그냥 넘어가겠습니다.
create.php
다음으로 create.php에 대해 설명하겠습니다.
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
$sql = "SELECT * FROM topic";
$result = mysqli_query($conn, $sql);
$list = '';
while($row = mysqli_fetch_array($result)){
//<li><a href=\"index.php?id=19\">MySQL</a></li>
$list = $list."<li><a href=\"index.php?id={$row['id']}\">{$row['title']}</a></li>";
}
$sql = "SELECT * FROM author";
$result = mysqli_query($conn, $sql);
$select_form = '<select name="author_id" method = "post">';
while($row = mysqli_fetch_array($result)){
$select_form .= '<option value="'.$row['id'].'">'.$row['name'].'</option>';
}
$select_form .= '</select>';
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WEB</title>
</head>
<body>
<h1><a href="index.php">WEB</a></h1>
<ol>
<?=$list;//echo $list와 같은 효과를 낸다.?>
</ol>
<form action="process_create.php" method="post">
<p><input type = "text" name = "title" placeholder="title"</p>
<p><textarea name="description" placeholder="description"></textarea></p>
<?=$select_form?>
<p><input type = "submit"></p>
</form>
</body>
</html>
이제부터는 index.php와 겹치는 부분이 꽤나 있기 때문에 빠르게 끝낼 수 있습니다.
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
$sql = "SELECT * FROM topic";
$result = mysqli_query($conn, $sql);
$list = '';
while($row = mysqli_fetch_array($result)){
//<li><a href=\"index.php?id=19\">MySQL</a></li>
$list = $list."<li><a href=\"index.php?id={$row['id']}\">{$row['title']}</a></li>";
}
이 부분은 동일합니다. 넘어가겠습니다.
$sql = "SELECT * FROM author";
$result = mysqli_query($conn, $sql);
author 테이블에서 모든 데이터를 가져와 $result에 저장했습니다.
$select_form = '<select name="author_id" method = "post">';
while($row = mysqli_fetch_array($result)){
$select_form .= '<option value="'.$row['id'].'">'.$row['name'].'</option>';
}
$select_form .= '</select>';
이 부분은 $select_form이라는 변수를 만드는 과정입니다.
이 부분을 만들기 위한 과정입니다.
author_id 값을 post 방식으로 보내기 위한 변수인데, 데이터는 선택상자를 통해 고를 수 있으며
while($row = mysqli_fetch_array($result)){
$select_form .= '<option value="'.$row['id'].'">'.$row['name'].'</option>';
}
이 부분에서 <option></option> 이 각각의 선택지를 말하며, 선택지 이름은 sql의 name필드값, 선택지 값은 id필드값입니다.
따라서 name 필드값을 통해 선택한 선택지의 id필드값이 author_id 값으로 보내지게 됩니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WEB</title>
</head>
<body>
<h1><a href="index.php">WEB</a></h1>
<ol>
<?=$list;//echo $list와 같은 효과를 낸다.?>
</ol>
<form action="process_create.php" method="post">
<p><input type = "text" name = "title" placeholder="title"</p>
<p><textarea name="description" placeholder="description"></textarea></p>
<?=$select_form?>
<p><input type = "submit"></p>
</form>
</body>
</html>
이제 나머지는 html 부분이며 이는 php 기초에서 다뤘습니다.
process_create.php
create.php에서 submit을 누르면 실행되는 페이지입니다.
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
$filtered = array(
'title'=>mysqli_real_escape_string($conn, $_POST['title']),
'description'=>mysqli_real_escape_string($conn, $_POST['description']),
'author_id'=>mysqli_real_escape_string($conn, $_POST['author_id'])
);
$sql = "
INSERT INTO topic
(title, description, created, author_id)
VALUES(
'{$filtered['title']}',
'{$filtered['description']}',
NOW(),
{$filtered['author_id']}
)
";
$result = mysqli_query($conn, $sql);
if($result === false){
echo "데이터가 올바르지 않습니다. 관리자에게 문의해주세요.";
}
else {
echo '저장에 성공했습니다. <a href="index.php">돌아가기</a>';
}
?>
$filtered = array(
'title'=>mysqli_real_escape_string($conn, $_POST['title']),
'description'=>mysqli_real_escape_string($conn, $_POST['description']),
'author_id'=>mysqli_real_escape_string($conn, $_POST['author_id'])
);
이 부분은 $filtered 변수에 배열 형식으로 post 방식으로 보내진 title, description, author_id 값을 보안처리 후 저장합니다. 따라서 $filtered 변수에는 받은 값의 내용이 모두 담겨있습니다.
$sql = "
INSERT INTO topic
(title, description, created, author_id)
VALUES(
'{$filtered['title']}',
'{$filtered['description']}',
NOW(),
{$filtered['author_id']}
)
";
이제 받은 내용을 데이터베이스에 저장해야죠. 그 과정이 바로 이 과정입니다.
mysql에 데이터를 저장하는 명령어를 $sql 변수에 넣게 됩니다.
저장되는 value는 모드 post 방식으로 받았던 $filtered 배열에 저장된 데이터네요.
$result = mysqli_query($conn, $sql);
if($result === false){
echo "데이터가 올바르지 않습니다. 관리자에게 문의해주세요.";
}
else {
echo '저장에 성공했습니다. <a href="index.php">돌아가기</a>';
}
작성한 sql문을 보내고 오류의 발생여부에 따라서 출력되는 내용이 다르게 설정되어 있습니다.
만약 저장에 성공한다면 '돌아가기'링크를 통해 index.php로 돌아갈 수 있습니다.
update.php(전부 앞에서 배운 내용들입니다.)
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
$sql = "SELECT * FROM topic";
$result = mysqli_query($conn, $sql);
$list = '';
while($row = mysqli_fetch_array($result)){
//<li><a href=\"index.php?id=19\">MySQL</a></li>
$list = $list."<li><a href=\"index.php?id={$row['id']}\">{$row['title']}</a></li>";
}
$article = array(
'title'=>'Wellcome',
'description'=>'hello Web'
);
if(isset($_GET['id'])) {
$filtered_id = mysqli_real_escape_string($conn, $_GET['id']);
$sql = "SELECT * FROM topic WHERE id = {$filtered_id}";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
$article['title'] = $row['title'];
$article['description'] = $row['description'];
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WEB</title>
</head>
<body>
<h1><a href="index.php">WEB</a></h1>
<ol>
<?=$list;//echo $list와 같은 효과를 낸다.?>
</ol>
<form action="process_update.php" method="post">
<input type="hidden" name="id" value="<?=$_GET['id']?>">
<p><input type = "text" name = "title" placeholder="title" value="<?=$article['title']?>"</p>
<p><textarea name="description" placeholder="description"><?=$article['description']?></textarea></p>
<p><input type = "submit"></p>
</form>
</body>
</html>
update.php도 몇 개 빼고는 비슷합니다. 점점 더 설명해야 할 내용이 줄어드네요.
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
$sql = "SELECT * FROM topic";
$result = mysqli_query($conn, $sql);
$list = '';
while($row = mysqli_fetch_array($result)){
//<li><a href=\"index.php?id=19\">MySQL</a></li>
$list = $list."<li><a href=\"index.php?id={$row['id']}\">{$row['title']}</a></li>";
}
$article = array(
'title'=>'Wellcome',
'description'=>'hello Web'
);
if(isset($_GET['id'])) {
$filtered_id = mysqli_real_escape_string($conn, $_GET['id']);
$sql = "SELECT * FROM topic WHERE id = {$filtered_id}";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
$article['title'] = $row['title'];
$article['description'] = $row['description'];
}
?>
여기 전부 다 앞에서 설명한 내용입니다. index.php 부분을 봐주세요.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WEB</title>
</head>
<body>
<h1><a href="index.php">WEB</a></h1>
<ol>
<?=$list;//echo $list와 같은 효과를 낸다.?>
</ol>
<form action="process_update.php" method="post">
<input type="hidden" name="id" value="<?=$_GET['id']?>">
<p><input type = "text" name = "title" placeholder="title" value="<?=$article['title']?>"</p>
<p><textarea name="description" placeholder="description"><?=$article['description']?></textarea></p>
<p><input type = "submit"></p>
</form>
</body>
</html>
이 부분에서는... 마찬가지로 php 기초 강의에서 배운 내용이네요.
이렇게 되면 설명할게 없어지니까 몇개만 설명하겠습니다.
<?php 내용 ?>이 보통 php를 사용하기 위한 환경입니다.
하지만 명령어가 한줄이라면 <?= 내용?>를 통해 짧게 끊을 수 있습니다. 이 한줄을 표현할 때에는 ;(세미콜론) 또한 사용하지 않아도 됩니다.
또 html 부분에서
<input type="hidden" name="id" value="<?=$_GET['id']?>">
이런 부분이 있는데 여기에서 <?=$_GET['id']?> get 방식으로 받은 데이터도 원래 보안처리는 해 주셔야 합니다.
index.php에서만 많이 보안처리 해놓은거라서 다른 부분에는 되어있는 부분도 있고 안되어 있는 부분도 있습니다.
process_update.php
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
settype($_POST['id'], 'integer');
$filtered = array(
'id'=>mysqli_real_escape_string($conn, $_POST['id']),
'title'=>mysqli_real_escape_string($conn, $_POST['title']),
'description'=>mysqli_real_escape_string($conn, $_POST['description'])
);
$sql = "
UPDATE topic
SET
title = '{$filtered['title']}',
description = '{$filtered['description']}'
WHERE
id = {$filtered['id']}
";
$result = mysqli_query($conn, $sql);
if($result === false){
echo "데이터가 올바르지 않습니다. 관리자에게 문의해주세요.";
}
else {
echo '저장에 성공했습니다. <a href="index.php">돌아가기</a>';
}
?>
update.php에서 submit 버튼을 눌렀을 때 이동하는 페이지입니다.
settype($_POST['id'], 'integer');
이런 부분이 있는데 이것은 post로 보내져 온 id 값은 integer, 정수형으로 인식하는 함수입니다.
id 값은 항상 정수만 들어오기 때문에 사용해 줍니다.
$filtered = array(
'id'=>mysqli_real_escape_string($conn, $_POST['id']),
'title'=>mysqli_real_escape_string($conn, $_POST['title']),
'description'=>mysqli_real_escape_string($conn, $_POST['description'])
);
이 부분은 넘어가도록 하겠습니다.
$sql = "
UPDATE topic
SET
title = '{$filtered['title']}',
description = '{$filtered['description']}'
WHERE
id = {$filtered['id']}
";
$result = mysqli_query($conn, $sql);
if($result === false){
echo "데이터가 올바르지 않습니다. 관리자에게 문의해주세요.";
}
else {
echo '저장에 성공했습니다. <a href="index.php">돌아가기</a>';
}
process_update.php 와 같은 동작원리입니다.
$sql에 저장된 mysql 구문이 동작되며 받아온 데이터를 통해 레이블을 바꾸고,
저장이 올바른지의 여부를 고려한 다음, 저장에 성공했다면 돌아가기 버튼을 통해 index.php로 이동할 수 있습니다.
process_delete.php
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
settype($_POST['id'], 'integer');
$filtered = array(
'id'=>mysqli_real_escape_string($conn, $_POST['id'])
);
$sql = "
DELETE
FROM topic
WHERE id = {$filtered['id']}
";
$result = mysqli_query($conn, $sql);
if($result === false){
echo "데이터가 올바르지 않습니다. 관리자에게 문의해주세요.";
}
else {
echo '삭제에 성공했습니다. <a href="index.php">돌아가기</a>';
}
?>
이것은 앞서 설명했던 process_create.php나 process_update.php보다 쉽습니다.
받아온 id 값을 통해 mysql의 레이블을 삭제하고 다시 되돌아가게 됩니다.
index.php의 delete 버튼을 통해서 실행되는 페이지입니다.
author.php
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WEB</title>
</head>
<body>
<h1><a href="index.php">WEB</a></h1>
<p><a href="index.php">topic</a></p>
<table border = "1">
<tr>
<td>id</td><td>name</td><td>profile</td><td></td><td></td>
<?php
$sql = "SELECT * FROM author";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_array($result)){
$filtered = array(
'id'=>htmlspecialchars($row['id']),
'name'=>htmlspecialchars($row['name']),
'profile'=>htmlspecialchars($row['profile'])
)
?>
<tr>
<td><?=$filtered['id']?></td>
<td><?=$filtered['name']?></td>
<td><?=$filtered['profile']?></td>
<td><a href="author.php?id=<?=$filtered['id']?>">update</a></td>
<td>
<form action="process_delete_author.php" method="post"
onsubmit="if(!confirm('sure?')){return false;}">
<input type="hidden" name="id" value="<?=$filtered['id']?>">
<input type="submit" value="delete">
</form>
</td>
</tr>
<?php
} ?>
</tr>
</table>
<?php
$escaped = array(
'name'=>'',
'profile'=>''
);
$label_submit = 'Create_author';
$form_action = 'process_create_author.php';
$form_id = '';
if (isset($_GET['id'])){
$filtered_id = mysqli_real_escape_string($conn, $_GET['id']);
settype($filtered_id, 'integer');
$sql = "SELECT * FROM author WHERE id = {$filtered_id}";
mysqli_query($conn, $sql);
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
$escaped['name'] = htmlspecialchars($row['name']);
$escaped['profile'] = htmlspecialchars($row['profile']);
$label_submit = 'Update_author';
$form_action = 'process_update_author.php';
$form_id = '<input type="hidden" name = "id" value = "'.$_GET['id'].'">';
}
?>
<form action="<?=$form_action?>" method="post">
<?=$form_id?>
<p><input type = "text" name = "name" placeholder="name" value="<?=$escaped['name']?>"></p>
<p><textarea name = "profile" placeholder="profile"><?=$escaped['profile']?></textarea></p>
<p><input type = "submit" value=<?=$label_submit?>></p>
</form>
</body>
</html>
이제 살짝 복잡한 부분이 나왔습니다. 바로 author 페이지입니다.
이 페이지에서는 데이터를 표 형식으로 정리하기 때문에 살짝 더럽게 보일 수 있습니다.
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WEB</title>
</head>
<body>
<h1><a href="index.php">WEB</a></h1>
<p><a href="index.php">topic</a></p>
그냥 넘어갑니다.
<table border = "1">
<tr>
<td>id</td><td>name</td><td>profile</td><td></td><td></td>
<?php
$sql = "SELECT * FROM author";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_array($result)){
$filtered = array(
'id'=>htmlspecialchars($row['id']),
'name'=>htmlspecialchars($row['name']),
'profile'=>htmlspecialchars($row['profile'])
)
?>
<tr>
<td><?=$filtered['id']?></td>
<td><?=$filtered['name']?></td>
<td><?=$filtered['profile']?></td>
<td><a href="author.php?id=<?=$filtered['id']?>">update</a></td>
<td>
<form action="process_delete_author.php" method="post" onsubmit="if(!confirm('sure?')){return false;}">
<input type="hidden" name="id" value="<?=$filtered['id']?>">
<input type="submit" value="delete">
</form>
</td>
</tr>
<?php
} ?>
</tr>
</table>
이 테이블이 좀 길기 때문에 복잡하게 보이는 것 같습니다.
<td>id</td><td>name</td><td>profile</td><td></td><td></td>
이 부분은 표의 맨 윗부분입니다. name, profile을 밑에 이어서 데이터를 출력할겁니다.
<?php
$sql = "SELECT * FROM author";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_array($result)){
$filtered = array(
'id'=>htmlspecialchars($row['id']),
'name'=>htmlspecialchars($row['name']),
'profile'=>htmlspecialchars($row['profile'])
)
?>
<tr>
<td><?=$filtered['id']?></td>
<td><?=$filtered['name']?></td>
<td><?=$filtered['profile']?></td>
<td><a href="author.php?id=<?=$filtered['id']?>">update</a></td>
<td>
<form action="process_delete_author.php" method="post" onsubmit="if(!confirm('sure?')){return false;}">
<input type="hidden" name="id" value="<?=$filtered['id']?>">
<input type="submit" value="delete">
</form>
</td>
</tr>
<?php
} ?>
여기서 while문이 등장하면서 모든 데이터를 채우게 됩니다.
$filtered에 배열을 넣어주고, td를 통해 배열을 각각 입력해주고, update라는 링크또한 넣어주게 됩니다.
또한 delete 버튼이 있는데요
<form action="process_delete_author.php" method="post" onsubmit="if(!confirm('sure?')){return false;}">
<input type="hidden" name="id" value="<?=$filtered['id']?>">
<input type="submit" value="delete">
</form>
이게 delete 버튼입니다. onsubmit을 처음보실텐데요. 버튼을 눌렀을 때 먼저 실행하는 문구입니다.
강의에서는 js를 사용하여
if(!confirm('sure?')){return false;}
이렇게 작성해줬습니다. 이것은 sure?이라는 문구를 보여주고 확인, 취소가 나타나는 경고문을 띄워서 사용자의 의사를 묻는 명령어입니다.
$label_submit = 'Create_author';
$form_action = 'process_create_author.php';
$form_id = '';
if (isset($_GET['id'])){
$filtered_id = mysqli_real_escape_string($conn, $_GET['id']);
settype($filtered_id, 'integer');
$sql = "SELECT * FROM author WHERE id = {$filtered_id}";
mysqli_query($conn, $sql);
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
$escaped['name'] = htmlspecialchars($row['name']);
$escaped['profile'] = htmlspecialchars($row['profile']);
$label_submit = 'Update_author';
$form_action = 'process_update_author.php';
$form_id = '<input type="hidden" name = "id" value = "'.$_GET['id'].'">';
}
이 부분은 또 변수를 마구마구 정의해주는 부분입니다.
$label_submit 변수는 author 정보를 create 해줄때와 update 해줄때 버튼의 value를 바꿀 때 사용합니다.
$form_action 변수는 이동할 페이지를 정의해줬네요. 이것도 create와 update 할 때 지정해줄 수 있습니다.
$form_id는 나중에 사용하기 위해 일단 정의해두고요
이제 if문으로 들어왔습니다.
id값이 지정되어 있을 때
받은 id 값을 보안처리해서 $filtered_id에 저장하고 정수형으로 인식시킵니다.
$row 변수에 mysql구문으로 받아온 데이터를 배열 형태로 저장하고
이를 또 보안처리해서 $escaped 변수에 배열 형식으로 저장합니다.
또한 update 시에 id값을 불러오는 것이기 때문에
$label_submit변수에 update_author로 바꿔주고
$form_action을 process_update_author.php로 바꿔줍니다.
$form_id 변수는 id값을 다른 php 파일로 post 방식으로 보내기 위해 사용할 겁니다.
<form action="<?=$form_action?>" method="post">
<?=$form_id?>
<p><input type = "text" name = "name" placeholder="name" value="<?=$escaped['name']?>"></p>
<p><textarea name = "profile" placeholder="profile"><?=$escaped['profile']?></textarea></p>
<p><input type = "submit" value=<?=$label_submit?>></p>
</form>
이제 form을 통해 create와 update 상황에 맞게 데이터를 보내주는 겁니다
이것은 이해할 수 있을겁니다.
process_create_author.php
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
$filtered = array(
'name'=>mysqli_real_escape_string($conn, $_POST['name']),
'profile'=>mysqli_real_escape_string($conn, $_POST['profile']),
);
$sql = "
INSERT INTO author
(name, profile)
VALUES(
'{$filtered['name']}',
'{$filtered['profile']}'
)
";
$result = mysqli_query($conn, $sql);
if($result === false){
echo "데이터가 올바르지 않습니다. 관리자에게 문의해주세요.";
}
else {
header('Location: author.php');
}
?>
이건 process_create.php와 비슷합니다.
마지막에 header를 통해 잘 저장되었을 경우 author.php로 이동시키는군요.
process_update_author.php
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
settype($_POST['id'], 'integer');
$filtered = array(
'id'=>mysqli_real_escape_string($conn, $_POST['id']),
'name'=>mysqli_real_escape_string($conn, $_POST['name']),//sql 인젝션과 같은 공격을 막기 위한 mysqli_real_escape_string
'profile'=>mysqli_real_escape_string($conn, $_POST['profile'])
);
$sql = "
UPDATE author
SET
name = '{$filtered['name']}',
profile = '{$filtered['profile']}'
WHERE
id = {$filtered['id']}
";
$result = mysqli_query($conn, $sql);
if($result === false){
echo "데이터가 올바르지 않습니다. 관리자에게 문의해주세요.";
}
else {
header('Location: author.php?id'.$filtered['id']);
}
?>
이것도 마찬가지로 process_update.php와 거의 동일합니다.
process_delete_author.php
<?php
$conn = mysqli_connect("localhost", "root", "111111", "testdb");
settype($_POST['id'], 'integer');
$filtered = array(
'id'=>mysqli_real_escape_string($conn, $_POST['id'])
);
$sql = "
DELETE
FROM topic
WHERE author_id = {$filtered['id']}
";
$sql = "
DELETE
FROM author
WHERE id = {$filtered['id']}
";
$result = mysqli_query($conn, $sql);
if($result === false){
echo "데이터가 올바르지 않습니다. 관리자에게 문의해주세요.";
}
else {
header('Location: author.php');
}
?>
역시... 마찬가지로 process_delete.php와 거의 비슷합니다.
여기까지 제가 배운 내용을 모두 정리했습니다.
파일도 올렸으니 모두 이해할 수 있을 것이라 믿습니다.
추가로 여기에서 모듈화를 통해 중복되는 부분을 따로 저장해놓으면 더 편하게 볼 수도 있을 것 같고 그렇네요.
근데 오히려 그렇게 바꾸면 보기 힘들 수도 있을거란 생각도 드네요..ㅎ
암튼 여기까지! 강의 내용을 모두 정리해봤습니다.
'Web-기초' 카테고리의 다른 글
회원가입, 로그인, 로그아웃 페이지 만들기 (1) | 2020.04.11 |
---|---|
PHP + MySQL 기초(1) (0) | 2020.04.11 |