MY MEMO

[PHP] MYSQL 연동 본문

STUDYING/WEB

[PHP] MYSQL 연동

l_j_yeon 2017. 4. 20. 03:20

강의 생활코딩 : https://opentutorials.org/course/1


+) 

Bitnami로 Mysql 실행하기


cd C:\Download\Bitnami\wampstack-7.0.12-0\mysql\bin



+) C:\Download\Bitnami\wampstack-7.0.12-0\apache2\logs

에 들어가면 error.log로 에러를 찾을 수 있으니 참고!


+) GET과 POST의 차이?


GET은 주소줄에 값이 ?뒤에 쌍으로 이어붙고 POST는 숨겨져서(body안에) 보내진다.

GET은 URL에 이어붙기 때문에 길이제한이 있어서 많은양의 데이터는 보내기 어렵고 POST는 많은 양의 보내기에도 적합하다.(역시 용량제한은 있지만)

즉 http://url/bbslist.html?id=5&pagenum=2 같이 하는 것이 GET방식이고 form을 이용해서 submit을 하는 형태가 POST입니다.

참고 : https://blog.outsider.ne.kr/312


+) sql문이 php로 잘 코딩되었는지 확인할때?

따로 php 파일을 만들어서 로드시켜본다 -> 따옴표 등을 출력해보면서 명령어가 무엇이 잘못되었는지 알 수있음

copy&paste를 해서 DB에 직접 돌려보는 것도 괜찮음!


일단 지금 실행할 코드에서는 table이 이렇게 형성되어있다.



index.php에 추가된 코드이다.



위의 코드를 보면

첫번째 줄은 localhost즉 ip를 입력하고 root 사용자는 root이며 111111은 비밀번호이다.

위와같이 mysql에 접속한후

mysql에서 opentutorials라는 db에 연결한다.

이후 select*from topic 여기서 topic은 테이블 이름인데 즉 테이블에 있는 모든 내용을 내놔 라는 쿼리를 실행한후

$result라는 변수에 담는다.



result가 없을때 까지 while문이 돌아가는 코드인데 이 코드는 앞에서의 list.txt의 코드를 간락하게 만든것이다.

<a href="주소"></a>를 php로 변경한 코드인데 보면 echo로 출력하고 있다.

list형태로 출력하고 있으며 주소값이id의 값만 변경되는 것을 착안하여 db에 있는 모든 id가 있는 리스트를 가지고 오는 것이다.

이후 db의 id에 맞는 title을 출력시켜주고 echo문을 끝낸다.

이 구문을 매우 잘 보아야 하는데 보면 '와" 그리고 .이 아주 복잡하게 들어간다. 이중 하나라도 순서가 다르거나 문법에 맞지않으면 바로 오류이고 이것이 실제로 코딩하는데에도 골치아픈일 중 하나였다.



만약 내가 위에 있는 주소 중 하나를 클릭하였다. 그렇다면 이 article부분에서 GET을 한다. 즉 주소로 날아온 id값을 받는 다는 뜻이다. 그럼 이 코드는 id값을 받고 그 id에 맞는 DB의 내용을 출력해준다.

if문은 왜 구현하였나면 id값이 오지 않을 수 도 있기 때문에 empty가 아니라면 실행시켜준다는 의미이다.

그렇다면 우리는 받은 id값을 직접 DB에 돌려봐야한다. 따라서 우리는 sql문을 만들고 위에서 연결시켜준 데이터베이스에 query를 실행시킨다. 이후 mysqli_fech_assoc를 실행시켜준다.


+) mysql_fetch_assoc(resource)

- 리턴값 : 배열

- 인덱스배열을 빼고, 이름을 지닌 배열을 리턴한다.

- row[name] 이런식

  http://e2xist.tistory.com/415


+) mysqli는 php에 내장되어있는 api이다.

+) 왜 assoc인지는 아래의 그림에 잘 나와있다. (mysql_fetch_assoc은 배열을 return하기 때문이)



연관배열이다. 연관배열은 어떠한 값에 이름을 주는 것이라고 한다. 숫자 이외에도 문자를 배열의 인덱스로 사용할 수 있다. 연관배열을 영어로 나타내면 associative array라고 하는데 여기서 assoc을 따서 만든 함수라고 한다.


이제 이 결과값을 출력해주면 된다.


write.php에 생성된 코드이다.



html코드를 추가하는 법을 잘 몰라서

