이제 이전 포스팅에서 배웠던 내용을 모두 활용하여 웹 사이트를 만들겁니다.

이 웹 사이트는 당연히 생활코딩에서 진행한 내용이고, 전체 코드를 보여드린 뒤 하나씩 설명하는 방식으로 진행할겁니다. 넵 아마도요.

 

기능은 동영상으로 준비했습니다.

따로 설명하기가 너무 귀찮아서요..ㅎ 안보셔도 좋습니다. 워낙 간단한 기능들이기 때문이죠.

 

 

이 모든 코드는

https://github.com/Nesquitto/PHP_MySQL-Study

 

Nesquitto/PHP_MySQL-Study

PHP_MySQL Study. Contribute to Nesquitto/PHP_MySQL-Study development by creating an account on GitHub.

github.com

이곳에 저장되어 있습니다!

물론 이 포스팅에도 모든 코드가 올라가긴 합니다.

 

 

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

+ Recent posts