웹 애플리케이션 만들기

라이브러리 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. 완료!
  2. 왓떠뻐꺼
    완료했습니다. 감사합니다.
  3. jayxwoo
    잘 들었습니다^^ 감사합니다.

    중복의 제거
    require 사용해서 파일을 분리. (중복 코드 제거)
    분리된 파일 안에서 함수를 정의, 그 함수를 호출하는 것을 통해서 특정코드를 여러번 여러군데에서 사용가능.
    데이터베이스에 접속하는 정보를 별도의 config라는 파일로 분리.
  4. 다시시작
    완료
  5. 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
              완료
            • Jaehyun Kim
              중복제거와 재사용을 위한 라이브러리만들기 잘 배웠습니다!^^
            • Geonho Lee
              잘 수강했습니다^^
            • 이인규
              라이브러리 ~ 사실상 모든걸 끌고올 수 도 있겠네요 !
            • 김영준
              강의 감사합니다~
              lib.php에서 DB 정보들을 왜 다시 config.php에서 변수처리하는지 이해가 잘 안가네요 ^^;;;
            • 중복의제거 끝장판 라이브러리?
            • 김익수
              잘 들었습니다. 쫒아오느라 힘들었지만 그냥 꾸준히 보고 있습니다
            버전 관리
            egoing
            현재 버전
            선택 버전
            graphittie 자세히 보기