본문 바로가기
코드정리/Php & Mysql

[생활코딩] WEB3 - PHP & MySQL, PHP로 게시판 만들기

by Gi-One 2022. 10. 9.

#Php #Mysql #게시판제작 #게시판만들기

 

안녕하세요.

생활코딩 WEB3 - PHP & MySQL 강의 코드 입니다.

 

페이징/댓글/첨부파일 등록 등은 제외되어 있으며 mysqli로 기초를 배우는 강의였던 것 같습니다.

 

저는 Bitnami를 이용하여 작업 하였고 강의와 동일하게 작업/진행하였습니다.

 

topic 테이블을 생성

CREATE TABLE topic (   
   id int(11) NOT NULL AUTO_INCREMENT,   
   title varchar(45) NOT NULL,   
   description text,   
   created datetime NOT NULL,   
   PRIMARY KEY(id) 
) ENGINE=InnoDB;

 

author 테이블을 생성

CREATE TABLE `author` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`profile` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
 
 

Index.php

<?php
$conn = mysqli_connect(
    'localhost',
    'root',
    'db 비밀번호',
    'opentutorials'
  );
  // db연결

  $sql ="SELECT * FROM topic";
  // topic table에 연결하는 쿼리
  $result = mysqli_query($conn, $sql);
  // 쿼리를 실행하고 결과를 $result에 저장함.
  $list = '';
  while($row = mysqli_fetch_array($result)){
    // mysqli_fetch_array($reslut) : 쿼리를 실행한 결과를 배열로 가져온다. while, for, foreach 등으로 출력할 수 있다.
    $list = $list."<li><a href=\"index.php?id={$row['id']}\">{$row['title']}</a></li>";
  }

  $article = array(
    'title'=>'Welcom',
    'description'=>'Hello Web'
  );

  $update_link = '';
  $delete_link = '';
  $author = '';
  if(isset($_GET['id'])){
    $filtered_id = mysqli_real_escape_string($conn, $_GET['id']);
    // sql 주입문 방어
    // $sql= "SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.id WHERE id={$filtered_id}";
    // 입력 시 id는 author와 topic 모두 있는 컬럼이므로 ambiguous 에러 발생 id -> topic.id로 변경

    $sql= "SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.id WHERE topic.id={$filtered_id}";
    // JOIN을 통한 데이터 접목
   

    $result = mysqli_query($conn, $sql);
    $row = mysqli_fetch_array($result);
   
    // print_r($row);
    // 페이지 소스보기를 하면 보기편함

    $article['title'] = $row['title'];
    $article['description'] = $row['description'];
    $article['name'] = $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>
    <p><a href="author.php">Author</a></p>
    <ol>
      <?php
        echo $list;
      ?>
    </ol>

    <a href="create.php">Create</a>
    <?=$update_link?>
    <?=$delete_link?>
   
    <h2><?=$article['title']?></h2>
    <?=$article['description']?>
    <?=$author?>
  </body>
</html>

 

create.php[글 작성 화면]

<?php
$conn = mysqli_connect(
    'localhost',
    'root',
    'db 비밀번호',
    'opentutorials'
  );

  $sql ="SELECT * FROM topic";
  $result = mysqli_query($conn, $sql);
  $list = '';
  while($row = mysqli_fetch_array($result)){
    $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">';
  while($row = mysqli_fetch_array($result)){
    $select_form .= '<option value="'.$row['id'].'">'.$row['name'].'</option>';
  }
  $select_from .= '</select><br>';
?>

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>WEB</title>
  </head>
  <body>
    <h1><a href="/index.php">WEB</a></h1>
    <ol>
      <?php
        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>
      <p>
        <?=$select_form?>
      </p>
      <p>
        <input type="submit">
      </p>
    </form>
  </body>
</html>
 

process_create.php[글 작성 쿼리]

<?php
$conn = mysqli_connect(
  'localhost',
  'root',
  'DB 비밀번호',
  'opentutorials'
);

 

$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'])
);



// var_dump($_POST);
// var_dump로 POST값이 잘 넘어오는지 체크

 

$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 '저장하는 과정에서 문제가 생겼습니다. 관리자에게 문의해주세요.';
  error_log(mysqli_error($conn));
  // 아파치에 에러로그를 저장
} else {
  echo '글 작성이 완료되었습니다. <a href="index.php">돌아가기</a>';
};




?>

 

Update.php[글 작성 쿼리]

<?php
$conn = mysqli_connect(
    'localhost',
    'root',
    'DB 비밀번호',
    'opentutorials'
  );

  $sql ="SELECT * FROM topic";
  $result = mysqli_query($conn, $sql);
  $list = '';
  while($row = mysqli_fetch_array($result)){
    $list = $list."<li><a href=\"index.php?id={$row['id']}\">{$row['title']}</a></li>";
  }

  $article = array(
    'title'=>'Welcom',
    'description'=>'Hello Web'
  );

  $update = '';
  if(isset($_GET['id'])){
    $filtered_id = mysqli_real_escape_string($conn, $_GET['id']);
    // sql 주입문 방어
    $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'];


    $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>
      <?php
        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>

 

process_update[글 수정 쿼리]

<?php
$conn = mysqli_connect(
  'localhost',
  'root',
  'DB 비밀번호',
  'opentutorials'
);

settype($_POST['id'], 'integer');
// id값을 변수로 전환 (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'])
);


