R136A1

[SWING] WEB - 4-5주차 DB 본문

SWING/[20-2] WEB

[SWING] WEB - 4-5주차 DB

r136a1x27 2020. 11. 13. 12:31

DB(Database)

여러 응용 시스템들이 공유할 수록 통합, 저장된 운영데이터의 집합

 

데이터베이스

    테이블

        필드(분류)

        레코드(데이터, 한 줄의 정보)

 

특징

1. 실시간 접근

사용자 질의에 대해 즉시 처리하고 응답

2. 계속적인 변화

삽입, 삭제, 갱신을 위해 정확한 최신 데이터 유지

3. 동시 공유

여러 사용자가 동시에 공유

4. 내용에 의한 참조

사용자가 요구하는 데이터 내용에 따라 참조

5. 데이터 논리적 독립성

데이터 논리 구조가 변경되더라도 응용프로그램은 변경되지 않음

 

 

DBMS 데이터베이스 관리 시스템

응용 프로그램과 데이터의 중재자

모든 응용 프로그램들이 DB를 공유할 수 있도록 관리함

 

- MySQL

오픈소스, php 웹프로그래밍에서 사용되는 DBMS

대용량 데이터 처리 가능

GUI 툴이 내장되어 있지 않아 CUI 사용 (GUI 굳이 쓰고자 한다면 MySQL 프론트엔드 소프트웨어 추가 설치하면 됨)

SQL(질의어)에 사용되는 모든 것들은 대소문자 구분 X

문장 끝은 무조건 세미콜론(;)으로 끝남

 

bitnami > wapstack... > mysql > bin

폴더 주소창에서 cmd 입력 엔터 = 해당 경로에서 cmd 실행됨

 

접속: mysql -u이름 -p비밀번호 (붙여서)

                                                   *비번은 설치할 때 입력한 값 toor123

can't connect mysql server : 작업관리자-서비스-mysql 실행

 

접속완료될 경우 mysql > 로 뜸

 

자주 쓰는 명령어

*한글입력에러뜨면 alter table webstudy convert to charset utf8;

DB → 테이블  필드  레코드

 

DB생성 CREATE DATABASE 데이터베이스명;

모든DB보기 SHOW DATABASES;

작업할DB선택 USE 데이터베이스명;

DB삭제 DROP DATABASE 데이터베이스명;

 

 

테이블생성 CREATE TABLE 테이블명( 정보들, 쉼표로 구분 )

*PRIMARY KEY(식별키로 사용할 필드명)  # 테이블에서 레코드 식별하는 기본 키, 고유한 것, 필수 1개 

CREATE TABLE 테이블명( //아래는 필드를 생성하는 것

필드명 타입,

필드명 타입,

...

PRIMARY KEY(필드명)
);

예제 CREATE TABLE webstudy(

-> num int not null,

-> name varchar(20),

-> major varchar(20),

-> age int,

-> primary key(num));

 

*DB들어간 뒤 테이블 볼 수 있음

DB내 모든 테이블 목록보기 SHOW TABLES;

테이블 보기(구조확인, 필드) DESC 테이블명;              FIeld, Type, Null, Key ...순서

테이블 내 모든 레코드 보기 SELECT * FROM 테이블명;

테이블 삭제하기 DROP TABLE 테이블이름;

 

 

레코드 추가 INSERT INTO 테이블명 (열1, 열2, 열3) VALUES(열 순서대로 값);  →필드 순서대로 넣어줄 것

                                                               ㄴ없어도 됨, 없으면 자동으로 본 필드 순서대로 써줘야 함 *notnull 반드시 있어야 함

ex) INSERT INTO webstudy VALUES (2020111222, '김기름', '정보보호학과', 20);

레코드 삭제 DELETE FROM 테이블명 WHERE 조건;

레코드 수정 UPDATE 테이블이름 SET 실행문 WHERE 조건;

ex) UPDATE webstudy SET age=age+4 WHERE name like '김기름';

 

레코드 추출 SELECT 추출할필드들 FROM 테이블 WHERE 조건; --조건문은 주로 필드='값' 의 형태 

+ORDER BY 기준필드 정렬방식, 기준필드2 정렬방식(여러개 가능)

                                           ㄴASC 오름차순(default, 안적어줘도됨) / DESC 내림차순

                                                          작은값→큰값                                        큰값→작은값

WHERE 조건에서

*: 모든 값

%: 뒤에 어떤 값이 있든 상관없음  ex. LIKE '김%'

like 는 = 와 기능이 같다

AND OR && || 사용 가능

 

SELECT * FROM 테이블; //레코드 전체 검색!

SELECT name, id, gender, address, age FROM mem 
WHERE ((age>=20 AND age<=29) OR (age>=40 AND age <=49)) AND (gender='W');

