웹 애플리케이션 만들기

라이브러리 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. Bongha Hwang
    제 생각으로는 session_start()는 session영역의 메모리, require()은 request영역의 메모리(서로 다른 메모리)에 있는 변수를 불러오는 방식이 아닐까 싶어요
    대화보기
    • 감사합니다...코드만 봐도 훤해질 날이 올까요??
    • 김종엽
      2016.08.10 완료!
    • 차누
      수강완료
    • Wookiiis
      잘 보았습니다. :)
    • 수강 완료
    • JustStudy
      고맙습니다 2.
    • 몇가지 질문이 있습니다...
      다른 페이지의 변수를 사용하는 방법에 대해서 찾아보니
      session_start(), require()처럼 2가지 방법이 나오던데
      혹시 이 두가지의 차이점이 있나요? 차이점은 도저히 찾아봐도 찾을 수가 없네여..
    • 이재윤
      해결 하셨는지 모르겠네요..
      폴더 경로 문제 인듯 합니다.
      require("config/config.php");
      require("lib/db.php");

      위와 같은 코드를
      require("../config/config.php");
      require("../lib/db.php");

      이렇게 고쳐 보세요.
      .. <-- 이것의 의미는 '프로젝트의 상위 폴더로 간다' 즉, config의 상위 폴더인 htdocs 폴더로 돌아가서
      다시 경로를 검색하는 겁니다.
      htdocs/config/config.php 이런식으로요.

      저도 이제 시작하는 초보라 확신을 드리기는 어렵네요.
      해결되셨으면 합니다.
      대화보기
      • 중년
        config파일을 읽지못하는데 원인이 무엇일까요? 아무리 찾어도 입문자라서 그런지..제 눈에는 아직 안 뜨입니다.

        조언 좀 부탁드립니다.

        Warning: require(config/config.php): failed to open stream: No such file or directory in C:\Bitnami\wampstack-5.6.19-0\apache2\htdocs\php\index.php on line 2

        Fatal error: require(): Failed opening required 'config/config.php' (include_path='.;C:/Bitnami/wampstack-5.6.19-0/php/PEAR;C:/Bitnami/wampstack-5.6.19-0/frameworks/smarty/libs') in C:\Bitnami\wampstack-5.6.19-0\apache2\htdocs\php\index.php on line 2
      • Undefined variable: 함수가 정의되지 않았다는 메시지네요.
        index.php, write.php, process.php 파일에서

        require("lib/db.php");

        혹시 이 부분이 빠진 것은 아닌가요?
        대화보기
        • 도와주세요
          lib/db,php 파일에서 db_init 이 사용 되는데요
          나머지 index,write,pocess 파일에서는 db_init이 사용이 안됩니다
          함수이면 lib 폴더에서 db.php 파일에서는 파란색으로 나오는데
          나머지 폴더 파일에서는 그냥 아무색도 안나오네요
          오타도 계속 확인 하고 심지어 예제 코드를 붙혀넣는데도 안되요......
          왜이런거죠?
          웹브라우저에 이런경고가 뜨는데 뭔소린지......
          Notice: Undefined variable: config in C:\Bitnami\wampstack-5.6.18-0\apache2\htdocs\index.php on line 4

          Notice: Undefined variable: config in C:\Bitnami\wampstack-5.6.18-0\apache2\htdocs\index.php on line 4

          Notice: Undefined variable: config in C:\Bitnami\wampstack-5.6.18-0\apache2\htdocs\index.php on line 4

          Notice: Undefined variable: config in C:\Bitnami\wampstack-5.6.18-0\apache2\htdocs\index.php on line 4

          Warning: mysqli_connect(): (HY000/1045): Access denied for user ''@'localhost' (using password: NO) in C:\Bitnami\wampstack-5.6.18-0\apache2\htdocs\lib\db.php on line 3

          Warning: mysqli_select_db() expects parameter 1 to be mysqli, boolean given in C:\Bitnami\wampstack-5.6.18-0\apache2\htdocs\lib\db.php on line 4

          Warning: mysqli_query() expects parameter 1 to be mysqli, boolean given in C:\Bitnami\wampstack-5.6.18-0\apache2\htdocs\index.php on line 5
        • 이주환
          2016. 04. 15.
          정독했습니다.
          제생각에도 중복은 최대한 줄여주는게 좋은 코딩인거같습니다.
        • JustStudy
          고맙습니다
        • sSll바버미니llSs
          오래전 글이었는데 이렇게 자세하게 알려주셔서 감사합니다.
          대화보기
          • 덧붙이자면 config 는 줄임말이고,
            configure(동사) 또는 configuration(명사)의 줄임말입니다.
            구성 / 환경설정 / 배치 등으로 해석할 수 있습니다.
          • 경로에 대해서 정리드립니다.

            우선 htdocs는 웹서버의 루트입니다.
            루트(root)는 뿌리라는 의미로, 디렉토리 구조에서는 통상적으로 최상위 디렉토리를 일컫습니다.
            왜냐하면 디렉토리 구조는 "루트가 있는 트리(tree) 구조"로 되어있기 때문이죠.

            그리고 루트 경로는 일반적으로 슬래시 하나(/)를 사용합니다.
            그리고 여기서부터 써 나가는 경로를 '절대경로'라고 합니다.
            어디서 바라보든 같은 경로가 된다는 의미지요.
            말씀하신 경로를 절대경로로 표현하려면 /lib/db.php 가 되어야 합니다.
            이 경로는 해당 서버 내의 어느 파일에서 사용하더라도 항상 같은 위치를 가리키게 됩니다.

            * 사실, 더 절대적인 경로를 만들고자 한다면 [서버의 IP주소]/lib/db.php 라고 쓰시면,
            해당 서버 밖에서도 접근할 수 있는 절대경로가 됩니다.
            슬래시(/)로 시작하는 것이 "현재 서버의 루트폴더에서"라는 의미라고 생각하셔도 좋습니다.

            '절대경로'가 있으니 '상대경로'도 있겠지요.
            이것은 바라보는 관점(어느 위치의 파일에서 사용하는지)에 따라 가리키는 곳이 달라지는
            경로입니다.

            예를들어 경로를 "db.php"라고 쓰셧다면 이것은 현재 파일과 같은 폴더에 있는
            db.php를 가리킵니다.
            "../db.php"는 현재 폴더보다 한단계 상위 폴더 안의 db.php라는 파일을 가리킵니다.

            여기서 ".."은 말씀하신대로 상위폴더를 가리킵니다("."은 현재폴더를 가리킵니다).
            여기서 조심하셔야 할 것은,
            상위폴더명을 그대로 쓰면 안된다는겁니다.
            예를들어서 "htdocs/lib/db.php"라고 쓰셨다면 이것은 상대경로이고
            (왜냐하면 슬래시(/)로 시작하지 않았습니다.)
            현재 폴더 안에서 htdocs폴더를 찾아 그 안의 lib 폴더 안의 db.php를 가리키는 경로입니다.
            그런데 현재 폴더(아마도 /html/ 이겠죠)에는 htdocs 폴더가 없을테니
            제대로 동작하지 않는 것입니다.

            절대경로/상대경로 모두 장단점이 있으므로,
            상황에 따라 잘 판단하셔서 사용하시면 됩니다.
            대화보기
            • Kyu Tae Kim
              감사합니다. 그동안 프로그램을 깔때, lib, config 등이 궁굼했었는데 이런 이유가 있었군요. 강의를 보기는 했는데, 제 홈피등을 만들때 과연 제가 해 낼수 있을지 궁굼해지네요.
            • 김트라슈
              감사합니다
            • 땡이아범
              Warning: Cannot modify header information - headers already sent by (output started at C:\APM_Setup\www\js-php\mysql\process.php:3) in C:\APM_Setup\www\js-php\mysql\process.php on line 24
              =============================아래 어디가?? 아이구~~모르겠어요~눈알 빠질라케요~~~ ^^;;
              <?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://127.0.0.1......hp');
              ?>
            • 대박
            • 오빠는다르다
              감사합니다!!
            • dkfkcl5
              갈수록 재미가 더 붙습니다^^ 코드에 적힌 점하나 이해하기 어려웠는데
              어느새 지금은 이만큼까지 수업을 따라올 수 있게 되었네요~
            • 랄랄라456
              감사합니다. 잘보고 있습니다. 설명 정말 잘하세요!!

              혹시 지금 프리젠테이션은 어떤 프로그램으로 하시나요?

              ppt 같기도 하고, 그림이 단순하게 나오지만 굉장히 깔끔해보여서요.

              어떤 프로그램을 사용하시는지 알려주실수 있으신지요. 감사합니다.~~
            • SK Kim
              도장 쾅!
              require 함수의 경로에 문제가 생기면 다다음 수업 "인터넷"의 절대/상대 경로 보시면 도움됨.
            • egoing
              처음부터는 아니고요. 중복을 자꾸 제거하다보면 처음부터 중복을 덜 낼 수 있게 됩니다. 그리고 웹애플리케이션 만들기 수업 보단 더 많이 아셔야 신입으로 역할을 하실 수 있을꺼예요. 지금은 어려워 보여도 조금만 더 해보시면 그리 어려운 것이 아니라는 것을 아시게 될꺼예요~
              대화보기
              • RedJohn
                따라 하면서도 매번 궁금한 점이..
                이런 중복을 제거하는 작업?을 강의해주시는 것처럼 "단계"별로 하게 되는 것인지
                아니면 처음 코드를 작성할 때부터 중복을 예측하고 계산해서 하는 것인지 궁금합니다.

                추가로 신입 웹 개발자로 취업하려면 이 모든 과정을 꿰뚫고 있어야 하는 것인지도 궁금하네요..
              • Paulus Jang
                와 이제는 진짜 따라가기 힘드네요. 에고 머리야.
              • sSll바버미니llSs
                디게 헷갈리네요.. 괜히 폴더를 하나 더 만들어가지고..흑흑
                htdocs 안의 html 이라는 폴더안에 index.php , process.php, write.php 가 있고
                htdocs 안의 lib 이라는 폴더안에 db.php가 있습니다.

                밑에서 언급한 require("../lib/db.php"); 으로 한다는게 아무리 이 ".." <--- 점 두개 자리에 상위 폴더를 집어넣어도 되지않아서..포기상태로 그냥 그대로 require("../lib/db.php"); 이걸 쓰니까 되었어요. 혹시 안되시는분들은 참고하세요~
              • 중복을 제거하면 제거할수록 코드가독성이 떨어져. 정말 필요할때만 사용해야될것같습니다.
              • 김기연
                아무래도 require() 이란 api는 require() 를 쓰려고 하는 문서의 현 위치를 기준으로 localhost 는 제외하고 괄호 안에 경로를 적는 것 같습니다. 리눅스에서 ../ 은 현 위치에서 바로 위의 디렉토리 경로를 의미하는데 php에서도 같은 모양입니다.

                영상에 보시면 index.php, write.php, prcess.php 전부 htdocs 폴더 바로 아래에 저장되어 있기 때문에 세 개의 문서 전부 require("lib/db.php")를 쓴거 같습니다.

                문서의 현 위치를 기준으로 한다는게 무슨 의미인지 예를 들자면

                index.php 파일은 htdocs/ 폴더에 들어있고, process.php 파일은 htdocs/php/ 폴더에 들어있고, write.php 파일은 htdocs/php/test/ 폴더에 들어있고, db.php 파일은 htdocs/php/lib/ 폴더에 들어있다고 합시다.

                index.php 파일의 경우에는 htdocs 폴더에 바로 저장되어 있으니 db.php 파일에 접근하기 위해서는
                require("php/lib/db.php") 라고 작성해야 합니다.

                process.php 파일의 경우에는 htdocs/php/ 폴더에 저장되어 있으므로 db.php 파일에 접근하기 위해서는
                현 위치를 기준으로 require("lib/db.php") 라고 작성합니다. lib 폴더가 php 폴더에 저장되어 있으니깐요.

                write.php 파일의 경우에는 htdocs/php/test/ 폴더에 저장되어 있기 때문에 현 위치를 기준으로 db.php 파일에 접근하기 위해서는 한단계 내려가서 php 폴더로 간 다음에 lib 폴더로 접근해야 합니다.
                따라서 require("../lib/db.php") 라고 작성하셔야 합니다.

                초짜라서 이게 맞는진 모르겠지만 제가 테스트 해본 결과로서는 어느정도 맞는 것 같습니다.

                warning 뜨시는 분들은 참고하셔서 코딩해 보세요. 이해가 되셨으면 좋겠네요...
              • 꾸꾸꿍
                아하

                그렇군요. 전에 배웠던 함수 파트 강좌를 다시 보고
                답해주신 내용을 보니까 이해가 되네요.
                감사합니다 :)
                대화보기
                • egoing
                  접속된 상태를 유지하기 위해서 그렇습니다. $conn 변수에 담긴 데이터가 있어야 뒤에서 처리하는 부분에서 제대로된 접속을 통해서 sql 등을 전송할 수 있거든요.
                  대화보기
                  • 꾸꾸꿍
                    lib/db.php 파일에서

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

                    중에

                    return $conn; 코드는 왜 쓰는 건가요?

                    전 수업에서 얼핏 들은 것 같은데 기억이 잘 안나네요..
                  • 비티민C플러스
                    감사합니다^.^
                  • 유종수
                    이런거 정말 신기합니다.
                  • 준맹
                    진짜 점점 난이도가 어려워지는 것 같습니다.
                    하지만 말씀하신대로 일단 끝까지 넘어가보겠습니다.
                    너무 좋은 강의 감사드립니다.
                  • garimtou@gmail.com
                    죄송합니다 수업에 너무 열중하다보니
                    제 비밀번호는 강의하신 비밀번호랑 다르다는걸 깜빡했었네요...
                    ㅠ.,ㅠ
                    이걸 가지고 지금 얼마나 고생했는지...
                    대화보기
                    • garimtou@gmail.com
                      Warning: mysqli_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES) in C:\Bitnami\wampstack-5.5.28-0\apache2\htdocs\lib\db.php on line 3

                      Warning: mysqli_select_db() expects parameter 1 to be mysqli, boolean given in C:\Bitnami\wampstack-5.5.28-0\apache2\htdocs\lib\db.php on line 4

                      Warning: mysqli_query() expects parameter 1 to be mysqli, boolean given in C:\Bitnami\wampstack-5.5.28-0\apache2\htdocs\index.php on line 5

                      이 오류를 해결 못하겠네요 ㅠ.,ㅠ
                    • egoing
                      라이브러리 부분은 몰라도 전혀 상관없어요~ 걱정 마시고 기분 좋게 다른 공부들 해나가시면 됩니다. ^^

                      그리고 걱정해주셔서 감사합니다! 즐거운 일하는게 보상이죠~
                      대화보기
                      • 쥬슈야
                        제가 유료동영상강좌도 종종 보곤 합니다만, 이고잉님의 강좌는 분명 수준급입니다. 앞으로도 많은 분들이 생활코딩에서 큰 도움을 받을 수 있을 것이라 생각합니다. 궁금한 점이 있는데요. 생활코딩팀원분들이 꾸준히 활동할 수 있도록 하는 최소한의 수익(?)구조는 만들어진 상황인가요? opentutorials 에서는 기부금을 따로 받는 곳이 보이진 않았습니다만... 이미 활동하시는 것 만큼 사회적 관심을 통해 충분한 보답을 받으셨을지는 모르겠지만, 웹 활동을 하시는 개개인의 인식이 아직 거기까지 미치지 못했을거라 생각해서요..

                        그리고 저는 mysql 실습 2~3정도에서 막혔던 기억이 있는데, 라이브러리 2: 직접만들기 부분에도 다소 영향이 있군요;;;
                        웹 서비스 만들기의 난이도가 급격하게 올라가는 느낌도 들어요. 제가 이해를 못하는건지;; 서버부분의 강좌를 보면서 다시 기초부터 차근차근 배워봐야겠습니다.
                      • 코딩!
                        라이브러리라는게 함수와 비슷한 개념인것 같네여..ㅎㅎㅎ
                        항상 강조하시는 중복의 제거!
                      • 허니버터
                        신기한게 많네요!!
                        앞으로 라이브러리 활용 방안에 대해서 많이 공부해야겠습니다.
                        고맙습니다.
                      • grapgrap
                        require("../config/config.php");
                        require("../lib/db.php");

                        어휴 이것때문에 진땀뺏네요 ㅎㅎ
                      • egoing
                        node.js를 한번 알아보세요~
                        대화보기
                        • 우연히 열공
                          안녕하세요. 좋은 강의 잘 듣고 있습니다.
                          DB 관련 작업을 javascript 로는 할수 없는지 문의드려요.
                          제가 사용하는 상용 dash product 이 html 코드 (java script 포함) 를 지원합니다.
                          javascript 를 이용해서 간단한 DB table 를 수행하는 화면을 하나 만든후
                          dash board 에 추가하고 싶습니다.
                          가능할까요?
                        • 정유훈
                          아 넵 답변 감사합니다
                        • egoing
                          예 그렇게 하셔도 됩니다. 더 높은 수준의 중복의 제거를 하시는거죠~
                          대화보기
                          • 정유훈
                            안녕하세요. 라이브러리에서 require("lib/db.php"); 는 필수적이라고 보이지만
                            require("config/config.php"); 는 이것도 중복이라고 생각되는데..

                            db.php 안에 require("config/config.php"); 를 넣고,
                            db_init 함수 내부에서 config 정보를 받아서 자동으로 초기화를 해준 후
                            최종적으로 $conn을 반환해주게 하면, 코드가 더 깔끔해지고 사용도 간편해질 것 같은데

                            이고잉님 의견이 궁금합니다... 항상 좋은 강의 감사합니다 ㅎ
                          • 이준행
                            좋은강의 감사합니다! 잘듣고갑니다!
                          버전 관리
                          egoing
                          현재 버전
                          선택 버전
                          graphittie 자세히 보기