MY MEMO
[DATABASE] 관계형 데이터 베이스 본문
+) 이미지를 올리는 방법 생활코딩 : https://www.youtube.com/watch?v=1iViYMeEqq0
데이터 베이스의 큰 범위 안에는 관계형 데이터베이스가 있다.
관계형 데이터베이스 툴은 여러가지가 있다. Mysql Oracle이 대표적이다.
왜 관계형 데이터베이스가 필요할까? 만약 우리가 두개의 테이블이 있다고 하자.
위에서 표시한 것과 같이 author의 id가 topic table에 적혀있고 user의 id와 이름이 적혀있다.
이 두 테이블은 서로 관련이 있다. 만약 topic의 title을 선택하고 title에 맞는 작가의 이름을 알고싶으면 author id를 가지고 user table로 이동한다.
author id를 이용하여 작가를 찾고, 작가의 이름을 나타내주면 된다.
코드로 나타내면 위와 같다. topic table에서 title과 name만을 선택할 것이다. 그 table을 left join을 할껀데 왼쪽에 맞추어서 join할 것이다. 어떤테이블을? user table을 어떤 조건이냐면 topic의 author의 숫자와 user의 id의 숫자가 맞는 것으로 말이다.
이렇게 나타내면 더 쉽게 어떤 title을 어떤 author가 썼는지 알수있다.
process.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?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 ); ?> |
여기서 if문을 왜썼는지 주목할 필요가있다. 맨처음 process.php는 insert만 해주었다. user table은 이용하지 않는데, 작가 이름을 나타내지 않아 필요하지 않기 때문이다.
하지만 작가의 이름을 나타내기 위해서는 코드를 위와 같이 바꿔줄 필요가 있다.
이 코드에서 주목해야할 부분은 if문이다.
왜 insert를 하지않고 작가의 이름을 user table에서 먼저 찾아보는 것일까?
왜냐하면 자신이 웹에서 임의로 이름을 지어서 넣었을때, 작가의 이름을 user table에서 찾아 넣고 싶지만 찾을 수 없을 때가 있다.
이때는 작가의 이름을 찾지도 못할 뿐더러 user table에 갱신을 해주지 않기 때문에 먼저 user table에 있는지 확인하는 작업이 필요하다.
먼저 sql을 돌려보고 결과값이 0인지 확인한다. 만약 0이라면 table에 없는 것이기 때문에 table에 author이름을 insert해준다. 마찬가지로 id는 자동으로 1씩 증가하기 때문에 굳이 추가하지 않아도 된다.
보면 mysqli_insert_id라는 내장함수가 있다. table에 id라는 이름이 붙어서 위와 같은 내장함수를 쓰는 것이 아닌 id를 primary key즉 table에 단 한개뿐인 변수로 설정했기 때문에 사용이 가능하다.
+) mysqli_insert_id : 마지막 쿼리에 의해 업데이트 된 AUTO_INCREMENT 필드의 값을 갖는 정수를 반환합니다.
그렇다면 user_id에는 insert된 이후에 가장 마지막에 있는 id값이 저장되어있다.
밑의 else문을 보자 만약 있다면 간단하다 result을 가져와서 id의 값만 읽으면 된다.
즉 if else 조건문은 오직 user table을 위하여 설정되어있는 것이다. user table에 작가가 없을 경우를 대비하여 table을 갱신하거나 혹은 있다면 있는 데이터를 가져오는 것이다.
이후 topic 테이블에 내용을 저장한다. title과 작가를 저장하는데 작가는 위에서 가져온 user id를 이용한다.
쿼리를 돌리고 이후 다시 index.php페이지로 돌아가는 코드이다.
만약 이 파일을 돌린다면 내용과 작가가 추가되었을 때 자동으로 메뉴가 사이드에 추가되고, 추가된 메뉴를 누르면 제목 작가 내용이 보여질 것이다.
전체코드는 아래와 같다.
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <?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" > </head> <body id= "target" > <header> <img src= "https://s3.ap-northeast-2.amazonaws.com/opentutorials-user-file/course/94.png" alt= "생활코딩" > </header> <nav> <ol> <?php while ( $row = mysqli_fetch_assoc( $result )){ } ?> </ 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'" /> </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> |
process.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?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 ); ?> |
write.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <?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" > </head> <body id= "target" > <header> <img src= "https://s3.ap-northeast-2.amazonaws.com/opentutorials-user-file/course/94.png" alt= "생활코딩" > </header> <nav> <ol> <?php while ( $row = mysqli_fetch_assoc( $result )){ } ?> </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'" /> </div> <article> <form action= "process.php" method= "post" > <p> 제목 : <input type= "text" name= "title" > </p> <p> 작성자 : <input type= "text" name= "author" > </p> <p> 본문 : <textarea name= "description" ></textarea> </p> <input type= "submit" name= "name" > </form> </article> </body> </html> |
'STUDYING > WEB' 카테고리의 다른 글
[JSP] 추가 (0) | 2017.06.04 |
---|---|
[BOOTSTRAP] 기초 공부하기 (0) | 2017.06.01 |
[JSP] JSP 기본개념과 간단한 예제 (0) | 2017.04.20 |
[PHP] MYSQL 연동 (0) | 2017.04.20 |
[PHP] PHP의 기본 개념과 간단한 예제 (0) | 2017.04.20 |