SELECT name, id, gender, address, age FROM mem 
WHERE (age>=20 AND age<=29) OR (age>=40 AND age <=49) AND (gender='W');
※이처럼 괄호로 제대로 안묶어주면 조건 잘 적용 안됨 -> 1. 괄호안 조건처리 2. AND 처리 3. OR 처리 (우선순위!!)

 

(순서)

DB생성 -> 사용할 DB 선택 -> 테이블 생성 -> 테이블에 데이터 정보 삽입

★연결할 때는 DB명, 쿼리에서는 테이블

 

 

.sql 파일 나의 DB로 가져오기

1. bin 폴더에서 cmd 다시 실행

3. mysql -u이름 -p비번 mydb < mem.sql의 경로 로 mem.sql 파일의 모든 파일을 mydb로 가져온다

파일은 현재 cmd의 위치(bin)를 기준으로 상대경로 사용해도 됨

있는 db여야 함

4. show tables; 하면 mem.sql이 내 db로 들어온 것 볼 수 있음

 

--오류 터짐

mem.sql mydb로 가져와서 준비하는 부분

mysql -uroot -p mydb < mem.sql

Enter password: (비밀번호)

ERROR 1366 (HY000) at line 13: Incorrect string value: '\xBF\xB5\xC1\xD6' for column 'name' at row 1

오류ㅡ> desc를 통해 봤는데 필드는 설정되어 있으나

select * from mem;를 통해 보면 값이 다 날아감 (Empty set)

 

 

table 설정을 UTF8로 바꾸고 alter table mem convert to charset utf8;

다시 하려고 해도

ERROR 1050 (42S01) at line 1: Table 'mem' already exists

 

이미 있다고 하면서 다시 넣지 못하게 함

drop table mem; 한 뒤에 하면 원점으로 돌아감

 

*my.ini 파일을 수정해서 UTF8 설정으로 해봤음

 

show variables like 'c%'; 해서 봐도 설정은 모두 utf8~~로 설정되어 있음

 

임시방편으로 mem.sql 파일을 열어 레코드를 넣는 부분은 수동으로 해서 다음 과제들 해결함

(mydb < mem.sql 오류만 해결 못한 상태)

 


php페이지와 mysql 연동

mysql 1. 연결 2. 쿼리보내기 3. 종료

1. 연결 함수  $연결변수=mysqli_connect("서버주소", "데베아이디", "데베패스워드", "사용할데이터베이스명");

$con=mysqli_connect("localhost", "root", "1234", "mydb")

$con=mysqli_connect("localhost", "root", "1234", "mydb") or die("mysql connect error")

변수에 넣어야 실질적으로 사용할 수 있다, 테이블명 아님!! 테이블은 쿼리에서 선택함

- die()를 쓰면 연결실패 시 메시지 출력 후 프로그램 종료하게 됨, if else보다 간단

 

3. 연결 해제 함수  mysqli_close($연결변수);

 

2. 쿼리보내기  mysqli_query($연결변수, 쿼리문): 변수에 연결할 때 선택된 db에 query 전송

$query="SELECT * FROM member";

$result=mysqli_query($con, $query) or die("query error");

옛날글: 연결변수없이 query만 보내는 거 있음 최신과 다름 주의

 

ex) 회원가입 시 아이디 중복 체크

→ 쿼리문 보내서 받아온 정보가 있는지 count한다

$query="SELECT * FROM member where name='loveweb';";

※주의 ; 까지 포함해서 닫아줘야 함, 그래서 쿼리에 문자열 있을 경우 작은따옴표 씀

$result=mysqli_query($con, $query) or die("query error"); # SELECT문의 경우 변수에 쿼리의 결과를 저장할 수 있음

$count=mysqli_num_rows($result); ← 행(row)의 개수를 받아옴

 

if($count==1)

{ echo "id already exists"; }

else echo "gogo";

 

2. 1 mysqli_fetch_array() 쿼리로 전달받은 데이터의 내용을 잘 보여줄 때 사용하는 함수

결과 mysql 테이블의 형태를 배열의 형태로, 들여오게 됨→ 한 줄 씩 가져옴 -- for이나 while 필요

(while 많이 씀 --내용 없으면 끝나니까) //필드는 들여오지 않고 레코드만 가져옴

"조회 결과 테이블의 레코드를 호출될 때 마다 한 줄 씩 가져옴"

$row=mysqli_fetch_array($result);

                                                        ㄴ쿼리보내기 mysqli_query()에서 저장한 변수 또는 mysqli_query() 바로 써도 됨

                                                             여기서 $result에는 SELECT * FROM member의 결과가 들어있음<td></td> 1행에 필드를 직접 입력해준다 (필드는 들여오지 않음)php <td></td> 레코드 형태로 넣어준다 - num은 사용자 변수 $row[필드명]으로 한 칸씩 사용 가능하다.한 번 읽을 때 한 줄은 변함없으나 사용하는건 한 칸씩 가능하다만약 한 줄을 쭈루룩 출력하고 싶으면 $row만 쓰면 됨