// var_dump($_POST);
// var_dump로 POST값이 잘 넘어오는지 체크

$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>';
};



?>
 

process_delete[글 삭제 쿼리]

<?php
$conn = mysqli_connect(
  'localhost',
  'root',
  'DB 비밀번호',
  'opentutorials'
);

settype($_POST['id'], 'integer');
// id값을 정수로 전환 (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'])
);


// var_dump($_POST);
// var_dump로 POST값이 잘 넘어오는지 체크

$sql="
    DELETE
      FROM topic
      WHERE id = {$filtered['id']}
";

$result = mysqli_query($conn, $sql);

if($result === false){
  echo '삭제하는 과정에서 문제가 생겼습니다. 관리자에게 문의해주세요.';
  error_log(mysqli_error($conn));
  // 아파치에 에러로그를 저장
  // print(mysqli_error($conn));
} else {
  echo '글 삭제가 완료되었습니다. <a href="index.php">돌아가기</a>';
};



?>

 

 

author.php[author 리스트 화면]

<?php
$conn = mysqli_connect(
    'localhost',
    'root',
    'DB 비밀번호',
    '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>
        <td>

        </td>
        <td></td>
      </tr>
      <?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('삭제 하시겠습니까?')){return false;}">
                <input type="hidden" name="id" value="<?=$filtered['id']?>">
                <input type="submit" value="delete">
              </form>
            </td>
          </tr>
          <?php } ?>
    </table>
    <?php
      $esccaped = 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}";
        $result = mysqli_query($conn, $sql);
        $row = mysqli_fetch_array($result);
        $esccaped['name'] = htmlspecialchars($row['name']);
        $esccaped['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="<?=$esccaped['name']?>">
      </p>
      <p>
        <textarea name="profile" placeholder='profile'><?=$esccaped['profile']?></textarea>
      </p>
      <p>
        <input type="submit" value="<?=$label_submit?>">
      </p>
   </form>

  </body>
</html>
 

process_create_author[author  글 생성 쿼리]

<?php
$conn = mysqli_connect(
  'localhost',
  'root',
  'DB 패스워드',
  'opentutorials'
);

$filtered = array(
  'name'=>mysqli_real_escape_string($conn, $_POST['name']),
  'profile'=>mysqli_real_escape_string($conn, $_POST['profile']),
);


// var_dump($_POST);
// var_dump로 POST값이 잘 넘어오는지 체크

$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');
};



?>
 

process_update_author[author  글 수정 쿼리]

<?php
$conn = mysqli_connect(
  'localhost',
  'root',
  'DB 패스워드',
  'opentutorials'
);

 

settype($_POST['id'], 'integer');
// id값을 변수로 전환 (id는 정수일 수 밖에 없으니 필터링을 더 정확하게 하기 위해)

 

$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'])
);



// var_dump($_POST);
// var_dump로 POST값이 잘 넘어오는지 체크

 

$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']);
};




?>

 

process_delete_author[author  글 삭제 쿼리]

<?php
$conn = mysqli_connect(
  'localhost',
  'root',
  'DB 패스워드',
  'opentutorials'
);

settype($_POST['id'], 'integer');
// id값을 변수로 전환 (id는 정수일 수 밖에 없으니 필터링을 더 정확하게 하기 위해)

$filtered = array(
  'id'=>mysqli_real_escape_string($conn, $_POST['id'])
);


// var_dump($_POST);
// var_dump로 POST값이 잘 넘어오는지 체크

$sql="
    DELETE
      FROM author
      WHERE id = {$filtered['id']}
";

$sql2="
    DELETE
      FROM topic
      WHERE author_id = {$filtered['id']}
";

$result = mysqli_query($conn, $sql);
$result = mysqli_query($conn, $sql2);

if($result === false){
  echo '삭제하는 과정에서 문제가 생겼습니다. 관리자에게 문의해주세요.';
  error_log(mysqli_error($conn));
  // 아파치에 에러로그를 저장
  // print(mysqli_error($conn));
} else {
  header('Location: author.php');
};



?>

 

-후기-

강의를 듣기 전 mysql을 공부한게 정말 큰 도움이 되었었고 완벽한 게시판을 만들기 보다 author와 topic 데이터를 접목 시켜서 진행하는 점이 흥미로웠습니다. 두가지의 데이터가 서로 만나 상호작용 하는 점이 재밌었던거 같네요. 하지만, html이나 css처럼 한두번 강의 듣고 다시 만들 수 있을 것 같지는 않습니다. 사소한 오타로 페이지가 나오지 않거나 보안처리 등 외워야 할게 많네요!! 여러번 다시 게시판을 만들어보며 공부할 예정입니다.

 

불필요하게 css를 하지 않아 딱 공부하고 싶은 부분만 공부한 것도 좋은 장점이라 할 수 있겠네요!

 

결과화면은 초라하지만요 ㅎㅎ

 

-출처-

 

https://opentutorials.org/course/3167

 

WEB3 - PHP & MySQL - 생활코딩

수업소개 PHP와 MySQL을 연동해서 웹의 접근성과 데이터베이스의 탁월한 정보관리 기능을 모두 갖춘 현대적인 웹애플리케이션을 구현하는 방법을 알려드리는 수업입니다.  수업대상 MySQL과 PHP의

opentutorials.org

 

댓글