웹 애플리케이션 만들기

관계형 데이터베이스 실습

실습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. 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 떠요
  2. 비밀번호를 입력했는데 undefined constant라네요..?왜이럴까요ㅠㅜ
  3. GoldPenguin
    완료했습니다.
  4. 가영
    완료!
  5. Baekkyu Han
    관계형 데이터베이스 실습
    실습1~3
    데이터 출력법
    데이터 추가
  6. 박예지
    8월 10일 완료!!!
  7. 김경태
    다시 시작! 잘봤습니다~
  8. Myeongjin Ko
    완료
  9. 완료 ^^
  10. 인재진
    수강완료
  11. 푸른바람9101
    열심히...
  12. Scia
    하산만 남았다고 하셔서 이제 가볍게 들어야 겠다고 긴장을 풀고 있었는데 어렵네요..;; ㅎㅎ

    실습2에서 코딩한 내용에 name 이 없어 author를 name으로 바꾸는 것은 이해가 가지만,
    한편으로는 mysql에 author로 계속 쓰던 것을 갑자기 name 으로 바꿔도 되나 하는 혼돈이 와요...

    콤마를 여러개 찍을 때, 문법도 문자 취급을 하는 것 같은데
    초보인 저에게 무진장 어렵네요 ㅎㅎ 저에게 문자는 코딩 후 화면에 보여지는 제목이나 본문, 목차, (php 처음 강의에서) 계산 값 이런것으로 생각하고 있어요. 하지만 프로그램의 입장에서는 다른 것 같아
    보충 공부가 필요하네요.
  13. 김범진
    휴 완료
  14. 저 같은 경우는 코드애니웨어에서 실습을 합니다.
    그런데 브라우저 문제인지 터미널 창에서는 (sql문이) 붙여넣기가 되지 않습니다.
    앞서 mysql실습 시간에는 일일이 타자를 쳐서 넣었고 할만한 분량이라 그냥 진행을 했지만,
    이번에는 너무 많아서 방법이 없나 싶어 검색을 해 보고
    source 로 실행을 시켜서 진행을 하고 있습니다.
    이 방법도 소개를 해주실 수는 없을까요?
  15. 한종운
    [관계형 데이터베이스 실습]
    실습1
    웹 어플리케이션에서 관계형 dbase
    웹 어플 에서 실행 관계형 dbase를 만드는 것이므로,
    Mysql dbase table 부분은 copy해서 진행.
    Table에서 pw부분은 나중 활용(forget now)
    title description 사이에 author 추가

    실습2
    topic table을 기준으로 user table을 join
    topic.author를 user.id와 일치시킴
    웹 어플에서 author를 name 으로 변경

    실습3
    Mysql에서 추가할 table을 Excel에서 미리 만들어 확인
    user table 에서 author name을 찾아 해당 author의 id값을 찾는다
    author가 user table 에 있는지 확인하여, 없으면 추가하고, 추가된 author를 표시.
    작업하려는 내용의 흐름이 중요.

    exit 이하는 실행 안함.
    sql문이 제대로 실행되는지를,echo문을 넣어서 바로 확인.

    author가 user table에 사용자가 없으면, 조건문을 이용, author를 추가하고 id를 생성하고 id를 찾아 가져온다.
    obj 지금은 그냥 넘어가라. 흐름이 중요.
  16. 오상민
    감사합니다.
  17. ggang
    잘 봤습니다!
  18. 지구촌
    되게 어렵네요.
    그래도 열심히 따라 해봐야겠죠?
    하겠습니다.
  19. 코딩학습생
    잘 봤습니다.
  20. 시바견
    코드의 흐름을 잘 생각 해보자!
  21. 김대관
    잘봤습니다
  22. 임영선
    강의 잘 들었습니다!
    코드 10줄을 추가시키는 것만으로도 이렇게 벅차군요; 강의가 거의 끝나가네요, 조금더 힘을 내야겠어요.
  23. 박재은
    내용이 어려워 두차례 걸쳐 들었습니다 SQL문에서 따옴표 표시를 오랜만에 해보니 또 헷갈리네요 ㅜㅜ 다음에 SQL 구문에 대해 공부해야 겠습니다.
    따로 작성자를 일일이 바꿀필요 없이 쓰기가 자유롭게 이루어지는 점이 관계형 데이터의 장점 중 하나인 것 같습니다.
  24. Jihoon Park
    WOw~ How gorgeous!!
  25. charl
    완료!
  26. jimmyzip
    opentutorials.org/module/1514/9428
    대화보기
    • aimerthis(이성민)
      이전 강의 부분 문제점을 방금듣고 해결했네요....
    • 김우진
      수강완료했습니다..
    • 안성현
      오.. 이번 강의는 전에 들었던 강의들보다 훨씬 어렵네요..! 관계형 데이터베이스를 사용하니 데이터베이스가 좀 더 체계적으로 구축되는(?) 느낌이네요!! 좀 더 공부해서 저도 자유자재로 관계형 데이터베이스를 사용하고 싶네요! 오늘도 좋은 강의 감사합니다!!
    • 돌튀김
      php에서 . 와 , 의 차이점이 정확하게 뭔가요? 데이터 베이스에 이름은 저장이 되질 않아서 한참을 보니 저 기호가잘못되어있었습니다. 구글링을 해봐도 특별하게 다른점을 얘기하진 않는데... 다른이유가 있으니 전 오류가 있었던 거겠죠? 혹시 알려주실수있는분?!
    • YeonHoon Jeong
      php 따옴표 구분 짓는게 헷갈리네요. 앞에서 한번 시야를 넓혀주시고 세부적으로 들어가서 좋았습니다. 감사합니다.
    • 박정호
      하아 .. 어렵군요
      돌려보기 3번하고 이해했습니다 ㅎㅎ
    • 강동곤
      잘 봤습니다 ㅎ
    • 기픈
      topic과 user 테이블이 만들어지지 않고 계속 오류 ㅠ.ㅠ
    • 기픈
      감사합니다. 눈으로는 대~~강 만 이해했는데... 어려워요....그래도 힘내서 하려구요.
      위 추가 수업은 머리좀 식혔다가 해야겠어요.
    • 강호준
      갈수록 어려워져서 그동안 복습할것만 체크해봤는데도 엄청 많네요 ㅠ 그래도 꾸준히 복습하다보면 늘겠죠?
    • Min-Seon Kwak
      아무래도 늦은 밤에 강의 듣느라 약간 피곤했나봐요. 열심히 찾는다고 찾았는데 미처 못 봤네요. 감사합니다:)
      대화보기
      • 김용원
        점점 더 어려워지는군요!! 집중해서 꾸준히 가도록 하겠습니다!

        Min-Seon Kwak님
        VALUES('".$_POST['title']."','".$_POST['description']."','".$user_id."'now())";
        에서
        '".$user_id."',"'now())";로 바꾸시면 될거 같아요! user_id 와 now 사이에 쉼표가 빠져있네요!
      • Min-Seon Kwak
        강의 3 16분 19초 정도에서 질문 있습니다

        <?php
        $conn=mysqli_connect("localhost", "root", "(제 비밀번호입니다)");
        mysqli_select_db($conn, "opentutorials");
        $sql="SELECT * FROM user WHERE name='".$_POST['author']."'";
        $result=mysqli_query($conn, $sql);
        $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......hp');
        ?>

        다음과 같이 코드 작성 따라하고 실행했는데 데이터 추가가 되지 않았습니다.
        여기서 제가 실수한 부분이 뭘까요..?

        그리고 사이트에 나와있는 코드 긁어서 실행했더니 추가되는 행 oop~ 가 7번이 아닌 8번으로 나오네요.
      • AngelPlayer
        2017. 07. 28. 15:40
        흠.. 많이 어려워서 여러번 돌려봤네용..
        중간에 oop 부분 따라할때 author가 0이떠서 한참 고민을..(결국 문제를 못찾아서 포기..)
        뒤에 부분은 잘됬는데 말이죠..
      • nulgrace
        topic 테이블의 5번 6번 쿼리문 실행에 오류가 나는 이유는 마지막 컬럼 값으로 datetime의 값을 '0000-00-00 00:00:00'으로 넣어서 인것 같습니다. 다른 연도와 날짜 시간값을 임의로 집어 넣어서 실행하니 오류없이 잘 실행 되더군요. topic 5,6번 값 안들어가신분들 날짜값만 수정해서 해보시면 되실 겁니다.
      • lmchul217@gmail.com
        관계형데이터베이스 이론 수업은 어디에 있나요. 진도표에서는 mysql실습에서 바로 넘어오던데... 제가 강의를 건너뛴건가요?
      • 정지호
        수강완료
      • Kisoo Ahn
        관계형 데이터베이스를 이해시키려는 이고잉님의 의도가 잘 반영된 좋은 강의 내용입니다.
        늘 감사드립니다.
      • aga159
        완료
      • Geonho Lee
        감사합니다^^
      • Jaehyun Kim
        업로드케어를 통한 기능추가까지 감사합니다!^^
      • andy023
        후 중간에 길을 잃어 버렸네요.. 다시 또 그냥 강의 만 듣습니다....
      • 정말어렵네요...ㅎㅎ
      • use opentutorials로 데이터베이스에 들어가신 후에 하셔야합니다
        대화보기
        버전 관리
        egoing
        현재 버전
        선택 버전
        graphittie 자세히 보기