웹 애플리케이션 만들기

라이브러리 1 (직접 만들기)

라이브러리 1 : 개론

라이브러리 2 : 직접 만들기

 

index.php 

<?php
require("config/config.php");
require("lib/db.php");
$conn = db_init($config["host"], $config["duser"], $config["dpw"], $config["dname"]);
$result = mysqli_query($conn, "SELECT * FROM topic");
?>
<!DOCTYPE html>
<html>
<head>
     <meta charset="utf-8">
  <link rel="stylesheet" type="text/css" href="http://localhost/style.css">
</head>
<body id="target">
	<header>
    <img src="https://s3.ap-northeast-2.amazonaws.com/opentutorials-user-file/course/94.png" alt="생활코딩">
		<h1><a href="http://localhost/index.php">JavaScript</a></h1>
  </header>
	<nav>
		<ol>
    <?php
    while( $row = mysqli_fetch_assoc($result)){
      echo '<li><a href="http://localhost/index.php?id='.$row['id'].'">'.htmlspecialchars($row['title']).'</a></li>'."\n";
    }
    ?>
		</ ol>
	</nav>
  <div id="control">
    <input type="button" value="white" onclick="document.getElementById('target').className='white'"/>
    <input type="button" value="black" onclick="document.getElementById('target').className='black'" />
    <a href="http://localhost/write.php">쓰기</a>
  </div>
  <article>
  <?php
  if(empty($_GET['id']) === false ) {
      $sql = "SELECT topic.id,title,name,description FROM topic LEFT JOIN user ON topic.author = user.id WHERE topic.id=".$_GET['id'];
      $result = mysqli_query($conn, $sql);
      $row = mysqli_fetch_assoc($result);
      echo '<h2>'.htmlspecialchars($row['title']).'</h2>';
      echo '<p>'.htmlspecialchars($row['name']).'</p>';
      echo strip_tags($row['description'], '<a><h1><h2><h3><h4><h5><ul><ol><li>');
  }
  ?>
  </article>
</body>
</html>

lib/db.php

<?php
function db_init($host, $duser, $dpw, $dname){
  $conn = mysqli_connect($host, $duser, $dpw);
  mysqli_select_db($conn, $dname);
  return $conn;
}
?>

config/config.php

<?php
$config = array(
  "host"=>"localhost",
  "duser"=>"root",
  "dpw"=>"111111",
  "dname"=>"opentutorials"
);
?>

write.php

<?php
require("config/config.php");
require("lib/db.php");
$conn = db_init($config["host"], $config["duser"], $config["dpw"], $config["dname"]);
$result = mysqli_query($conn, "SELECT * FROM topic");
?>
<!DOCTYPE html>
<html>
<head>
     <meta charset="utf-8">
  <link rel="stylesheet" type="text/css" href="http://localhost/style.css">
</head>
<body id="target">
	<header>
    <img src="https://s3.ap-northeast-2.amazonaws.com/opentutorials-user-file/course/94.png" alt="생활코딩">
		<h1><a href="http://localhost/index.php">JavaScript</a></h1>
  </header>
	<nav>
		<ol>
    <?php
    while( $row = mysqli_fetch_assoc($result)){
      echo '<li><a href="http://localhost/index.php?id='.$row['id'].'">'.$row['title'].'</a></li>'."\n";
    }
    ?>
		</ ol>
	</nav>
  <div id="control">
    <input type="button" value="white" onclick="document.getElementById('target').className='white'"/>
    <input type="button" value="black" onclick="document.getElementById('target').className='black'" />
    <a href="http://localhost/write.php">쓰기</a>
  </div>
  <article>
    <form action="process.php" method="post">
      <p>
        제목 : <input type="text" name="title">
      </p>
      <p>
        작성자 : <input type="text" name="author">
      </p>
      <p>
        본문 : <textarea name="description"></textarea>
      </p>
      <input type="submit" name="name">
    </form>
  </article>
</body>
</html>

process.php

<?php
require("config/config.php");
require("lib/db.php");
$conn = db_init($config["host"], $config["duser"], $config["dpw"], $config["dname"]);

$title = mysqli_real_escape_string($conn, $_POST['title']);
$author = mysqli_real_escape_string($conn, $_POST['author']);
$description = mysqli_real_escape_string($conn, $_POST['description']);

$sql = "SELECT * FROM user WHERE name='".$author."'";
$result  = mysqli_query($conn, $sql);
if($result->num_rows == 0){
  $sql = "INSERT INTO user (name, password) VALUES('".$author."', '111111')";
  mysqli_query($conn, $sql);
  $user_id = mysqli_insert_id($conn);
} else {
  $row = mysqli_fetch_assoc($result);
  $user_id = $row['id'];
}
$sql = "INSERT INTO topic (title,description,author,created) VALUES('".$title."', '".$description."', '".$user_id."', now())";
$result = mysqli_query($conn, $sql);
header('Location: http://localhost/index.php');
?>

소스코드

github

댓글