<input type="submit" name="name">
</form>
</article>
</body>
</html>
이 부분이 잘리고 위처럼 귀엽게 제출이라는 버튼이 나왔다.
여기는 내가 글을 쓰고 추가할 수 있도록 만들어 놓은 것이다.
여기서 글을 작성하고 제출이라는 버튼을 누르면 자동으로 DB에 저장이 된다.
어떻게 그렇게 구현했을까? 바로 form부분을 자세히 살펴보면 답을 찾을 수 있다.
우리는 submit버튼을 누르면 process.php파일을 실행시킬 것이고 method는 post로 주겠습니다. 라는 뜻인데
GET과 POST의 역할은 같다. 하지만 왜 여기서 POST를 썼을까? 그 답은 맨 위 추가로 수정한 내용에서 찾을 수 있다.
그리고 iput에 name도 눈여겨 봐야한다. 제목은 title 작성자는 author 본문은 description이라는 이름으로 코딩되어있다
이제 input submit즉 제출이라는 버튼을 누르면 우리는 process.php 파일로 가게된다.

process.php



여기서 우리는 데이터베이스를 다시 연결시켜준다. 이는 위에서와 같으니 위 두줄 코드의 설명은 생략한다.

하지만 쿼리부터 코드가 달라진다. insert를 하는 쿼리인데 받아온 title, author,description을 DB에 삽입하는 코드이다.


여기서도 '".가 매우 복잡하게 나열되어있는데 한번 살펴보자.

"INSERT INTO topic (title,description,author,created) VALUES('".$_POST['title']."', '".$_POST['description']."', '".$_POST['author']."', now())"


DB에 삽입하는 쿼리에서는 INSERT into table_name values ('내용','내용',...)

이러한 문법으로 삽입한다. 따라서 위도 같다. VALUES(뒤에 '가 있다 여기까지가 DB에서 나타나는 문장이다.

즉 VALUES(까지 CLI에 입력하였다고 생각하면 편하다 따라서 우리는

INSERT INTO topic (title,description,author,created) VALUES('여기까지 Command line에 입력하였다. 그러면 이제 POST해온 내용을 삽입할 차례이다.


.$_POST['title'].로 입력해준다. 만약 이렇게 입력해주었다면 우리는 cmd에

INSERT INTO topic (title,description,author,created) VALUES('title내용 까지 입력한것이다.

이후 다시 "'가 나온다 즉 다시 cmd에 입력이 시작된다.


그럼

"INSERT INTO topic (title,description,author,created) VALUES('".$_POST['title']."', '"


결국 이 코드는 command창에서

INSERT INTO topic (title,description,author,created) VALUES('title내용',

까지 입력한 셈이 된다. 이처럼 계속 코드를 해석해나아가면 완벽한 쿼리가 완성된다.


이 쿼리로 인하여 우리는 DB에 내용을 삽입했다.

그리고 header함수를 통해 바로 index.php의 창을 띄워준다.


자 이 모든 코드를 이해했다면 DB에서 한개의 데이터가 더 삽입됬을 시 DB이외에 변화하는 것이 하나 더 있을 것이다.

바로 index.php 옆의 list이다. 


list의 코드는 db에 있는 모든 값을 불러와 title을 출력해준다.(주소에는 id의 값이 있어 결국 내용은 id로 구분한다.)


따라서 list가 한 개 더 추가되었을 것이다.


+)ID값은 추가하지 않아도 되나요?


 Table을 생성하는 쿼리를 보면 ID가 auto-increment이다 즉 자동으로 +1이 되면서 추가될때마다 id값을 올려준다

 따라서 id를 추가하지 않아도 자동으로 생성된다.


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
<?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>
<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 * FROM topic WHERE id='.$_GET['id'];
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
echo '<h2>'.$row['title'].'</h2>';
echo $row['description'];
}
?>
</article>
</body>
</html>



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">
<link rel="stylesheet" type="text/css" href="http://localhost/style.css">
</head>
<body id="target">
<header>
<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>
<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>


process.php 

1
2
3
4
5
6
7
<?php
$conn = mysqli_connect("localhost", "root", 111111);
mysqli_select_db($conn, "opentutorials");
$sql = "INSERT INTO topic (title,description,author,created) VALUES('".$_POST['title']."', '".$_POST['description']."', '".$_POST['author']."', now())";
$result = mysqli_query($conn, $sql);
header('Location: http://localhost/index.php');
?>


style.css

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
body.white{
background-color:white;
color:black;
}
body.black{
background-color:black;
color:white;
}
header{
border-bottom:1px solid gray;
padding:20px;
}
nav {
border-right:1px solid gray;
width:200px;
height:600px;
float:left;
}
nav ol{
list-style:none;
padding:0;
}
article{
float:left;
padding:20px;
width:500px;
}
#control{
float:right;
}
header img{
float:right;
height:100px;
}


Comments