<table width="600" border="1" cellpadding="10">
	<tr align="center">
    	<td>번호</td>
        <td>아이디</td>
        <td>비밀번호</td>
        <td>이름</td>
        <td>이메일</td>
    </tr>
<?php
while($row=mysqli_fetch_array($result)){
	echo "
		<tr>
		<td>$num</td>
		<td>$row[id]</td>
		<td>$row[pwd]</td>
		<td>$row[name]</td>
		<td>$row[email]</td>
		</tr>
	";
    $num++;
}
mysqli_close($con);
?>
</table>

 

 


5주차 과제하면서 더 구체적으로 알게된 것들 (문법...)

1.

isset(변수) - 변수에 값이 있는지 검사

empty(변수) - 변수가 값이 없는지 검사

각각의 함수가 더 직관적일 때가 있다. & | 비트연산과 함께 쓰이기도

2.

딕셔너리 형태의 변수는 $record['id']처럼 키값을 작은따옴표로 감싸줘야한다(최신ver)

3.

html에서 php를 쓰려면 <?php ?>로 열고 닫아주면 되는데

php에서 html을 쓰려면 echo를 통하면 된다

(php에서 html 태그 열 수 없음)

 

echo를 통할 때는 문자열 형태로만 잘 찍히면 된다

 

"" 안에서 type="button"처럼 큰따옴표를 써야할 때는 \" (이스케이프문자)를 통해야한다

 

php echo에서 '''   ''' (작은따옴표3개) 사용할 수 없다

 

아톰에서 return은 아무 의미가 없으므로 보기 편하게 적어주는 것이 좋다.

echo "당신의 정보를 확인하세요! <br>
	login ID : {$record['id']} <br>
	login PW : {$record['pw']} <br>";

echo 의 "큰따옴표 내부"에서 변수를 적어줄 때 {$___} 대괄호 사용하면 더 명확해진다

ex) $record['id']로만 쓰면 $record까지만 인식될 수 있다.

// 따옴표 안이 아니면 적어주지 않는다!

 

+echo에서 문자열은 . (점)으로 이을 수 있다 →변수 쓸 때 앞의 문자열 "로 마무리짓고 온점으로 이어주기도 가능

echo "<a href='/...?board=".$row['num']."'>";

 

4.

query문을 전달할 때 변수를 넣고싶으면 각 필드의 형태를 잘 보자

특히 문자형일때

$sel_query="SELECT * FROM member WHERE id LIKE '{$_POST['id']}';";

$_POST['id'] 또는 {$_POST['id']} 도 오류난다

→추측하건대 일반문자열 검색할 때도 'idsearch'처럼 작은따옴표가 필수라서

query를 전달할 때도 작은따옴표를 함께 전달해줘야한다.

'{$_POST['id']}'

큰 따옴표 안에서 작은 따옴표는 \ 없이도 그냥 문자

(마찬가지로 작은 따옴표 안에서 큰 따옴표는 \ 없이도 그냥 문자)

 

5.

query문을 전달할 때 맨 마지막 세미콜론(;)을 꼭 "문자열"에 포함하고

php의 세미콜론(;)은 따로 찍어줘야 한다.

 

6. 

mysqli_fetch_array($쿼리전달후결과를담은변수); 

쿼리가 아닌 결과(mysqli_query()의 반환)를 넣어줘야함!!

 

7.

if(조건)

{Header('location: ______);}

if문과 함께 쓰여서 조건을 만족하면 다른 것 출력하지 않고 바로 해당 링크로 들어가게 함

(해석 후 출력이라(?) 앞에 출력문들이 있어도 무시하고 바로 리다이렉트 가능한듯?

또는 헤더 있는 부분만 먼저 읽어들이던가...)

+아래 안읽고 바로 이동함 (헤더에 포함시켜서...)

 

+

다이렉트로 연결하는거 안되면 변수에 넣어서 사용하면됨

(웹사이트 전체 전역변수 없냐...?)

$servername="localhost";
$username="root";
$password="toor123";
$database="webstudy";
$con=mysqli_connect($servername, $username, $password, $database)
     or die("Mysql Connect Error!");

 

+

중간에 DB권한문제 있다면서 뭐라하던데 걍 재설치하니까 해결됨

 

+session_destroy();도 session_start();해야 함

session은 해당 웹에서 공용이지만 코드 내에서 세션을 사용하려면 session_start()필요

 

?

궁금한 점

-> db연결 계속 해줘야함?

-> 전역변수 못씀?

 

 

 

 

 

 

 

 

 

 

Comments