생활코딩

Coding Everybody

코스 전체목록

닫기

라이브러리 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. 슝태
    20180119
  2. PassionOfStudy
    18-01-09 11일차 - 2번째 강의

    수강완료!


    -----------------------------------------------------------------------------------------------
    @ 중복의 제거
    - 유지보수의 편의성
    - 코드의 감소
    - 가독성 향상

    중복의 제거 -> 코드의 재사용성 -> 생산성의 향상
    Library : 중복해서 사용되는 로직을 재사용 할 수 있도록 부품화(모듈화) 시킨 것!
    -----------------------------------------------------------------------------------------------
  3. 이도현
    윈도우에서 index.php가 루트 디렉토리에 안계시는 분들은 파일이 존재하지 않는다고 나올텐데
    db.php 속성에서 위치를 복사한후 /db.php를 추가하면 될듯해요.
    저 같은 경우는 C:\Bitnami\wampstack-7.1.12-0\apache2\htdocs\lib 에 db.php에 존재하기 때문에
    require("C:\Bitnami\wampstack-7.1.12-0\apache2\htdocs\lib/db.php")로 했습니다.
    리눅스에서만 작업하다가 윈도우에서 작업하는 것은 처음이라 이렇게 해도 되나? 했는데 되네요.
    굳이 ../ 를 쓰는 방법은 사람마다 디렉토리 구조가 다를 수 있어서 제 생각엔 이게 나아보입니다..
    혹시 저와 같은 사람이 있을까봐 올립니다. 감사합니다.
  4. egoing
    동물사랑님 안녕하세요. 부족한 수업입니다면 이곳은 여러 사람들이 공부를 하는 곳이기 때문에 말씀을 순화해주셨으면 좋겠습니다. 더 좋은 수업이 될 수 있게 노력하고 있습니다. 계속 수업을 만들면서 개선해나갈 수 있도록 도와주세요. 부탁드립니다. 주말 잘 보내시고요.
    대화보기
    • 이근환
      2017-12-15 수강 17일차

      수강완료하였습니다.
    • 이근환
      2017-12-12 수강 15일차

      수강완료하였습니다!

      라이브러리의 장점을 모두 느낄수 있던 수업이였습니다!!:)
    • 박인호
      11-28
      수강완료.
      중복을 제거하는 것이 역시 중요하군요.
    • 서성진
      잘 봤습니다.
    • 유상원
      2017-11-11 완료!
    • 응아니야맨
      망했다
    • 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을 모조리 다른 이름으로 바꾸어도 똑같이 작동합니다)

                알고나면 쉽고 당연한 이야기이니까, 잘 생각해보시면 될 겁니다.
                대화보기
                버전 관리
                egoing
                현재 버전
                선택 버전
                graphittie 자세히 보기