웹프로그래밍/기초

4. 데이터베이스

차가운오미자 2021. 6. 16. 11:43

 

데이터베이스

1. 안전하다

2. 프로그래밍적 제어 가능

 

- 관계형 데이터베이스가 가장 일반적

- 종류: mysql, oracle, mssql 등

- MySQL 사용하면 MariaDB도 거의 같게 사용할 수 있음

- SQL: Structured Query Language

 

MySQL

MySQL monitor as a client. 기본적으로 설치되는 프로그램. 표준적인 mysql 클라이언트

명령어를 통해 데이터베이스를 제어하기 때문에 어려울 수 있음. 그래서 엑셀 같은 gui에서 디비 서버에 접속할 수 있는 프로그램들도 등장. 유료이거나, 사용 불가능한 경우도 있어서 monitor 사용법을 잘 알아두는 것이 좋다.

 

여기서는 그냥 windows 명령 프롬프트를 이용한다. 

C:\Bitnami\wampstack-8.0.3-1\mysql에 mysql.exe가 모니터 프로그램

(혹은 본인이 Bitnami를 설치한 파일에서 주소를 찾아 들어가서 찾아보기)

해당 exe 파일이 존재하는 디렉터리로 cd 명령어를 이용해 이동한 후

cd C:\Bitnami\wampstack-8.0.3-1\mysql

 

mysql을 실행 시키면 됨

mysql -hlocalhost -uroot -p (비밀번호)

- 처음에 bitnami 설치할 때 설정한 비밀번호를 입력하면 MySQL DB시스템에 접속된다

- h : 뒤에 따라오는 것이 mysql의 주소 (웹브라우저가 설치된 컴퓨터이니까, 이 컴퓨터)

 

데이터베이스 만들기

1. show databases

명령어를 통해 현재 있는 Database들을 살펴본다. 아래에 있는 네 개의 DB들은 기본적으로 설치되어 있는 것들로 건들지 않는다.

 

 

 

2. 데이터 베이스 생성

CREATE 명령어를 통해 데이터베이스를 하나 생성해준다. 뒤에 요소들은 추후 알아가겠지

다시 확인하니까 'opentutorials' 라는 데이터베이스가 생겼다.

 

CREATE DATABASE opentutorials CHARACTER SET utf8 COLLATE utf8_general_ci;

 

데이터베이스 이용해보기

1. 테이블 생성


USE [데이터베이스명]

