웹 애플리케이션 만들기

관계형 데이터베이스 실습

실습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. hellisoued
    감사합니다 ㅎㅎ
    대화보기
    • anikwon
      이 페이지 맨 윗쪽 예제 opentutorials.org를 보시면 6번째 줄에

      DROP TABLE IF EXISTS `(테이블명)`;

      이녀석 입니다.
      대화보기
      • 헬리사우드
        테이블삭제를 아무리검색해봐도 찾지를못하겠네요. 테이블삭제법을 알고계신분 있나요?
      • 유민호
        대박 _ 하나 들어있다니 왜 제눈에는 안 보였을가요. 정말 감사합니다!
        대화보기
        • 문돌이
          저도 계속 안되다가...

          <p>본문 : <textarea name="description" id="description"></textarea></p>

          저는 id="descripton" 이 부분을 없어서, id 값을 설정하지 않으니 밑에 script에 작성한 value 값이 없어서 나타나지 않았습니다.
          대화보기
          • 문돌이
            아래쪽 부분에서

            VALUES ('".$_POST['title']."','".$_POST['description']."','".$_user_id."', now())";
            $result = mysqli_query($conn,$sql);
            header('Location: http://localhost......hp');
            ?>


            $user_id."'.now())";

            $와 user_id 사이에 _ 이것이 없으면 되지 않을까요?
            대화보기
            • 유민호
              수업 정말 잘 듣고 있습니다. ^^

              질문은 새로운 작가 데이터를 입력시 작가가 유저테이블에 입력되면서, 자동으로 토픽 테이블에 그 값이 매칭이 되어야되는데, 계속 안됩니다. 전문을 긁어다 붙여넣기하면 되는데, 제가 친 것은 안 되는데 어떤 사유로 그럴까요?

              <제가 친 코드>

              <?php
              require("config/config.php");
              require("lib/db.php");
              $conn = db_init($config["host"],$config["duser"],$config["dpw"],$config["dname"]);
              $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......hp');
              ?>

              <이고잉님코드>
              <?php
              require("config/config.php");
              require("lib/db.php");
              $conn = db_init($config["host"],$config["duser"],$config["dpw"],$config["dname"]);
              $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......hp');
              ?>
            • Hyunsik Lim
              if 조건문에서 조건을 $result == false 로 했을 때도 정상 작동하는 것 같네요.
              (sql에 보낸 명령문이 잘못되었을때 '**값이 boolean입니다'라는 식의 에러가 많은게 생각나서..)
              $result->num_rows == 0 으로 사용하는 혹시 특별한 이유가 있는지 궁금합니다!
            • 까비에프
              num_row 값이 1 이상인지 확인하는 부분에서 "오!" 했습니다 ㅋㅋ 예외 처리가 궁금했거든요~

              그런데 제가 다른 언어를 접하다 배운 예외처리는 '에러 발생시 다른 코드 적용' 개념으로 try-exception 을 사용해왔던 것 같아서요~ 찾아보니 php에도 try-catch-throw가 있네요! if-else로 처리하는 것과 메모리 할당량이 다른건지.. 둘중에선 어느게 더 나은 방법인지 궁금합니다. 또 다른 방법이 있다면 그것도 알고싶구요.
            • 나홀로문도리
              좋은 강의 잘 들었습니다.

              저... 저도 업로드 케어에서 본문에 이미지 주소값 나오는 부분은 안 되는 것 같습니다. 해결책을 알려주시면 다시 들러붙어 보겠습니다 ^^;;;
            • B_Dev
              저는 오늘 이것을 봤는데요 handylady님께서 댓글로 남기신 코드를 다시 atom에 복사, 붙여넣기하시면 실행이 됩니다.
              대화보기
              • 저도 업로드 케어 붙이는 부분에서 본문으로 붙는 부분이 안되네요.

                크롬에서 Inspect 해보니까 이 부분이 "document.getElementById('description').value = document.getElementById('description').value + '<img src = "'+info.cdnUrl+'">';" Uncaught TypeError: Cannot read property 'value' of null 라는 에러가 떠서 안되는거 같네요.

                이리저리 찾아봐도 해결이 혼자서는 안되어서 ㅜ_ㅜ 일단 다음으로 넘어갑니다.
              • 이성진
                수강 완료!
                좋은 강의 항상 감사 드립니다~
              • 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>
              • 정말 잘 듣고 있습니다~! 너무 너무 감사합니다.
                판교 경기문화창조허브에서 직접 뵈었어야 하는 건데..
                제가 시간이 안돼서 참석을 못하였네요.. 정말 아쉬웠습니다.
                저에게 코딩수업은 산넘어 산이지만 정말 유익하게 듣고 있습니다.

                하나 여쭤볼게 있는데
                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 로 같아야 하나요? 궁금합니다..

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

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

                여러번 실습해봐야 완전하게 받아들여질거같네요.
              • 강이경
                sql 이고잉님이 주신 것 그대로 복붙했는데 본문 내용 문단 나눔이 안되어 있네요. 근데 영상에서는 문단 나눠져있구요. 문단 나누는거 어떻게 하나요? <br>도 넣고 해 볼수 있는거 다 해봤는데 문단이 안나눠져요ㅠ 아 그리고 \r\n이 뭔가요?
              • JustStudy
                고맙습니다 2.
              • 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
                            들을 땐 좀이해가 되는데 직접 해보기가 쉽지 않네요^^
                          버전 관리
                          egoing
                          현재 버전
                          선택 버전
                          graphittie 자세히 보기