웹 애플리케이션 만들기

관계형 데이터베이스 실습

실습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. heyri
    <?php
    $conn = mysqli_connect("localhost", "root", 436200);
    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);
    ?>

    작성했는데 화면에 NULL이라는 값이 뜨는데 이유를 모르겠습니다.
    에러 로그에는
    [Thu Jun 17 17:26:18.109187 2021] [php:warn] [pid 5764:tid 1176] [client ::1:53041] PHP Warning: Undefined array key "author" in C:\\Bitnami\\wampstack-8.0.6-0\\apache2\\htdocs\\process.php on line 6
  3. James Hanjoo Park
    감사합니다...어렵네요....ㅠ.ㅠ
  4. coding_prince
    감사합니다.
  5. 늦은나이가아님
    2020.12.15 감사합니다
  6. 박병진
    감사합니다. 이해하는데 초점을 두어야 겠습니다.
  7. 박병진
    다시한번 복습하고 반복해야겠습니다. 일단 오늘은 여기까지 마무리하고 내일 다시 복습하겠습니다. 좀 쉬고 오겠습니다.
  8. 10/14
  9. 박성수
    2020.10.08
  10. 허우룩
    2020.09.16
  11. HyeonHui Jeong
    5/17
  12. 아자자
    1. sql INSERT 5,6 항목 날짜 적절히 입력해야 6개 표시 가능
    2. 혹시 Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, 관련 오류 관하여
    $result 값이 False라는 것을 의미합니다. database 시스템이 연결이 되어 있지 않거나 sql문이 정상적으로 처리되지 않은 상태일 확률이 높습니다. 특히 (topic.)id 부분을 확인하시기 바랍니다.
    대화보기
    • 열심히사는사람
      나중에 다시봐야겠나요 확실히 어렵네요
    • 산노을
      감사!
    • wico
      이야... 진짜 엄청나네요. 이렇게 단순한(?) 웹 애플리케이션 만드는 것도 복잡한데 실제로 운영되는 사이트들은 얼마나 많은 사람이 피땀을 흘렸을지 감도 안 잡히네요. 웹 개발자가 목표는 아니지만 정말 좋은 강의 잘 들었습니다!
      코드 사용법은 사용하면서 익혀야겠지만 흐름은 잘 이해됐습니다! 감사합니다!
    • 승환
      나중에 다시보기
    • myjin
      완료!!
    • 엄청잘될꺼야
      감사합니다. 완료
    • 들국화
      감사합니다
    • soribang
      워낙에 초보라서...
      아직은 잘 몰라서 단순하게 따라하는데,
      많이 어렵네요. ㅠㅠ.
    • 야근요정
      어렵네요..ㅠㅠ제대로 이해는 못했지만 다른것들을 배워보면서 천천히 이해해야겠어요ㅠㅠ...
    • 셜리
      하....어려웠네요. 어찌어찌 절반 정도 이해 ㅎㅎㅎ 아무튼 완료했습니다!
    • 코쟁이
      몇번을 확인했지만 이상한 점을 찾지 못했습니다 ㅠㅠ
      이런 에러가 뜨네요~ 혹시라도 해결 방법을 아신다면 알려주시면 감사하겠습니다.

      에러부분
      Notice: Undefined index: author in C:\Bitnami\wampstack-7.1.16-0\apache2\htdocs\process.php on line 4
      NULL

      line 4 부분
      $sql = "SELECT * FROM user WHERE name='".$_POST['author']."'";

      author 값이 정의되어있지 않다는 뜻같은데 명령창에서는 author 값이 존재합니다 ㅠ
    • 고준권
      윽... 몇가지 테스트 해보니 아니네요.
      잘못 알려드린 점 죄송합니다. 글 삭제가 안되네요...ㅎ

      $result = mysqli_query($conn,$sql);
      $row = mysqli_fetch_assoc($result);

      위에서 $sql 부분이 잘못 되서 아예 $result 에 값이 들어가지 않는 경우인 것 같아요!

      저는 SQL문에서 컬럼 값에 ' ' 이거를 입력하지 않아서 같은 에러가 났습니다ㅎ
      대화보기
      • 고준권
        저도 똑같은 에러가 났었는데요,
        짧게 설명드리면, mysqli_fetch_assoc(매개변수)
        에 있는 매개변수 데이터 사이에 , (쉼표) 를 . (마침표) 로 바꿔주심 해결될 듯 합니다!


        PHP 에서는 원래 문자열 데이터 사이에 , (comma) 를 입력하면 데이터가 연결되어 입력되는데요
        (ex : "생활","코딩" -> "생활코딩");
        함수에서는 , 를 사용하면 다른 매개변수를 담았다고 인식하는 것 같더라고요.
        (ex : mysqli_fetch_assoc("생활","코딩"); )
        (매개변수 : 1개 2개 )

        그런데 이 부분에 있는 , (쉼표) 가 아닌 . (마침표)로 수정하시면 연결해서 하나로 인식하더라고요.
        (ex : mysqli_fetch_assoc("생활"."코딩"); )
        (매개변수 : 1개 )

        도움이 되셨으면 좋겠네요!
        대화보기
        • 중간자
          write.php 페이지에서 정보를 입력하고 데이타베이스로 전송을 하면 아래와 같은 에러가 표시됩니다.

          PHP Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, null given in C:\\Bitnami\\wampstack-5.5.38-0\\apache2\\htdocs\\n_trade.php on line 43, referer: http://localhost......php

          그 이유를 아시는 분은 답변을 부탁드립니다.
        • 손영민
          여러가지 변수를 이용해서 여러 데이터베이스들을 연결하는 고리를 만들고, 그 알고리즘을 이용해 클라이언트가 게시물을 자기 이름으로 올릴 수 있게 하는 내용이었네요. 잘 배워갑니다.
        • 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으로 되있으니 오류가 뜹니다.
                따로 시간을 바꿔줘야할듯.. 나만 그런가?
              • phils
                질문있습니다.
                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번째 강의

                수강완료!

                뒤로 갈 수록 이해하고 익숙해지는데 시간이 오래걸리네요 ㅠ_ㅠ;;
                너무 얕잡아본 것 같습니다. 하지만 꾸준히해서 이번 주 안에 완강하겠습니다.
                익숙해지자 익숙해지자~ 익숙해지자~~ 익숙해지자~~~ .......
              • YHPP
                실습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 완료!
                버전 관리
                egoing
                현재 버전
                선택 버전
                graphittie 자세히 보기