CREATE TABLE `register` (
`r_date` datetime NOT NULL AUTO_INCREMENT,
`s_id` int(10) NOT NULL,
`c_id` int(10) NOT NULL,
PRIMARY KEY(s_id, c_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

SHOW TABLES;

USE 명령어로 사용하고자 하는 데이터베이스로 접속한다.

CREATE TABLE 명령어로 테이블을 만들어 본다. `는 ~표시랑 같이 있는 거지 '이 아니다!

``로 캐스팅해줘서 명령어인지 내가 만들 요소인지 구별한다.

SHOW TABLES 명령어로 현재 DB 에 있는 테이블들을 확인한다.

 

 

class 데이터 형식:

- int(바이트)

- varchar(바이트)

- text

- datetime

2. 데이터베이스에 데이터 삽입, 추출

INSERT INTO `register` (`s_id`, `c_id`, `r_date`) VALUES (1, 2, '2020-04-19 11:11:11');

SELECT * FROM register;
SELECT s_id FROM register;
SELECT s_id, c_id FROM register WHERE s_id = 1;
SELECT * FROM register ORDER BY s_id DESC;

INSERT INTO `테이블명` (attributes) VALUES (개체의 attributes);

SELECT [attributes] FROM [table]

+ WHERE [attribute] = key // 조건 제시

+ ORDER BY [attribute] DESC/ASC // 정렬해서 추출 내림/오름

 

예시)

 

PHP 와 MYSQL 연동

php 에서 제공하는 mysqli 라는 API를 사용한다


MYSQL monitor mysqli
서버 접속 mysql -hlocalhost -uroot -p111111; $conn = mysqli_connect('localhost', 'root', '111111');
DB 선택 mysql > use dbproject mysqli_select_db($conn 'dbproject');
조회 mysql> SELECT * FROM class; $result = mysqli_query($conn, 'SELECT * FROM class;');
출력 위에 CMD창 확인 $row = mysqli_fetch_assoc($result);
$row['c_id'];
$row['c_name'];

* $conn에 결과값이 저장됨.

 

PHP로 데이터베이스에 있는 정보 가져와서 출력하기

1. DB연결, 데이터 가져오기

<?php
      $connect = mysqli_connect('localhost', 'root', '111111', 'dbproject');

      $myquery = "select * from class natural join teacher";
      if(array_key_exists("search_keyword", $_POST)){
        $search_keyword = $_POST["search_keyword"];
        $myquery = $myquery." where c_name like '%$search_keyword%'";
      }

      mysqli_query($connect, "set autocommit = 0");
      mysqli_query($connect, "set transaction isolation level read committed");
      mysqli_query($connect, "start");
      $res = mysqli_query($connect, $myquery);

      if($res){
        mysqli_query($connect, "commit");
      } else{
        mysqli_query($connect, "rollback");
        s_msg("검색에 실패하였습니다"); echo "<meta http-equiv='refresh' content = '0;url=class_list.php'>";
      }
      ?>

 

DB 선택과 서버 연결까지 mysqli_connect('localhost', 'root', '비밀번호', '디비명'); 으로 한꺼번에 가능하다.

지금 위에 있는 코드는 예전 프로젝트 코드여서 'search_keyword'를 POST 방식으로 받아서 이에 맞는 쿼리로 SQL문을 만들어 보내고 있다.

 

Natural Join같은 경우, 아직 생활코딩에선 배우진 않았지만, 테이블 두 개를 합치는 방식이다.

transaction, commit, rollback 등을 다 사용하고 있는데, 이것도 생활코딩에서 가르치는 개념은 아니다.

 

주의사항:

1) mysqli_query($conn, "SQL문"); 이다. 순서 헷갈리지 말기 (이것 때문에 한참 고민함)

-> 참고로 반대로 쓰면 PHP Fatal error: Uncaught TypeError: mysqli_query(): Argument #1 ($mysql) must be of type mysqli, ~~ 이런 에러가 뜬다.

 

2) 트랜잭션 개념의 경우 InnoDB engine에서만 가능하다고 한다. 테이블 만들 때 위에서 engine 설정을 해주는 구문을 CREATE TABLE할 때 해주긴 했지만, 다른 table 생성시에 안넣고 했는데도 확인해보니, InnoDB engine 으로 설정되어 있었다.

* 엔진 확인은 SHOW CREATE TABLE teacher; 이런 식으로 하면 된다.

 

 

2. 테이블로 만들어서 HTML 출력

  <table class='table table-striped table-boredered'>
    <thead>
      <tr>
        <th>수업ID</th>
        <th>수업명</th>
        <th>연도</td>
        <th>학기</td>
        <th>선생님ID</td>
        <th>선생님</td>
      </tr>
    </thead>
    <tbody>
      <?php
      $row_index = 1;
      while($row = mysqli_fetch_array($res)){
        echo "<tr>";
        //echo "<td>{$row_index}</td>";
        echo "<td>{$row['c_id']}</td>";
        echo "<td>{$row['c_name']}</td>";
        echo "<td>{$row['year']}</td>";
        echo "<td>{$row['semester']}</td>";
        echo "<td>{$row['t_id']}</td>";
        echo "<td>{$row['t_name']}</td>";
        echo "</tr>";
        $row_index++;
      }
      ?>
    </tbody>
  </table>

위와 같이 완성된다!

 

MySQL 실습

$row = mysqli_fetch_assco($res); //테이블의 첫번째 행 데이터를 반환함, 형식이 associative arr
echo $row['id'];

echo '<li><a href='localhost/index.php?id='.$row['id'].'></a></li>'.'\n';
var_dump($row); //들어온 데이터가 뭔지 알려줌

 

PHP에서 NULL은 false와 같은 값

 

<p> : 단락 표시

 

참고) CSS 컬러: https://at-corner.tistory.com/17

 

[CSS] 웹 컬러 색상표 (Web Color Palette)

#93DAFF #98DFFF #9DE4FF #A2E9FF #A7EEFF #ACF3FF #B0F7FF #B4FBFF #B9FFFF #C0FFFF #87CEFA #91D8FA #A5D8FA #AFDDFA #B9E2FA #C3E7FA #CDECFA #D7F1FA #E1F6FA #EBFBFF #00BFFF #0AC9FF #14D3FF #1EDDFF #28E7F..

at-corner.tistory.com

 

'웹프로그래밍 > 기초' 카테고리의 다른 글

7. 라이브러리 (twitter bootstrap)  (0) 2021.06.16
5. 관계형 데이터베이스  (0) 2021.06.16
3. PHP 실습  (0) 2021.06.16
2. HTML, CSS, JavaScript, PHP  (0) 2021.06.16
1. 웹 기초, 개발도구  (0) 2021.06.16