웹 애플리케이션 만들기

관계형 데이터베이스 실습

실습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. Jungmoon Huh
    대장정이 마무리되어 가네요. 감사합니다!
  2. Michael
    완료~
    감사합니다.
  3. 송성태
    두 번 듣고 이해, 실행했습니다.
    코드는 정확히 작성자가 의도한 것만을 수행하는 군요.
    반복되는 변수 이름들이 어디서 왔는지 새기며 들으니 도움이 됩니다.
    이제 웹이 어떻게 작동하는지 어렴풋이 보입니다.
    웹 사이트 방문할 때 주소창에 보이는 'php?='란 구문을 보면 반가울 정도입니다. ^^
    소중한 지식 나누어 주셔서 감사드립니다.
    더 열심히 해서 저도 다른 이들에게 도움이 되도록 하겠습니다!
  4. 왓떠뻐꺼
    완료했습니다. 감사합니다.
  5. jjung
    크 ㅠㅠ php 어렵네요.. 함수도 외워야될것도 많고..
  6. hunter10
    완료
  7. DooNa Hwang
    opentutorials.sql 파일의 topic 테이블의 5,6번째 항목이 날짜가 0000-00-00으로 되어있어 error가 나오더라구요..ㅠㅠ 저만 목록이 4개 나와서 한참 헤매었네요.힝.. 소스 수정 부탁드립니다.
    이고잉 님 덕분에 앎의 기쁨을 만끽하고 있습니다.^^ 좋은 지식 나눔 감사드립니다.
    막연하게 홈페이지를 만들고싶다는 생각이었는데, 이렇게 숲을 보니 나무에 대한 공부에 조금 더 자신감이 생깁니다.
    건강하세요~^^
  8. 완료...
  9. 헬리사우드
    HTML줄바꿈하듯 줄바꿈하니 새롭게보이네요.
    <?php
    echo
    '<h2>
    '.$row['title'].'
    </h2>
    <br>
    <footer>
    Written by '.$row['author'].
    '</footer>
    <br>'
    .$row['description'].
    '<br>
    <small>
    Created:'.$row['created'].
    '</small>';
    ?>
  10. 아이
    근데 이게 또 어려운데 진짜 재밌네요!
  11. 주주맘마
    완료 - 실습3은 어렵네요. 한번 더 들어봐야겠어요.
  12. 고고싱
    이거는 정말 비전공자는 쉽지않네여. 그냥 타이핑하는정도 ㅠㅠ
  13. 고고싱
    여기까지가!!!! 끝인가보오~
  14. 다시시작
    하..어렵지만 완료.
  15. SanFrancisco
    이번 강의가 제일 어려운 것 같네요. 역시 데이터베이스는 어려워요 ㅠ
  16. jayxwoo
    잘 봤습니다! 조금 어려워서 한번더 정리해서 해봐야겠네요. 강의 감사합니다.
  17. Seongho Kim
    이고잉님께 진심으로 감사드립니다. 많은 걸 배웁니다. 점입가경의 명강의가 이어지는군요.
    아낌없이 노하우를 전하시는 모습에 깊이 감동받았습니다.
  18. Youngil Jin
    실습3에서 author 에 id값을 못가져오는데 왜 일까요??
    잘따라 했는거 같은데...
    웹에서는 잘 만들어지는데 작성자이름이 안나오고....ㅜㅜ
    /////////////////
    고쳤습니다.
    새로 만들면 잘 받아오는데...
    고치기 전에 작성했던 user의 id 값을 author이 못 받아오네요..ㅡㅡ;
  19. mysqli_insert_id($conn); 부분에서요
    이 내장함수는 이 함수가 실행되기 직전에 추가된 행의 아이디값을 구하는 함수라고 하셨는데
    입력값이 꼭 $conn이어야만 하는 이유가 있나요?
    $sql은 안되는 것인가요?
  20. 초다
    맥에서 첫번째 시도는 성공 했는데 두번째부터는 cd Applications으로 들어가면 아무 디렉토리도 보이지 않아요.
    혹시 이문제 해결하신 분 계신가요? ㅜㅜ
  21. 하늘가는대로
    여기까지 정주행 완료.~!!
  22. qud4186
    finish.
  23. svastica
    학습완료!!!
  24. 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 떠요
  25. 비밀번호를 입력했는데 undefined constant라네요..?왜이럴까요ㅠㅜ
  26. GoldPenguin
    완료했습니다.
  27. 가영
    완료!
  28. Baekkyu Han
    관계형 데이터베이스 실습
    실습1~3
    데이터 출력법
    데이터 추가
  29. 박예지
    8월 10일 완료!!!
  30. 김경태
    다시 시작! 잘봤습니다~
  31. Myeongjin Ko
    완료
  32. 완료 ^^
  33. 인재진
    수강완료
  34. 푸른바람9101
    열심히...
  35. 하산만 남았다고 하셔서 이제 가볍게 들어야 겠다고 긴장을 풀고 있었는데 어렵네요..;; ㅎㅎ

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

    콤마를 여러개 찍을 때, 문법도 문자 취급을 하는 것 같은데
    초보인 저에게 무진장 어렵네요 ㅎㅎ 저에게 문자는 코딩 후 화면에 보여지는 제목이나 본문, 목차, (php 처음 강의에서) 계산 값 이런것으로 생각하고 있어요. 하지만 프로그램의 입장에서는 다른 것 같아
    보충 공부가 필요하네요.
  36. 김범진
    휴 완료
  37. 저 같은 경우는 코드애니웨어에서 실습을 합니다.
    그런데 브라우저 문제인지 터미널 창에서는 (sql문이) 붙여넣기가 되지 않습니다.
    앞서 mysql실습 시간에는 일일이 타자를 쳐서 넣었고 할만한 분량이라 그냥 진행을 했지만,
    이번에는 너무 많아서 방법이 없나 싶어 검색을 해 보고
    source 로 실행을 시켜서 진행을 하고 있습니다.
    이 방법도 소개를 해주실 수는 없을까요?
  38. 한종운
    [관계형 데이터베이스 실습]
    실습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 지금은 그냥 넘어가라. 흐름이 중요.
  39. 오상민
    감사합니다.
  40. 잘 봤습니다!
  41. 지구촌
    되게 어렵네요.
    그래도 열심히 따라 해봐야겠죠?
    하겠습니다.
  42. 코딩학습생
    잘 봤습니다.
  43. 시바견
    코드의 흐름을 잘 생각 해보자!
  44. 김대관
    잘봤습니다
  45. 임영선
    강의 잘 들었습니다!
    코드 10줄을 추가시키는 것만으로도 이렇게 벅차군요; 강의가 거의 끝나가네요, 조금더 힘을 내야겠어요.
  46. 박재은
    내용이 어려워 두차례 걸쳐 들었습니다 SQL문에서 따옴표 표시를 오랜만에 해보니 또 헷갈리네요 ㅜㅜ 다음에 SQL 구문에 대해 공부해야 겠습니다.
    따로 작성자를 일일이 바꿀필요 없이 쓰기가 자유롭게 이루어지는 점이 관계형 데이터의 장점 중 하나인 것 같습니다.
  47. Jihoon Park
    WOw~ How gorgeous!!
  48. 완료!
  49. jimmyzip
    opentutorials.org/module/1514/9428
    대화보기
    • aimerthis(이성민)
      이전 강의 부분 문제점을 방금듣고 해결했네요....
    버전 관리
    egoing
    현재 버전
    선택 버전
    graphittie 자세히 보기