웹 애플리케이션 만들기

관계형 데이터베이스 실습

실습1 

opentutorials.sql

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `topic`
-- ----------------------------
DROP TABLE IF EXISTS `topic`;
CREATE TABLE `topic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `description` text NOT NULL,
  `author` int(11) NOT NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of topic
-- ----------------------------
INSERT INTO `topic` VALUES ('1', 'About JavaScript', '<h3>Desctiption</h3>\r\n<p>JavaScript  is a dynamic computer programming language. It is most commonly used as part of web browsers, whose implementations allow client-side scripts to interact with the user, control the browser, communicate asynchronously, and alter the document content that is displayed.</p>\r\n<p>\r\nDespite some naming, syntactic, and standard library similarities, JavaScript and Java are otherwise unrelated and have very different semantics. The syntax of JavaScript is actually derived from C, while the semantics and design are influenced by the Self and Scheme programming languages.\r\n</p>\r\n<h3>See Also</h3>\r\n<ul>\r\n  <li><a href=\"http://en.wikipedia.org/wiki/Dynamic_HTML\">Dynamic HTML and Ajax (programming)</a></li>\r\n  <li><a href=\"http://en.wikipedia.org/wiki/Web_interoperability\">Web interoperability</a></li>\r\n  <li><a href=\"http://en.wikipedia.org/wiki/Web_accessibility\">Web accessibility</a></li>\r\n</ul>\r\n', '1', '2015-03-31 12:14:00');
INSERT INTO `topic` VALUES ('2', 'Variable and Constant', '<h3>Desciption</h3>\r\n\r\nIn computer programming, a variable or scalar is a storage location paired with an associated symbolic name (an identifier), which contains some known or unknown quantity or information referred to as a value. The variable name is the usual way to reference the stored value; this separation of name and content allows the name to be used independently of the exact information it represents. The identifier in computer source code can be bound to a value during run time, and the value of the variable may thus change during the course of program execution.\r\n\r\n<h3>See Also</h3>\r\n<ul>\r\n<li>Non-local variable</li>\r\n<li>Variable interpolation</li>\r\n</ul>\r\n', '3', '2015-05-14 10:04:00');
INSERT INTO `topic` VALUES ('3', 'Opeartor', '<h2>Operator</h2>\r\n<h3>Description</h3>\r\n<p>Programming languages typically support a set of operators: constructs which behave generally like functions, but which differ syntactically or semantically from usual functions</p>\r\n<p>Common simple examples include arithmetic (addition with +, comparison with >) and logical operations (such as AND or &&). </p>\r\n', '1', '2015-06-18 05:00:00');
INSERT INTO `topic` VALUES ('4', 'Conditional', '<h3>Description</h3>\r\n<p>In computer science, conditional statements, conditional expressions and conditional constructs are features of a programming language which perform different computations or actions depending on whether a programmer-specified boolean condition evaluates to true or false. Apart from the case of branch predication, this is always achieved by selectively altering the control flow based on some condition.</p>\r\n<p>In imperative programming languages, the term \"conditional statement\" is usually used, whereas in functional programming, the terms \"conditional expression\" or \"conditional construct\" are preferred, because these terms all have distinct meanings.</p>\r\n<h3>See Also</h3>\r\n<ul>\r\n<li><a href=\"http://en.wikipedia.org/wiki/Branch_(computer_science)\" title=\"Branch (computer science)\">Branch (computer science)</a></li>\r\n<li><a href=\"http://en.wikipedia.org/wiki/Conditional_compilation\" title=\"Conditional compilation\">Conditional compilation</a></li>\r\n<li><a href=\"http://en.wikipedia.org/wiki/Dynamic_dispatch\" title=\"Dynamic dispatch\">Dynamic dispatch</a> for another way to make execution choices</li>\r\n<li><a href=\"http://en.wikipedia.org/wiki/McCarthy_Formalism\" title=\"McCarthy Formalism\">McCarthy Formalism</a> for history and historical references</li>\r\n<li><a href=\"http://en.wikipedia.org/wiki/Named_condition\" title=\"Named condition\" class=\"mw-redirect\">Named condition</a></li>\r\n<li><a href=\"http://en.wikipedia.org/wiki/Test_(Unix)\" title=\"Test (Unix)\">Test (Unix)</a></li>\r\n<li><a href=\"http://en.wikipedia.org/wiki/Yoda_conditions\" title=\"Yoda conditions\">Yoda conditions</a></li>\r\n</ul>', '2', '2015-07-25 00:00:00');
INSERT INTO `topic` VALUES ('5', 'Function', 'A function model or functional model in systems engineering and software engineering is a structured representation of the functions (activities, actions, processes, operations) within the modeled system or subject area.', '2', '0000-00-00 00:00:00');
INSERT INTO `topic` VALUES ('6', 'Object', 'In computer science, an object is a location in memory having a value and possibly referenced by an identifier. An object can be a variable, a data structure, or a function. In the class-based object-oriented programming paradigm, \"object\" refers to a particular instance of a class where the object can be a combination of variables, functions, and data structures. In relational database management, an object can be a table or column, or an association between data and a database entity (such as relating a person\'s age to a specific person)', '3', '0000-00-00 00:00:00');

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `password` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'egoing', '111111');
INSERT INTO `user` VALUES ('2', 'jin', '222222');
INSERT INTO `user` VALUES ('3', 'k8805', '333333');
INSERT INTO `user` VALUES ('4', 'sorialgi', '444444');
INSERT INTO `user` VALUES ('5', 'lily', '555555');
INSERT INTO `user` VALUES ('6', 'happydeveloper', '666666');

실습2

index.php

<?php
$conn = mysqli_connect("localhost", "root", 111111);
mysqli_select_db($conn, "opentutorials");
$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>
  <?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>'.$row['title'].'</h2>';
      echo '<p>'.$row['name'].'</p>';
      echo $row['description'];
  }
  ?>
  </article>
</body>
</html>

실습3

process.php

<?php
$conn = mysqli_connect("localhost", "root", 111111);
mysqli_select_db($conn, "opentutorials");
$sql = "SELECT * FROM user WHERE name='".$_POST['author']."'";
$result  = mysqli_query($conn, $sql);
if($result->num_rows == 0){
  $sql = "INSERT INTO user (name, password) VALUES('".$_POST['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('".$_POST['title']."', '".$_POST['description']."', '".$user_id."', now())";
$result = mysqli_query($conn, $sql);
header('Location: http://localhost/index.php');
?>

코드의 힘을 느껴봅시다

코드는 부품을 결합하는 접착제라고 할 수 있습니다. 부품이 강력해지면 코드의 힘도 강력해집니다. 단 몇줄의 코드를 추가하는 것으로 파일업로드라는 매우 어려운 기능을 웹사이트에 추가해보겠습니다. 이를 위해서 uploadcare라는 서비스를 활용할 것인데요. 주소는 아래와 같습니다. 

http://uploadcare.grsm.io/e/1Xl

참고로 위의 주소로 서비스에 방문하면 서비스에 수익이 발생했을 때 수익금의 일부가 생활코딩에게 지급됩니다. 생활코딩은 이 수익금 전액을 비영리 단체 오픈튜터리얼스의 후원금으로 사용합니다.  

 

소스코드

github

댓글

댓글 본문
작성자
비밀번호
  1. handylady
    업로드 케어 붙이는 부분도 소스코드 있었으면 좋겠습니다.
    본문으로 붙는 부분이 안 되는데 에러가 아
    제가 못찾는 것인가요? ^^a

    (이 부분.. 뭐가 틀린건지 -_ㅜ)

    <script>
    var singleWidget = uploadcare.SingleWidget('[role = uploadcare-uploader]');
    singleWidget.onUploadComplete(function(info){
    document.getElementById('description').value=document.getElementById('description').value +'<img src="'+ info.cdnUrl+'">';
    });
    </script>
  2. smex
    정말 잘 듣고 있습니다~! 너무 너무 감사합니다.
    판교 경기문화창조허브에서 직접 뵈었어야 하는 건데..
    제가 시간이 안돼서 참석을 못하였네요.. 정말 아쉬웠습니다.
    저에게 코딩수업은 산넘어 산이지만 정말 유익하게 듣고 있습니다.

    하나 여쭤볼게 있는데
    process.php 에서 변수 $sql 이 계속 새로 정의 되는데 있어서 생기는 문제는 없을까요?
    $sql 변수가 실행 될때 바로 위에서 정의된 $sql 로 실행 되기 때문에 문제가 없는 것으로 알고 있으면 될까요?
    $sql의 상수값 즉 정의된느 값은 실행되는 값에 따라 바뀌어도 바로 윗줄에서 정의된 것으로 실행되기 때문에 괜찮은 것인가요?

    질문은 예를 들어 각 $sql 을
    1) $sql = "SELECT * FROM user WHERE name='".$_POST['author']."'";
    2) (if 구문의 )$sql = "INSERT INTO user (name, password) VALUES('".$_POST['author']."', '111111')";
    3) $sql = "INSERT INTO topic (title,description,author,created) VALUES('".$_POST['title']."', '".$_POST['description']."', '".$user_id."', now())";

    구분 하기 쉽게 $sql1, $sql2, $sql3 으로 정의해도 상관 없나요?
    아니면 반드시 전부다 $sql 로 같아야 하나요? 궁금합니다..

    그리고 감사합니다!
  3. 폭스킴
    아침에 출근하면 무의식적으로 오픈튜토리얼스로 접속하는 저를 발견하고 있습니다;; 부두교 술사에 사로잡힌 좀비가 된 거 같아요 ㅋ
  4. 123123
    왜안될까 슬프다
  5. 임지호
    데이터베이스 들어오면서 엄청 어렵네요 거의 80%는 이해가 안되는듯요ㅠㅠ
    일 때문에 한달여간 공부 못한 것도 엄청 크고..
    그래도 다시 빢세게 해보겠습니다~~!!
  6. 히스토
    감사합니다. 하다가 오타와 몇줄을 빼먹은 적도 많았네요. 디버깅 덕분에 잘 풀었습니다. 막힐 때는 짜증나고 그렇지만, 탁 풀어냈을 때 성취감이 있네요. 뭐가 문제지 하면서 문법도 더 알게 되는 것 같습니다.
  7. 규현빵
    opentutorials.sql 를 카피앤 페이스트 했는데 오류가 떠서 봤더니 시간지정을 0000-00-00 이런식으로 되어 있었더라고요.. 토픽 테이블에 5,6번이요.. 그런데 수정하는 방법을 따로 안올려주셔서요... 그냥 다시 작성하면 자동으로 덮어쓰기 형식으로? 수정이 될까요??
  8. 드디어..넘어갑니다...
    실습1-3은 반복해서 봤는데요. php문법이 어렵네요.
  9. 김종엽
    2016.08.10 완료!
  10. Wookiiis
    잘 보았습니다. :)
  11. 차누
    수강완료
  12. 김유성
    ^^ 재밌네요.

    html, php, mysql 문법에 문자입력이 햇갈려서 좀 어렵지만요.
  13. 수강완료
  14. 갤럭시
    머리터질뻔햇네요 ㅋㅋㅋㅋㅋㅋ '".."' 이거정말 실수많이할거같아요

    여러번 실습해봐야 완전하게 받아들여질거같네요.
  15. 강이경
    sql 이고잉님이 주신 것 그대로 복붙했는데 본문 내용 문단 나눔이 안되어 있네요. 근데 영상에서는 문단 나눠져있구요. 문단 나누는거 어떻게 하나요? <br>도 넣고 해 볼수 있는거 다 해봤는데 문단이 안나눠져요ㅠ 아 그리고 \r\n이 뭔가요?
  16. JustStudy
    고맙습니다 2.
  17. flyoverthehimalaya
    password 앞에 "컴마(,)" 대신 "점(.)" 을 쓰셨네요!!
    대화보기
    • Jo Minho
      에휴... 콤마.따옴표 정말정말 헷갈리네요
    • 이승민
      저도 실습3에서 대혼란에 빠졌네요 ㅋㅋㅋ 지금까지 머리에 쑤셔넣은 것들의 전체적인 맥락을 머리에 붙잡아두고 있어야 이해가 가능할 것 같네요. 마음 편하게 그냥 다음강의로 넘길랍니다! 나중에 MySQL이랑 PHP 배울때 배우게 되겠지요.
    • 저도 아톰을 쓰고 있는데
      하얀색으로 보이는데 실행을 하니 정상작동하고 있습니다.
      대화보기
      • 지명
        추가를 12번까지 했다가 그 이후부터 추가를해도 보이지않아
        데이터베이스 삭제 방법(delete from 테이블명 where id=?)
        위 방법으로 삭제하고 다시 "쓰기" 창 에서 추가 하려고 하니
        추가가 되지 않아요..... 지금 몇시간째 반복해서 하는데 이전 mysql 까지 돌아갔다가 다시 왔는데도

        안되네요 ㅜㅜ 제발 도와주세요
      • 강지명
        아톰 쓰고 있는데요 $user_id = mysqli_insert_id($conn);

        위 부분에서 mysqli_insert_id 이부분이 하얀색으로 보이는데

        mysql_insert_id 이것처럼 i를 삭제하면 mysqli_query 와 같은 색깔로 보여집니다,,

        정상 작동하지 않는걸로 보입니다.

        작성자가 추가가 안되요..

        이유가있을까요?
      • 지명
        저도 하얀색으로 되고있어서 작성자 추가가 안되네요,,

        몇번해봐서 이제 더이상 추가도안되는데..
        대화보기
        • 광팔a
          꿀잼!
          감사합니다
        • 실습3에서 멘붕 ㅋㅋㅋ
          궁금한게 저렇게 delete해서 데이터베이스 값없애면, id 가 중간중간 비게 되잖아요
          다시 채울순 없는건가요 ㅎㅎ
          대화보기
          • 드디어 여기까지 왔네요
          • 달고뉴
            감사합니다. 따옴표 부분이 참 헷갈리네요.
          • 즐거운수업이었습니다. 감사합니다.
          • zombiefood
            수고하셨습니다^^
          • 지영
            이상하네요 mysqli_insert_id 이 부분만 안되고 있어요
            atom에서 다른 mysql구문은 다 하늘색으로 표시되는데
            이거 역시 하늘색으로 표시되어야하는데 이것만 흰색으로 컬러없이 나오는걸 보니 뭔가 제대로 동작이 안되고 있는것 같은데
            뭐가 문제인지를 잘 모르겠네요....
            그대로 똑같이 다 따라했는데....
            ㅠㅠ
          • 관계형 데이터베이스
            와.... 영상3번째가 36분인데 1시간을 좀 넘겨서 봤네요
            영타도 서툴고 계속 이해안되서 뒤로가고 뒤로가고 하다가 겨우 다봤네요
            뭔가 관계형 데이터베이스의 개념은 조금 이해가 되었지만 php문법과 sql문법이
            서버에 들어갈때 어떤문법이 쓰이고, 또 출력과 입력할때 어떤 문법이 쓰이는지
            아직 햇갈리네요
            억지로 문법을 외우는것보다는 계속 눈으로 반복해야겠어요
            어쨌든 감사합니다. 점점 고지가 눈앞에 보이네요
            이번달 안에 전체 강의 다 복습하고 다음달 부터는 제 스스로 웹서비스를 만들수 있겠죠? ㅎㅎ
          • JustStudy
            고맙습니다
          • 김규태
            감사합니다. 생각해보니 당연한것 같은데, 그걸 볼때는 섞여 있어서 헷갈렸네요.
            대화보기
            • 툰아미
              데이터베이스 테이블의 칼럼(열)마다 들어가야 하는 데이터의 타입이 정해져 있는데, SQL 문을 작성할 때 해당 칼럼의 데이터로 문자열이 들어갈 때는 작은 따옴표로 묶어주는 거에요.
              대화보기
              • Kyu Tae Kim
                이번에는 시간이 많이 걸렸네요. 일때문에 중간중간 다시보고 했는데, 좀 어렵네요. 다시 php 부터 봐야할것 같습니다. 따옴표가 아직 이해가 안가네요. 언제 작은 따옴표가 사용되는지...
              • 이주환
                2016.03.30
                정독했습니다.
                역시 최강의 적은 문자처리 따옴표 이지요 ㅋㅋ
              • aristoi
                들을 땐 좀이해가 되는데 직접 해보기가 쉽지 않네요^^
              • 김트라슈
                우와아아~~ 감사합니다.
              • 서버에러뜨시는분들.. 눈에 불을 켜고 세미콜론 마침표 쉼표 따옴표 확인하세요.. 최강의 적이네요..
              • ctw1048@hanmail.net
                하루만에 안듣고 끊어서 들었더니 이해가 ㅠㅠ
              • Lee Hyeonmin
                왜 user테이블에 id가 없을 때,
                form에 입력시 0이 나오나 했는데,,

                VALUES('".$_POST['author']."','111111')";

                여기서 ,(콤마) 대신에 .(마침표)를 찍었네요.........

                코딩할 때 이런 문자하나가 에러 발생시키고......... 사람 괴롭힌다는걸 느끼네요..
                대화보기
                • Lee Hyeonmin
                  와....... 지금 30분째 씨름중인데,
                  author가 없을 때 입력하면 author name이 안나오고 0이 뜨네요.


                  혹시나해서 if 문을 생활코딩에 나온걸 붙여넣었는데 정상 작동되고..
                  제가 쓴건 인식이 안되네요.

                  <생코>
                  if($result->num_rows == 0){
                  $sql = "INSERT INTO user (name, password) VALUES('".$_POST['author']."', '111111')";
                  mysqli_query($conn, $sql);
                  $user_id = mysqli_insert_id($conn);
                  } else {
                  $row = mysqli_fetch_assoc($result);
                  $user_id = $row['id'];
                  }

                  <제가쓴거>
                  if( $result->num_rows == 0){
                  $sql = "INSERT INTO user (name, password) VALUES ('".$_POST['author']."'.'111111')";
                  mysqli_query($conn, $sql);
                  $user_id = mysqli_insert_id($conn);
                  } else {
                  $row = mysqli_fetch_assoc($result);
                  $user_id = $row['id'];
                  }


                  이유가 뭘까요..
                • 꼬딩
                  중복을 제거한다! 잘 들었습니다 ㅎㅎ
                • Cherry Jeon
                  왜 저는 description 이랑 author 부분이 아예 페이지에 안 뜨는 것일까요..ㅠㅠ해결방법 아시는분!?!!
                • 오빠는다르다
                  감사합니다....ㅠㅠ역시 한번에 이해는 좀 무리 였습니다!!ㅠㅠ
                • sanoske
                  Objective Oriented Programming 이 추가가 안되는것은 저뿐인가요..ㅠㅠ
                • SK Kim
                  도장 쾅!
                  큰따옴표 작은 따옴표 사용해서 sql문 완성하는게 힘들군요.
                  대충 마추다 보면 되긴 하는데 아직 각 따옴표를 언제 사용하는지 차이를 모르겠음..ㅠㅠ
                  " ' "." ' " VS ' " '.' " '
                • 고고
                  아래 2가지 땜에 1시간 동안 삽질했는데여.. ㅎㅎ
                  $var_dump 했을때, null로 나올때는 $var_dump = $result['id']; 하면 해결되요
                  그리고,
                  잘 만들었는데 author가 안나오는것은,,, user 테이블에 없는 author를 화면에서 입력해서 그러네요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
                • 고고
                  저도 딸바보님이랑 똑같이 헤멨는데, ㅎㅎ 감사함다
                  대화보기
                  • 컴퓨터공학전공인데 데이터베이스, 웹프로그래밍 수업시간에도 이해하지 못한걸 지금 이해했네요. 학교에서 수업들을때는 이게 엄청 어려운건줄 알고 못따라갔었는데 설명을 너무잘하셔서 감이 잡힙니다. 다시 공부를 해야겠습니다ㅎㅎ!
                  버전 관리
                  egoing
                  현재 버전
                  선택 버전
                  graphittie 자세히 보기