road23 2022. 8. 6. 15:53

생활코딩 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)를 고려하면 동일한 코드로 다양한 데이터베이스를 이용할 수 있다.