댓글 본문
작성자
비밀번호
  1. 박인호
    11-28
    수강완료.
    중복을 제거하는 것이 역시 중요하군요.
  2. 서성진
    잘 봤습니다.
  3. 유상원
    2017-11-11 완료!
  4. 응아니야맨
    망했다
  5. Theo Lee
    저도 최상위 디렉토리로 나와야한다는 것은 인지하고 있었는데.

    ../ 이것은 몰랐네요! 감사합니다!!
    대화보기
    • 송성태
      결국 추상화의 문제군요.
      가능한 추상화를 해서 수작업의 필요성을 줄이는 것이 핵심이군요.
      잘 배웠습니다!
    • 완료!
    • 왓떠뻐꺼
      완료했습니다. 감사합니다.
    • jayxwoo
      잘 들었습니다^^ 감사합니다.

      중복의 제거
      require 사용해서 파일을 분리. (중복 코드 제거)
      분리된 파일 안에서 함수를 정의, 그 함수를 호출하는 것을 통해서 특정코드를 여러번 여러군데에서 사용가능.
      데이터베이스에 접속하는 정보를 별도의 config라는 파일로 분리.
    • 다시시작
      완료
    • jayxwoo
      저같은 경우 index.php가 저장된 디렉토리에서 두번 빠져나와야해서 ("../../lib.php")이렇게 해결했습니다. YeonHoon Jeong님 의 덧글 보고 잘 해결했네요. 감사합니다^^
      대화보기
      • SanFrancisco
        라이브러리가 많아지면 연결 관계가 굉장히 헷갈리겠네요. 어쨌든, 이제 점점 마지막이 보이는 것 같습니다. ^^
      • 호로로로로롤
        저도 같은 문제 때문에 고민했는데 감사합니다!!
        대화보기
        • 김태윤
          봤어요
        • svastica
          완료입니다!
        • 가영
          완료!
        • GoldPenguin
          완료했습니다.
        • Myeongjin Ko
          완료
        • Baekkyu Han
          라이브러리 1 (직접 만들기)
          중복의 제거 생산성 향상 재사용
          중복 사용 로직을 재사용할 수 있도록 모듈화한것
        • 박예지
          8/13 완료료료!
        • 라이브러리는 수학에서의 방정식 이다.
          라는 느낌이 드네요.
          각각 있던 값(localhost, root, 111111, opentutorials)이 d가 붙은 문자들로 치환되네요.
        • Hyerin Cho
          혹시 "../lib/db.php" 로 수정해보시겠어요? 저는 이렇게 수정하니까 되더라구요
          대화보기
          • 김경태
            잘봤습니다~
          • 등촌동LPG
            수업을 따라하면서, lib/db.php 라이브러리 적용 후 index.php 페이지로 로딩하면

            HTTP 500 오류가 발생합니다.

            다시 conn 정보로 수정하면 정상 접속됩니다.
            $conn = mysqli_connect('localhost','root','rootroot'); //connection
            mysqli_select_db($conn,'opentutorials'); //use opentutorials

            이렇게 라이브러리 적용이 안되는 경우. 어떻게 해야 하는지 아시는분 조언 부탁드립니다.
          • 인재진
            db_init은 데이터베이스를 선택하고 접속하는 코드이다 ^^잘 들었습니다^^
          • 감사합니다!
            또는, 간단하게 lib/db.php 폴더+파일을 index.php 파일이 위치하는 폴더로 이동시켜주면 됩니다. ^^
            대화보기
            • 완료 ^^
            • 푸른바람9101
              열심히...
            • 지구촌
              쉬운게 하나도 없어요.
            • 김범진
              완료!
            • 한종운
              라이브러리 1 (직접 만들기)

              라이브러리 1 : 개론
              중복된 두줄 또는 수천줄의 코드를 하나의 내장함수화 하여 라이브러리로 사용

              라이브러리 2 : 직접 만들기
              require("lib/db.php");
              $conn = db_init()

              db값에 따라서 db.php는 변경없도록 변수 설정.
              config.php의 작성. host. duser. dpw. dname 지정
              이제 config.php 만 바꾸면, 이를 가져다쓰는 모든 코드가 변경내용을 적용.
            • 박재은
              차근차근 중복을 제거하는 과정을 따라해보니 왜 여러 파일로 코드를 나눠서 하는지 이해가 되네요.
              강의 잘 들었습니다!
            • 잘 봤습니다!!
            • 김대관
              잘봣씁니다
            • 코딩학습생
              잘 봤습니다.
            • 완료~!
            • 임영선
              강의 잘 들었습니다!
              이번 실습에서는 제가 스필링을 잘못 넣었는지 $result값이 NULL이 나와서 조금 힘들었네요;
              결국 왜 NULL이 들어가있었는지는 알 수 없었지만 결국 홈페이지의 에러를 모두 없애고 강의를 완료했습니다!
            • 김대관
              8/12 잘봤습니다
            • YeonHoon Jeong
              수강완료 하였습니다.
              혹시 require () 오류 때문에 어려움이 있는 분들을 위해 작게 끄적여봅니다.
              저같은 경우도 require 에서 php파일을 찾을 수 없다는 오류가 있었습니다.
              require("lib/db.php"); 이리 적었는데 오류가 떠서, a 태그에 href에 넣었던 방식으로
              require("http://localhost/lib/db.php"); 이렇게도 코딩하였는데 오류가 뜨더라구요.
              왜이러지 했는데, 한 10분동안 붙잡은 결과, 생각난것이 방금 적은 것은 말그대로 웹주소였어요.
              require 안에 들어갈 것은 파일이름인데 말이죠. 그래서 저같은 경우는 index.php 파일과 db.php파일 위치의 수준이 다르더군요. egoing님의 경우 index.php파일이 htdocs 의 바로 밑에 있어서 require("lib/db.php");가 되는 것이구요. 저의 경우 index.php파일이 php디렉토리(폴더) 안에 있어서 안됬던 것이었습니다.
              그래서 파일을 찾을때 php 디렉토리에서 한단계 빠져나와야하는데 그때 사용하는것이 .. 입니다.
              ..은 현재 파일이 있는 디렉토리에서 한단계 전으로 빠져나오는것입니다.
              결론적으로, 저같은 경우 require("../lib/db.php"); 이렇게 작성함으로써 문제를 해결하였습니다.
              참고하시길 바랍니다.
            • aimerthis(이성민)
              잘봤어용
            • 김우진
              잘 들었습니당
            • 강동곤
              잘 봤습니다 ㅎ
            • 안성현
              확실히 여러개의 파일로 모듈화(!)를 하니 훨씬 간결하고 보기 좋은 코드가 완성되네요! 하지만 이걸 저 혼자 프로잭트할때 이용하기에는 아직 조금 힘들 것 같아요 하하핳 자주 프로그래밍을 해 보면서 코드를 간결화하는 법을 익혀야겠다는 생각이 들었습니다! 오늘도 좋은 강의 감사합니다!
            • publicum
              아래 답을 다신 분이 있긴 한데, '이유'에 대해 말씀하신 건 아닌것 같아 (저처럼) 나중에라도 궁금하실 분들을 위해 적어둡니다.

              핵심은 db_int()라는 함수를 서버접속, DB선택이라는 명령을 수행하고 그냥 끝나게 하느냐,
              아니면 결과물로서 어떤 값을 출력하게 하느냐의 차이를 이해하시면 되요. (함수 강좌 참고)

              자세히 말씀드리면요,
              db.php에서 정의된 db_init의 함수에서, return $conn 을 빼버리면, index.php과 process.php의 4행,
              $conn = db_init($config["host"],$config["dbuser"],$config["dbpwd"],$config["dbname"]);
              이렇게 해도 $conn에 아무런 값도 담기지를 않습니다. 왜냐면 db_init 함수가 서버 접속명령을 실행하는 것으로 끝나버렸지, 출력값으로 뭘 남겨두질 않았으니까요.

              문제는, 당장 그 다음 줄에 나오는 mysqli_query, 즉 특정 table의 내용을 선택하는 명령부터가 첫번째 인자로 반드시 접속정보를 필요로 한다는 거죠. 다시 말해, db_init()이 접속정보를 출력값으로 남겨주지 않으면, mysqli_query명령을 위해 접속 명령부터 다시 규정해야한다는 이야기입니다. 게다가 query명령은 페이지 여기저기에서 여러번 써야할테고요. 요점은 중복을 없애려고 접속정보를 외부화 한 것인데, 중복이 전혀 제거되지 않았다는 것.

              이런 이유 때문에, 처음부터 db_int()함수에게 두 가지 임무를 준 겁니다.
              1) 서버접속하고 DB선택할 것.
              2) 그냥 끝내지 말고! 그 과정에서 사용한 접속정보 $conn 변수는 또 쓰게 출력값으로 내놓을 것.

              db.php에서 return $conn; 은 새롭게 변수를 정의한 게 아니고,
              접속할 때 정의했던 $conn변수의 '값'을 버리지말고 그대로 출력하라는 명령이에요.
              index.php에서는 이렇게 출력된 값을 $conn이라는 이름의 변수에 다시 담아서 계속 사용하는거고요.
              (이 두 변수의 이름이 같은 건 그냥 우연이어서, db.php안에서 $conn을 모조리 다른 이름으로 바꾸어도 똑같이 작동합니다)

              알고나면 쉽고 당연한 이야기이니까, 잘 생각해보시면 될 겁니다.
              대화보기
              • 기픈
                강의 잘들었습니다. 너무 어렵지만, 결론은 중복제거. 맞나요? 스승님은 훌륭하신데, 제자가 ㅠ.ㅠ
              • 강호준
                이번 내용은 좀 어려워서 이틀동안 복습하며 들었네요 ㅠ 나중에 다 끝나고도 계속 돌려야겠어요
              • 김용원
                수강완료!
              • 정지호
                수강완료
              • Kisoo Ahn
                기술진화의 숨은 뜻, 중복성 제거와 재사용의 절묘한 랑데뷰.
                열성적인 강의 잘 들었습니다.
              • aga159
                완료
              버전 관리
              egoing
              현재 버전
              선택 버전
              graphittie 자세히 보기