생활코딩

Coding Everybody

코스 전체목록

닫기

관계형 데이터베이스 실습

실습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');
?>

소스코드

github

코드의 힘을 느껴봅시다

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

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

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

수업보러가기

코드는 아래와 같습니다. 

write.php 파일 내용

변경된 내용은 아래와 같습니다. 

github 변경된 코드 보러가기

댓글

댓글 본문
작성자
비밀번호
  1. 손영민
    여러가지 변수를 이용해서 여러 데이터베이스들을 연결하는 고리를 만들고, 그 알고리즘을 이용해 클라이언트가 게시물을 자기 이름으로 올릴 수 있게 하는 내용이었네요. 잘 배워갑니다.
  2. Comtroll
    자세히 보면 둘 다 그냥 변수로서 사용하는거에여.
    '는 연산자가 아니라 문자로 쓰였습니다.


    ("name='") . (Post) . ("'");
    => name='1'

    잘 모르시겠으면 var_dump로 확인해보세요
    대화보기
    • SongSong

      혹시 전자는 $_GET['id'] 값이 숫자이고
      후자는 $_POST['author'] 값이 문자이기 때문에 그런건가요?
      대화보기
      • SongSong
        질문 하나만 더 하겠습니다! ㅠㅠ
        index.php 파일에서의 34줄인
        $sql = "SELECT topic.id,title,name,description FROM topic LEFT JOIN user ON topic.author = user.id WHERE topic.id=".$_GET['id'];


        process.php 파일의 4째 줄인
        $sql = "SELECT * FROM user WHERE name='".$_POST['author']."'";

        에서 문자처리 방식에서 질문이 있습니다.
        전자는 $_GET['id'] 값을 문자처리 하지 않았지만
        후자는 .$_POST['author']. 값을 문자처리 한거에서

        왜 문자처리 방식에서 차이가 있는지, 어떤 상황에서는 전자처럼 해야하고 어떤상황에서는 후자처럼 해야하는 지 정말정말 궁금합니다 ㅠㅠ
        혼자 아무리 생각해도 풀리지가 않네요.
        감사합니다!
      • SongSong
        질문있습니다!
        실습3에서 user 테이블에 있는 id 값을 가져오기 위해 $user_id = $row['id']; 로 변수를 만들어 주고,
        그 다음에 VALUES 값에 그 변수를 대입하잖아요?
        이 때 변수를 설정하지 않고 바로 .$user_id. 값 자리에 .$row['id']. 값을 넣으면 실행이 되지 않더라구요ㅠㅠ.
        (쓰기 버튼을 누르고 값을 추가해도 데이터베이스에 저장이 안되요)

        왜 작동이 안되는 건지 궁금합니다~ 제 생각에는 둘의 차이라곤 변수로 설정해서 대입했냐 안했냐밖에 차이가 없어 변수를 설정안하는 것이 소스코드가 짧아지기 때문에 변수로 설정 안하고 바로 대입했던것입니다!
      • 서당개3년
        봐도 모르겠으니 언젠간 다시 공부해야겠어요...
      • noName
        2018.3.4 완료~
        마지막수업까지 열공하겠습니다!
      • 클로락스
        MySQL 5.7 부터
        datetime 타입에 '0000-00-00 00:00:00'를 못 넣는다네요.

        '0000-01-01 00:00:00'과 같이 월/일에 맞는 숫자를 넣어줘야합니다.

        (테스트 해보니 '0000-16-01 00:00:00'과 같이 16월이라는 날짜도 에러가 나네요 .)
      • ㅊㅇㅇ
        저두용 그래서 변경해서 올렸어요
        대화보기
        • zydzyd
          datetime이 0000-00-00으로 되있으니 오류가 뜹니다.
          따로 시간을 바꿔줘야할듯.. 나만 그런가?
        • 질문있습니다.
          if(!empty($_GET['id'])){
          }else{
          } <----이런 함수와 조건문을 사용할때

          주소가 php?id=0 과같이 id값에 0을 집어넣을 경우 else문이 실행이 되는데
          0의 값이 들어가면 NULL,false와 같이 값이 거짓인것으로 인정하나요?

          그리고 mysql에서 INSERT INTO 를 사용하여 강제로 id값이 0인 항목을 만들려고 시도해보았는데
          무시되고 id값이 자동으로 올라간 값으로 만들어지네요. mysql에서 프라이머리값으로 지정된항에는 0값은 불가한것인가요?
        • 슝태
          20180119
        • 백관렬
          2번째실습에서 전부 코드를 넣었는데 확인해보니 Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\Bitnami\wampstack-5.6.31-0\apache2\htdocs\index.php on line 36 이런 애러기떠요 해결방법좀알려주세요
        • PassionOfStudy
          18-01-09 11일차 - 1번째 강의

          수강완료!

          뒤로 갈 수록 이해하고 익숙해지는데 시간이 오래걸리네요 ㅠ_ㅠ;;
          너무 얕잡아본 것 같습니다. 하지만 꾸준히해서 이번 주 안에 완강하겠습니다.
          익숙해지자 익숙해지자~ 익숙해지자~~ 익숙해지자~~~ .......
        • 실습3 동영상의 21분28초 즈음에 sql문을 잘못 적으신 것 같습니다.

          SELECT * FROM topic WHERE name="egoing";

          이라고 적으셨습니다만 user테이블을 topic테이블로 잘못 적으신것 같습니다.
          강의듣던중에 제가 잘못된건가 잠깐 혼란이 왔습니다 영상밑에 오류 언급해주시면 감사하겠습니다.
        • 눈똥그리
          질문 있습니다.

          실습 2에서 sql 문법 차이를 알고 싶습니다.
          실습에서 작성한 문법은
          $sql = "SELECT topic.id,title,name,description FROM topic LEFT JOIN user ON topic.author = user.id WHERE topic.id=".$_GET['id'];

          $sql = 'select topic.id, topic.title, topic.description, user.name from topic, user where topic.author = user.id and topic.id = '.$_GET['id'] ;
          위와 같이 LEFT JOIN user ON topic.author = user.id 을 사용하는 방법과
          아래 where 절 topic.author = user.id and 조건절
          차이 점은 무었을까요?
          결과는 같습니다.
        • ㄷㅋ
          코드 애니웨어 사용하고있는데

          sql문을 전체 복사해서 붙여넣기 하면 제대로 데이터가 들어가지않아, 토픽과 유저를 따로 붙여넣으니 되더라구요..
        • 이근환
          2017-12-12 수강 15일차

          수강완료하였습니다.

          점차 난이도가 높아지지만

          포기하지 않고 잘 완주하겠습니다!!:)
        • Gwanghyeon Harry Gim
          지금까지 배운 내용 중 가장 어려웠고 헤맸지만 그만큼 성취감도 큽니다.

          저는 코드애니웨어를 통해 실습하고 있는데요, 실습1에서 이고잉님이 써주신 코드를 mysql이 인식 못하는 데이터가 몇 개 있었습니다. 고민하고 이것저것 시도해보던 중 전체 코드를 한 줄씩 써넣으니 다행히 작동이 됐고 그 뒤로 실습을 계속할 수 있었습니다.

          관계형 데이터베이스. 정말 어려운 내용이었고 앞으로 어떻게 새로운 내용을 받아들여야할지도 막막하게 느껴지지만 나중에 좀 더 깊이 이해할 수 있을 거란 기대감을 갖고 열심히 하산하겠습니다. 감사합니다.
        • 같은 문제
          저도 같은 문제가 있는데, 데이터베이스 user 표를 새로 만들어도, 기존 user표에 name들을 인식 못하고있습니다..
          실습 3번까지 다했지만, 새로운 작성자 이름을 추가할 경우 잘 실행이 되나/ 기존 user에 있는 이름을 작성자에 쓰면, 기존에 있는 id값을 가져오지않고, 마치 새로운 작성자처럼 추가를 합니다.. 어떻게 해야 할까요? 새롭게 다시 만드셨다고 하셨는데, 어떤걸 새롭게 만드신건가요?
          대화보기
          • 박인호
            11-27
            수강완료.
            이해하기 쉽지않은 만큼 이해했을때 생기는 뿌듯함과 희열은 더 큰 것 같네요.
            항상 감사드립니다.
          • 서성진
            후아. 어렵네요. 그래도.. 열심히 해볼랍니다.
            감사합니다.
          • 효천
            잘보고 배우고 나갑니다.
            조금 어렵긴 한데 의미는 알겠습니다.
          • 유상원
            2017-11-11 완료!
          • 김지원
            알아 냈어요!
            혹시 작성자를 아무 변수나 하지 않으셨나요??? 3번강의 16분의 내용은 아직 새로운 id를 가진 작성자에 관한 코드가 작성되지 않은 상태라서 기존에 없는 작성자를 적어 제출할 경우 null값이 뜨네요!

            그래서 강의에 나온대로 egoing이나 혹은 user리스트에 이미 올라온 다른 작성자를 이용해 제출하면 정상적으로 나오네요
            대화보기
            • Dongwon Shin
              수강완료했습니다.
            • Jungmoon Huh
              대장정이 마무리되어 가네요. 감사합니다!
            • Michael
              완료~
              감사합니다.
            • 송성태
              두 번 듣고 이해, 실행했습니다.
              코드는 정확히 작성자가 의도한 것만을 수행하는 군요.
              반복되는 변수 이름들이 어디서 왔는지 새기며 들으니 도움이 됩니다.
              이제 웹이 어떻게 작동하는지 어렴풋이 보입니다.
              웹 사이트 방문할 때 주소창에 보이는 'php?='란 구문을 보면 반가울 정도입니다. ^^
              소중한 지식 나누어 주셔서 감사드립니다.
              더 열심히 해서 저도 다른 이들에게 도움이 되도록 하겠습니다!
            • 왓떠뻐꺼
              완료했습니다. 감사합니다.
            • 크 ㅠㅠ php 어렵네요.. 함수도 외워야될것도 많고..
            • hunter10
              완료
            • DooNa Hwang
              opentutorials.sql 파일의 topic 테이블의 5,6번째 항목이 날짜가 0000-00-00으로 되어있어 error가 나오더라구요..ㅠㅠ 저만 목록이 4개 나와서 한참 헤매었네요.힝.. 소스 수정 부탁드립니다.
              이고잉 님 덕분에 앎의 기쁨을 만끽하고 있습니다.^^ 좋은 지식 나눔 감사드립니다.
              막연하게 홈페이지를 만들고싶다는 생각이었는데, 이렇게 숲을 보니 나무에 대한 공부에 조금 더 자신감이 생깁니다.
              건강하세요~^^
            • 완료...
            • 헬리사우드
              HTML줄바꿈하듯 줄바꿈하니 새롭게보이네요.
              <?php
              echo
              '<h2>
              '.$row['title'].'
              </h2>
              <br>
              <footer>
              Written by '.$row['author'].
              '</footer>
              <br>'
              .$row['description'].
              '<br>
              <small>
              Created:'.$row['created'].
              '</small>';
              ?>
            • 아이
              근데 이게 또 어려운데 진짜 재밌네요!
            • 주주맘마
              완료 - 실습3은 어렵네요. 한번 더 들어봐야겠어요.
            • 고고싱
              이거는 정말 비전공자는 쉽지않네여. 그냥 타이핑하는정도 ㅠㅠ
            • 고고싱
              여기까지가!!!! 끝인가보오~
            • 다시시작
              하..어렵지만 완료.
            • SanFrancisco
              이번 강의가 제일 어려운 것 같네요. 역시 데이터베이스는 어려워요 ㅠ
            • jayxwoo
              잘 봤습니다! 조금 어려워서 한번더 정리해서 해봐야겠네요. 강의 감사합니다.
            • Seongho Kim
              이고잉님께 진심으로 감사드립니다. 많은 걸 배웁니다. 점입가경의 명강의가 이어지는군요.
              아낌없이 노하우를 전하시는 모습에 깊이 감동받았습니다.
            • Youngil Jin
              실습3에서 author 에 id값을 못가져오는데 왜 일까요??
              잘따라 했는거 같은데...
              웹에서는 잘 만들어지는데 작성자이름이 안나오고....ㅜㅜ
              /////////////////
              고쳤습니다.
              새로 만들면 잘 받아오는데...
              고치기 전에 작성했던 user의 id 값을 author이 못 받아오네요..ㅡㅡ;
            • mysqli_insert_id($conn); 부분에서요
              이 내장함수는 이 함수가 실행되기 직전에 추가된 행의 아이디값을 구하는 함수라고 하셨는데
              입력값이 꼭 $conn이어야만 하는 이유가 있나요?
              $sql은 안되는 것인가요?
            • 초다
              맥에서 첫번째 시도는 성공 했는데 두번째부터는 cd Applications으로 들어가면 아무 디렉토리도 보이지 않아요.
              혹시 이문제 해결하신 분 계신가요? ㅜㅜ
            • 하늘가는대로
              여기까지 정주행 완료.~!!
            • qud4186
              finish.
            • svastica
              학습완료!!!
            • GaTMoe
              저도 같은증상이요ㅠㅠㅠ
              <?php
              $conn = mysqli_connect("localhost", "root", "alsdn3220");
              mysqli_select_db($conn, "opentutorials");
              $sql = "SELECT * FROM user WHERE name='".$_POST['author']."'";
              $result = mysqli_query($conn, $sql);
              $row = mysqli_fetch_assoc($result);
              var_dump($row);
              exit;
              $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......hp');
              ?>
              여기서 비밀번호를 따옴표로 감싸면 NULL이 나오고 따옴표 안하면 undefined 떠요
            버전 관리
            egoing
            현재 버전
            선택 버전
            graphittie 자세히 보기