2022. 8. 6. 15:53ㆍ22-여름방학/웹 해킹(WEB HACKING)&웹 기초
생활코딩 PHP&MySQL 11강~21강
https://www.youtube.com/playlist?list=PLuHgQVnccGMA5836CvWfieEQy0T0ov6Jh
WEB3 - PHP & MySQL
www.youtube.com
11.1.활용 - 글쓰기1
어떤 정보 시스템 간에 입력과 저장과 출력으로 이루어져 있다.
입력에는 생성, 수정, 삭제가 있다. (CREATE, UPDATE, DELETE)
데이터베이스에서 생성과 관련된 sql문은 insert이다.
-> 이제 수정, 삭제만 배우면 됨.
<?php
$conn = mysqli_connect(
'localhost',
'root',
'111111',
'opentutorials');
$sql = "SELECT * FROM topic";
$result = mysqli_query($conn, $sql);
$list = '';
while($row = mysqli_fetch_array($result)) {
$escaped_title = htmlspecialchars($row['title']);
$list = $list."<li><a href=\"index.php?id={$row['id']}\">{$escaped_title}</a></li>";
}
$article = array(
'title'=>'Welcome',
'description'=>'Hello, web'
);
$update_link = '';
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'] = htmlspecialchars($row['title']);
$article['description'] = htmlspecialchars($row['description']);
$update_link = '<a href="update.php?id='.$_GET['id'].'">update</a>';
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>WEB</title>
</head>
<body>
<h1><a href="index.php">WEB</a></h1>
<ol>
<?=$list?>
</ol>
<a href="create.php">create</a>
<?=$update_link?>
<h2><?=$article['title']?></h2>
<?=$article['description']?>
</body>
</html>
id값을 만들었는데 오류가 떠서 소스페이지를 보면 id값이 없는데 가져오려고 한다는 오류가 뜬다.
update link라는 변수를 만들어서 넣어주고 리로드 해보면 에러가 발생하지 않고, 링크는 생성이 안되는 것을 확인할 수 있다.
업데이트하기 위해서는 현재 선택된 업데이트 하려고 하는 글에 대한 본문과 제목이 폼에 입력이 되어 있어야 한다. 또 업데이트는 글을 가져오는 게 필요하다.
-> index.php를 복제해서 create.php를 만들어야 한다.
크리에이트는 글을 생성하는 것이기 때문에 어떤 특정한 글에 대한 정보는 필요 없다.
article 배열에 title과 description이 들어있으니까
<h2><?=$article['title']?></h2>
<?=$article['description']?>
이런 식으로 처리를 하고 리로드를 하면 된다.
11.2. 활용 - 글쓰기 2
이전 시간에 사용자가 전송한 데이터를 업데이트하는 코드를 만들었는데 그렇게 완성된 페이지에서 submit 버튼을 눌렀을 때 process_create.php로 가면 안 된다.
업데이트는 누구를 업데이트할 것인가에 대한 정보가 필요하다. 그래서 hidden을 사용한다.
process_create.php를 복제해서 process_update.php파일을 만들어준다.
<?php
$conn = mysqli_connect(
'localhost',
'root',
'111111',
'opentutorials');
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 '저장하는 과정에서 문제가 생겼습니다. 관리자에게 문의해주세요';
error_log(mysqli_error($conn));
} else {
echo '성공했습니다. <a href="index.php">돌아가기</a>';
}
?>
12. 활용 - 글삭제
delete(삭제)를 구현하기 위해서는 일단은 삭제 버튼이 필요하다.
그리고 이 삭제 버튼은 특정한 글이 선택된 상태에서 업데이트처럼 표시되도록 해야 한다.
크리에이트나 업데이트를 이용해서 만들거나 수정하는 것은 정보를 입력한 다음에 submit을 하고 데이터를 전송할 때 post 형식으로 전송한다. 포스트 방식으로 데이터를 서버로 url을 통하지 않고 은밀하게 전송한다.
그런데 delete는 링크가 삭제될 수 있기 때문에 위험해서 링크로 처리하면 안 되고 폼으로 처리해야 한다.
따라서 아래와 같이 수정해야 한다.
$delete_link = '
<form action="process_delete.php" method="post">
<input type="hidden" name="id" value="'.$_GET['id'].'">
<input type="submit" value="delete">
</form>
';
delete를 하면 delete한 id를 확인하기 위해 id를 출력하도록 process_delete.php를 생성한다.
<?php
$conn = mysqli_connect(
'localhost',
'root',
'111111',
'opentutorials');
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 '저장하는 과정에서 문제가 생겼습니다. 관리자에게 문의해주세요';
error_log(mysqli_error($conn));
} else {
echo '삭제에 성공했습니다. <a href="index.php">돌아가기</a>';
}
?>
13. 관계형데이터베이스의 도입
데이터베이스는 크리에이트, 리드, 딜리트, 업데이트의 4 가지의 데이터와 관련된 작업을 갖고 있는 것을 의미한다.
mysql은 관계형 데이터베이스이다.
jion을 사용 하려면 데이터서베가 알아들을 수 있게 author_id와 author 테이블의 id값을 알려주어야 결합이 된다.
글 목록을 클릭하면 저자에 대한 정보가 출력되도록 했는데 이건 join을 이용해서 author테이블과 topic테이블을 결합했기 때문이다.
-> 저자에 대한 정보를 관리할 수 있는 페이지를 만들 수 있다.
14. 많아지는 테이블
저자가 많아지면 많아질수록 중복이 발생하기 때문에 author라는 별도의 테이블을 만들 것이다.
테이블을 만들기 위해 create table 명령어를 사용한다.
desc author(테이블명) 명령어를 통해 테이블이 잘 만들어졌는지 확인한다.
기존 테이블의 구조를 바꾸기 위해서 'alter table 테이블명' 명령어를 사용한다.
select를 이용해서 테이블을 합성해서 데이터의 구조를 짠다.
15. 테이블간의 연결 - 읽기
author테이블과 topic테이블을 이전 영상에서 합성했다.
이 강의에서는 애플리케이션 차원의 변화를 만들기 위해 각각의 아티클 밑에 author테이블의 이름을 적어줄 것이다.
그러기 위해서 author_id값 author의 id컬럼값을 사용한다.
author가 없을 때는출력이 안 되고 author가 있는 특정 topic이 선택되었을 때는 author값이 출력되도록 코드를 수정한다.
<?php
$conn = mysqli_connect(
'localhost',
'root',
'111111',
'opentutorials');
$sql = "SELECT * FROM topic";
$result = mysqli_query($conn, $sql);
$list = '';
while($row = mysqli_fetch_array($result)) {
$escaped_title = htmlspecialchars($row['title']);
$list = $list."<li><a href=\"index.php?id={$row['id']}\">{$escaped_title}</a></li>";
}
$article = array(
'title'=>'Welcome',
'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 WHERE id={$filtered_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>
';
$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>
<ol>
<?=$list?>
</ol>
<a href="create.php">create</a>
<?=$update_link?>
<?=$delete_link?>
<h2><?=$article['title']?></h2>
<?=$article['description']?>
<?=$author?>
</body>
</html>
16. 테이블간의 연결 - 생성
글을 추가할 때 이 추가된 글이 누구에 의해 작성된 글인지를 표현하는 방법을 배우기
우선 사용자가 이 글이 어떤 저자에 의해 작성된 글인지를 선택할 수 있도록 하기 위해서 새로운 sql문을 삽입한다.
$select_form .= '</select>'; 명령어에서 '.='은 셀렉트 폼의 기존의 값에 '</select>'값을 추가한 값을 셀렉트 폼으로 하라는 의미이다.
행마다 옵션이라는 태그를 추가하기 위해서 $select_form .= '<option value="'.$row['id'].'">'.$row['name'].'</option>'명령어를 사용한다.
insert문을 이용해서 author_id값이 추가되도록 코드를 수정한다.
select문을 이용해서 사용자의 id값을 서버로 전송해서 두 개의 테이블을 서로 연관시킬 수 있다.
<?php
$conn = mysqli_connect(
'localhost',
'root',
'111111',
'opentutorials');
$filtered = array(
'title'=>mysqli_real_escape_string($conn, $_POST['title']),
'description'=>mysqli_real_escape_string($conn, $_POST['description'])
'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)
(title, description, created, author_id)
VALUES(
'{$filtered['title']}',
'{$filtered['description']}',
NOW()
NOW(),
{$filtered['author_id']}
)
";
$result = mysqli_query($conn, $sql);
if($result === false){
echo '저장하는 과정에서 문제가 생겼습니다. 관리자에게 문의해주세요';
error_log(mysqli_error($conn));
} else {
echo '성공했습니다. <a href="index.php">돌아가기</a>';
}
?>
17. 새로운 테이블 - 읽기
테이블과 테이블 사이에는 테이블의 식별자를 매개로 연결해준다.
글을 읽어올 때 join을 통해서 author_id와 author테이블의 id 컬럼을 관계를 맺어서 마치 하나의 테이블이 존재하는 것처럼 만들 수 있다. -> 관계형 데이터베이스의 핵심
저자를 추가, 수정, 삭제하기 위해서 저자의 목록을 표현해주는 페이지를 우선 만들어야 한다.
index.php에 <a></a>태그를 이용해서 author.php링크를 건다.
index.php를 복제해서 author.php페이지를 만든다.
저자목록을 표로 표현하기 위해서는 표를 html로 표현할 수 있어야 한다.
<table>태그 안에 <tr>태그를 사용하면 tr태그 안에 있는 태그들은 같은 행이라는 의미이다.
tr태그 안에 <td>태그들을 사용하면 td 태그들은 하나의 컬럼을 의미한다.
tr태그는 같은 행을 그룹핑해주는 태그이다.
<table>안에 border="1"를 적으면 표가 생성되어서 목록들이 출력된다. (디자인이 고전적이라 나중에 css를 통해서 바꿀 수 있다)
<?php
$conn = mysqli_connect(
'localhost',
'root',
'111111',
'opentutorials');
?>
<!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>
<?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>
</tr>
<?php
}
?>
</tr>
</table>
</body>
</html>
18. 새로운 테이블 - 생성
테이블 밑에 <form>태그를 만들고 폼 태그 안에 action="process_create_author.php" method="post"를 넣는다.
process_create.php를 복제해서 process_create_author.php를 만든다.
받는 정보인 name과 profile을 넣고, insert문을 작성한다.
리로드를 하고 폼에 작성하고 create author를 한 후에 author를 클릭하면 테이블에 새로 만든 목록이 추가된 것을 확인할 수 있다.
header('Location: author.php'); 코드가 실행이 되면 웹서버가 웹브라우저에게 괄호 안의 php 정보를 보낸다. 그러면 사용자를 php 파일로 튕겨버리는데 이걸 리다이렉션이라고 한다.
<?php
$conn = mysqli_connect(
'localhost',
'root',
'111111',
'opentutorials');
$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 '저장하는 과정에서 문제가 생겼습니다. 관리자에게 문의해주세요';
error_log(mysqli_error($conn));
} else {
header('Location: author.php');
}
?>
19. 새로운 테이블 - 수정
테이블에 오른쪽에 수정, 삭제 버튼을 추가하기 위해 <td>태그에 update를 추가한다.
수정 페이지일 때 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}";
$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 = 'Create author'; 명령어를 사용한다.
20. 새로운 테이블 - 삭제
삭제를 하기 위해 delete라는 컬럼을 추가한다.
process_delete.php파일을 복제해서 process_delete_author.php파일을 만든다.
delete를 눌러도 바로 삭제되지 않고 창을 띄워서 cancle을 누르면 취소되고 ok를 누를 때만 창이 삭제되도록 코드르르 수정한다.
사용자가 작성한 글을 삭제하기 위해 delete에 where를 author_id로 from을 topic으로 변경한다.
리로드를 하고 author에서 삭제를 한 후에 topic을 가면 topic에서 글도 삭제가 된 것을 볼 수 있다.
<?php
$conn = mysqli_connect(
'localhost',
'root',
'111111',
'opentutorials');
settype($_POST['id'], 'integer');
$filtered = array(
'id'=>mysqli_real_escape_string($conn, $_POST['id']),
'name'=>mysqli_real_escape_string($conn, $_POST['name']),
'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 '저장하는 과정에서 문제가 생겼습니다. 관리자에게 문의해주세요';
error_log(mysqli_error($conn));
} else {
header('Location: author.php?id='.$filtered['id']);
}
?>
21. 수업을 마치며
검색 기능을 구현하는 방법
1. <form method="get" action="search.php">
: 폼태그에 메소드를 get으로 지정해서 action으로 지정한 php 안에서 select의 where문을 사용하기
2. index를 걸어서 찾기
mysqli : php에서 제공하는 api임. mysql에 특화된 api이다.
PDO(Php Data Object)를 고려하면 동일한 코드로 다양한 데이터베이스를 이용할 수 있다.
'22-여름방학 > 웹 해킹(WEB HACKING)&웹 기초' 카테고리의 다른 글
웹해킹_6주차 정리 (0) | 2022.08.14 |
---|---|
웹해킹_5주차 정리 (0) | 2022.08.07 |
웹해킹_4주차 정리 (0) | 2022.07.31 |
웹기초_4주차 정리 (0) | 2022.07.28 |
웹해킹_3주차 정리 (0) | 2022.07.24 |