웹 애플리케이션 만들기

라이브러리 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. GoldPenguin
    완료했습니다.
  3. Myeongjin Ko
    완료
  4. Baekkyu Han
    라이브러리 1 (직접 만들기)
    중복의 제거 생산성 향상 재사용
    중복 사용 로직을 재사용할 수 있도록 모듈화한것
  5. 박예지
    8/13 완료료료!
  6. Scia
    라이브러리는 수학에서의 방정식 이다.
    라는 느낌이 드네요.
    각각 있던 값(localhost, root, 111111, opentutorials)이 d가 붙은 문자들로 치환되네요.
  7. 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은 데이터베이스를 선택하고 접속하는 코드이다 ^^잘 들었습니다^^
    • momo
      감사합니다!
      또는, 간단하게 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 만 바꾸면, 이를 가져다쓰는 모든 코드가 변경내용을 적용.
      • 박재은
        차근차근 중복을 제거하는 과정을 따라해보니 왜 여러 파일로 코드를 나눠서 하는지 이해가 되네요.
        강의 잘 들었습니다!
      • ggang
        잘 봤습니다!!
      • 김대관
        잘봣씁니다
      • 코딩학습생
        잘 봤습니다.
      • charl
        완료~!
      • 임영선
        강의 잘 들었습니다!
        이번 실습에서는 제가 스필링을 잘못 넣었는지 $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에서 변수처리하는지 이해가 잘 안가네요 ^^;;;
        • 중복의제거 끝장판 라이브러리?
        • 김익수
          잘 들었습니다. 쫒아오느라 힘들었지만 그냥 꾸준히 보고 있습니다
        • 이지훈
          잘 보았습니다.^^
        • 이용국
          허윤//
          function db_init 을 수행했을 때 return $conn; 구문으로 인하여
          앞서 수행된 function의 데이터의 값 "db_init($host, $duser, $dpw, $dname)"
          을 $conn 에 저장해두는것 이라고 생각합니다.

          설명이 도움 될 지 모르겠으나..라이브러리2 영상의 5:45 ~ 7:00 부분을 다시 보시면 될것같습니다.
        • 완료!
        • 허윤
          return $conn을 하는 이유가 뭔가요???
        • Amore Chang
          lib

          중복의 제거 & 재활용

          **require
        • Qjsdur Qkf
          이렇게 직접 답변해주셔서 정말 감사합니다.

          지금까지의 제가 했던 공부방법은 1챕터가 이해가 되면 2챕터로

          2챕터가 이해가 되지않으면 3챕터로 넘어가지 않았던 방식이었던거 같아요

          박찬울님의 말씀대로 다 이해해야 한다는 강박이 많이 커서 더 답답했던것 같습니다.

          저도 오랜 취준기간을 거친 뒤 무엇가를 제 손으로 해야겠다는 생각이 들어 공부를 시작했는데

          나이가 있다보니 조급함이 많이 생겼던거 같아요

          답변 정말 도움이 많이 되었습니다.

          앞으로 하시는 일 다 잘되시기를 빌겠습니다. 감사합니다.
          대화보기
          • Qjsdur Qkf
            감사합니다.

            나중에 걷잡을 수 없이 이해되기 시작하면서 재미가 쏠쏠하게 되는 그 시점까지

            참고 공부해보도록 하겠습니다.

            이렇게 직접 답변주셔서 정말 감사합니다. 폭스킴님
            대화보기
            • 와.. 너무 확어려워지네용 ㅠ
            • Michelle Kim
              히힛! finish line 을 향해서 go go!!!
            버전 관리
            egoing
            현재 버전
            선택 버전
            graphittie 자세히 보기