웹 애플리케이션 만들기

라이브러리 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. yangjh05
    걱정 말고 힘내세요!!!
    대화보기
    • 정상입니다.
      다른 사람과 비교하지 마시고 '나' 자신과 계속 비교하면서 공부해보세요.
      해당 강의로 이해가 안된다면 뭐가 문제일까 생각해본 후 부족한 점을 채우시거나
      그래도 이해 못하겠다! 싶으시면 중고 서점에 가셔서 완전 기초 책 하나 훑어보시고 이해가는 책을 하나 구매해보세요.
      완전 기초 서적(보통은 C언어를 추천)으로 공부한 후 다시 이 강의를 들으시면 충분히 이해하실 수 있어요.
      (요즘은 애기들을 위한 컬러+그림으로 된 책도 있습니다. 기초 이론을 공부하시기에 매우 좋아요.)
      또한, 인터넷으로 웹 프로그래밍만 검색해봐도 기초부터 알려주는 곳이 정말 많아요!

      세상에 어려운 것은 없습니다. 생소한 것이 많고 내가 모르는게 많아서 어려워 보이는거지
      시간과 노력만 있다면 어려운 것은 없습니다.
      저도 처음엔 많이 힘들었고 헷갈리고 바보같아서 프로젝트하면서 울기도 하고 때려치울까 고민도 많이 했습니다.
      하지만 포기하기엔 시간이 아까워서 노력하다보니 아직까지 개발하며 살고 있네요 ㅋㅋ
      정말 뻔한 답은 '시간이 해결줍니다.'

      저는 배움의 속도가 느리고 호기심이 많아서 관련된 지식을 어느정도 얻어야 이해하는 타입인데,
      주입식 교육과 빠른 공부 속도를 못 좇아가서 정말 큰 자괴감을 느꼈습니다.
      주변 사람들은 다 하는데 왜 나는 못하는가?라는 질문을 정말 많이 던졌고 시간이 지나서야 깨달은 것은
      다른 사람과 나를 비교하지말고, 내 스타일을 찾아 공부하는 연습을 해보는 것 뿐이었습니다.

      다른분들도 완전 처음 배우시는 분들도 계시겠지만, 어느정도 공부를 하고 오신 분이라던지
      개발에 참여했다가 장시간 휴식 후 다시 돌아오신 분들 등등 배움의 환경이나 조건이 다를 겁니다.

      제가 정답일 수 없지만, 제 글을 읽고 현재 고민을 훌훌 털어버리셨으면 좋겠네요.
      확실한 건 Qjsdur Qkf님이 생각하시는 것만큼 자신의 가치가 낮지 않고,
      사람마다 스타일이 다르고 방식이 달라서 이해 못할 수 있다는 걸 당연하게 생각하셨으면 좋겠네요.

      이고잉님께서도 강의 중간중간 계속 말씀해주시지만 포기하지마시고 완주하시고 다른 방법으로도 공부해보세요.
      그런 후 다음에 또 강의를 봐보세요. 그때되면 보는 시야가 달라지고 좀 더 이해할 수 있습니다.
      기운내세요.
      대화보기
      • Qjsdur Qkf
        프로그래밍에 '프'자도 모르는 사람입니다. 이고잉님의 강의로 공부는 하고 있습니다만

        들어도 들어도 무슨 말인지 모르겠고... 밑에 달린 리플을 봐도 다들 무슨 말하지는 모르겠고...

        다들 알아 듣는데 나만 모르는듯한 바보가 된 느낌이네요..

        이런느낌이 정상인건지

        아님 제가 진짜 이해력이 딸리는건지 혼란이 오네요.. 무엇인가를 공부하면서 남들보다 이해력이

        떨어진다는 느낌은 받아본적이 없는데 여기에 오면 한없이 작아지고 초라해지네요
        (특히 이고잉님만큼 쉽게 가르쳐주시는 분이 없어요 라는 댓글을 볼때마다..)

        이렇게 동영상 강의를 봐도 모르는데 독학으로 해오신분들은 도대체 얼마나 대단한분들인건지

        감이 안오네요.. 사람에 따라 안맞는 영역이 있다는데

        그게 여기인건지 싶습니다.

        북유럽이나 중국에서는 초등학교때부터 코딩교육을 시작한다는데...내가 초등학교 수준의 이해력도 안되는건가

        라는 느낌도 들고...

        인터넷상에 리플달거나 개인적인 이야기를 해본적이 없는데 첫강의부터 지금 라이브러리까지 오는순간

        느꼇던 개인적인 답답함을 하소연해봤습니다.

        죄송합니다.
      • kamuron
        복잡한 개념이군요
      • 정미정
        잘들었습니다!
      • 김민성
        잘들었습니다
      • seetower
        하다가 막혀서 소스코드 그냥 복사해서 붙이기 했는데 이런 에러 메세지가 나옵니다..뭐가 문제일까요??

        Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\Bitnami\wampstack-5.6.29-0\apache2\htdocs\index.php on line 37
      • 유혀누
        잘들었습니다~~~^^
      • 나효진
        17/6/5 완료
      • Seo Yun Seok Tudoistube
        저는 폴더를 다르게 만들어서 require() 함수를 호출하는 파일의 입장에서 찾아들어가야 되네요. 감사합니다^_____^
      • 공삼이육
        감사합니다 꼭 비번을 매번 틀리네요 저도.. ㅜㅜ
        대화보기
        • 우탄
          감사합니다~
          방황과 문제는 내 인생의 또 다른 소스 기억하시나요~?
        • 14번째
          4.4.
        • Sunho Lee
          [Thu Mar 23 16:44:08.216077 2017] [:error] [pid 20150] [client ::1:57522] PHP Warning: mysqli_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES) in /Applications/mampstack-5.6.30-1/apache2/htdocs/lib/db.php on line 3, referer: http://localhost......php
          [Thu Mar 23 16:44:08.216268 2017] [:error] [pid 20150] [client ::1:57522] PHP Warning: mysqli_select_db() expects parameter 1 to be mysqli, boolean given in /Applications/mampstack-5.6.30-1/apache2/htdocs/lib/db.php on line 4, referer: http://localhost......php
          [Thu Mar 23 16:44:08.216291 2017] [:error] [pid 20150] [client ::1:57522] PHP Warning: mysqli_query() expects parameter 1 to be mysqli, boolean given in /Applications/mampstack-5.6.30-1/apache2/htdocs/index.php on line 5, referer: http://localhost......php
          [Thu Mar 23 16:44:08.216309 2017] [:error] [pid 20150] [client ::1:57522] PHP Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, null given in /Applications/mampstack-5.6.30-1/apache2/htdocs/index.php on line 21, referer: http://localhost......php

          맥 사용환경에서.. 이것때매 한참 멍청하게 뒤졌네요
          line 3 에러만 고쳐주니 해결

          자신의 config.php 에 "dpw"=>"비밀번호" 비밀번호 부분을 자신의 mysql 비번으로 수정해주세요 영상만보고 하다가 이고잉님의 비번을 따라쳐버린...
        • 고은정
          세상에서 제일 쉽게 프로그래밍언어를 설명해주시는 이고잉님♥
        • 강경호
          감사합니다
          170228
        • $config['host'] 는 config.php 라는 설정파일에 있는 config 변수의 'host'에 해당하는 값(즉 "localhost")을 읽어옵니다.
          $host 는 db_init() 함수 내부에서만 통용되는 단순한 변수라 보시면 됩니다.

          즉, db_init() 함수를 다음과 같이 코딩해도 됩니다.

          function db_init($h, $u, $p, $n){
          $conn = mysqli_connect($h,$u,$p);
          mysqli_select_db($conn, $n);
          return $conn;
          }
          대화보기
          • Strong
            다시 들어도 너무 좋은 강의입니다.
            감사해요~~
          • 나홀로문도리
            좋은 강의 잘 들었습니다.
            늘 감사해요! ^^*
          • 문돌이
            감사합니다.

            좋은 강의 감사드립니다.

            질문을 드리고 싶은데요.

            lib 은 데이터베이스에 접속하는 틀 같은 역할을 하고,
            config 는 내용을 쉽게 변경할 수 있는 역할을 해 주는 것 같습니다.

            그런데 여기서

            index.php 에서는 $config['host'] 이런식으로 적는데,
            lib/db.php 에서는 $host 이런식으로 적게 되는데, 이러한 점은 무슨 차이인가요?

            둘다 $host를 적으면 안되는건가요?

            현재 제 생각은 index.php 에서는 전체적으로 $host가 또 나올 것을 우려하여, 구체적으로 $config['host'] 라고 적고,
            config.php 로부터 불러온다! 라고 이해해도 될까요?
          • 이성진
            수강 완료!
            좋은 강의 항상 감사 드립니다~
          • Bongha Hwang
            제 생각으로는 session_start()는 session영역의 메모리, require()은 request영역의 메모리(서로 다른 메모리)에 있는 변수를 불러오는 방식이 아닐까 싶어요
            대화보기
            • 감사합니다...코드만 봐도 훤해질 날이 올까요??
            • 김종엽
              2016.08.10 완료!
            • 차누
              수강완료
            • Wookiiis
              잘 보았습니다. :)
            • 수강 완료
            • JustStudy
              고맙습니다 2.
            • DONG
              몇가지 질문이 있습니다...
              다른 페이지의 변수를 사용하는 방법에 대해서 찾아보니
              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
              • Jaden
                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
                        와 이제는 진짜 따라가기 힘드네요. 에고 머리야.
                      버전 관리
                      egoing
                      현재 버전
                      선택 버전
                      graphittie 자세히 보기