-
php와 mariaDB(xampp, mysql)백엔드 2023. 5. 27. 20:22
보편적으로 많이 사용되는 웹서버로는 Apache, lls, Nginx(<-springboot, Django 등에서 사용)가 있다.
PHP는 웹 상에서 서버를 연동해서 실행하는 대표적 스크립트 언어로, 함수를 통해 데이터베이스와의 연동이 편리하다.
거의 모든 os에서 작동 가능하며, DBMS 연결을 지원한다.
(자바스크립트는 클라이이언트 측 스크립트이다.)
1. XAMPP 설치
https://www.apachefriends.org/
2. XAMPP 에서 Apache와 mysql start
(cf. mysql도 깔려 있어야 한다.)
이때,
Port 3306 in use by "Unable to open process"!
위와 같은 에러가 뜬다면 mysql의 Config > my.ini에서
port를 3308로 열어준다. (mysql의 default port number는 3306이다.)
3. 아파치 웹 서버 동작 확인
브라우저에 http://localhost를 쳐서 xampp 창이 나온다면, 서버가 잘 띄워진 것이다.
4. MariaDB 연동
오른쪽 칸의 Shell로 들어간다.
여기서 기본적으로
mysql - u root -p
를 입력한다. 패스워드는 없다. (그냥 엔터치면 된다.)
5. MariaDB 회원가입 및 권한 부여
GRANT ALL PRIVILEGES ON *.* TO 'web'@'%' IDENTIFIED BY 'web_pwd';
를 치면 모든 port에 대해 web_pwd이라는 비밀번호로 모든 권한이 부여된다.
이제 ctrl+c로 현재 DB를 종료하고,
mysql -u web -p
로 다시 로그인한다. 패스워드는 web_pwd 이다.
6. php 연동 확인
localhost/phpmyadmin 으로 들어갔을 때,
이런 창이 나오면 성공이다.
근데, 나는 안나왔다. 그 이유를 찾아봤다.
XAMPP에서 아파치 서버가 MYSQL을 열고, MYSQL에서 MariaDB를 연동해두었는데,
그럼 MYSQL의 Root workbench
의 비밀번호를 설정해뒀기 때문이었다.
Apache의 config.inc로 들어가 mysql의 password를 공백으로 두지않고 비밀번호를 써준다.
7. MariaDB에 테이블 생성 및 데이터 셋 삽입
create database "Doctor"; show databases; use Doctor; CREATE TABLE Doctor ( doctor_id INT NOT NULL, major_treat VARCHAR(25) NOT NULL, doctor_name VARCHAR(20) NOT NULL, doctor_gen CHAR(1) NOT NULL, doctor_phone VARCHAR(15) NOT NULL, doctor_email VARCHAR(50) UNIQUE, doctor_position VARCHAR(20), PRIMARY KEY (doctor_id) ); INSERT INTO DOCTOR VALUES(0001, '가정의학과', '김미경', 'F', '010-1111-0001', 'kmk01@gmail.com', '과장');
을 차례대로 입력해준다.
8. MariaDB의 한글 패치
처음에 위 코드대로 쓰면,
이렇게 뜬다.
다시 mysql의 my.ini로 가서
# The MySQL server의 default-character-set=euckr로 바꿔준다.
그리고 shell창에
show create database Doctor; alter database Doctor; -> character set euckr -> collate euckr_korean_ci;
를 입력해 문자형을 euckr로 바꿔준다.
기존의 데이터 셋을 삭제하고 다시 데이터셋을 삽입한다.
그러면,
이렇게 잘 뜨는 것을 확인해볼 수 있다.
9. PHP파일과 mariaDB의 연동
아무 편집 스튜디오에서 name.php 파일을 생성해준다.
<html> <head><meta http - equiv = "Content-Type" content = "text/html; charset=utf-8"> <title>Doctor</title></head> <body> practice 잉 <?php $conn = mysqli_connect("localhost", "web", "web_admin", "Doctor","3308"); if(!$conn){ echo "Database connect error!";} else{ echo "Database connect success~";} if(mysqli_connect_errno()){ echo "Could not connect:".mysqli_connect_error(); } $query="SELECT doctor_id, major_treat, doctor_name, doctor_gen, doctor_phone, doctor_email, doctor_position FROM Doctor"; $result=mysqli_query($conn,$query); ?> <TABLE BORDER=1> <TR> <TD>doctor_id</TD> <TD>major_treat</TD> <TD>doctor_name</TD> <TD>doctor_gen</TD> <TD>doctor_phone</TD> <TD>doctor_email</TD> <TD>doctor_position</TD> </TR> <?php while($row=mysqli_fetch_array($result)){ ?> <TR> <TD><?=$row['doctor_id']?></TD> <TD><?=$row['major_treat']?></TD> <TD><?=$row['doctor_name']?></TD> <TD><?=$row['doctor_gen']?></TD> <TD><?=$row['doctor_phone']?></TD> <TD><?=$row['doctor_email']?></TD> <TD><?=$row['doctor_position']?></TD> </TR> <?php } ?> </TABLE> </FORM> <?php mysqli_free_result($result); mysqli_close($conn); ?> </body> </html>
그리고 해당 코드를 삽입한다. 아까 말했듯 php는 함수사용만으로 디비연결이 가능하다.(겁내 쉽군...)
여기서 연결할 때, mysql port를 3308로 열어놔서 mysqli_connect에 써줘야 한다.
걍 mysqli_어쩌고만 해주면 연동이 되는 것이다.
이걸 저장할 때 인코딩 형식을 utf8로 안하면 localhost창에 ??$이런식으로 안뜨니까, 잘 설정하시길.
해당 파일을
의 xampp hrdocs folder에 삽입해준다.
이제 localhost를 다시 열어보면!
이렇게 잘 뜬다. 참고로 localhost/name.php로 열어야 "연결없음" 창이 안 뜬다.
- 후기
한글 패치가 안돼서 화날뻔 했다. 특히 인코딩하는 걸 몰라서 ㅎ
아파치의 cofig 파일 뜯어보았다.
$cfg['Servers'][$i]['host'] = '127.0.0.1';
로컬호스트를 서버에서 이렇게 설정해주는 거였구나...
$cfg['Servers'][$i]['connect_type'] = 'tcp';
udp말고 tcp를 쓴다..! 정통공에서 배운 개념이랑 연결된다. tcp는 udp에 비해 속도는 느리지만, 신뢰성이 보장된다.
Listen 80
아파치 서버가 기본적으로 받아들이는 포트는 80이었다. 80은 http port이다.
http는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜이다.
저번에 백엔드 작업할 때는 443을 추가해줬는데 이는 https로 http에 security를 추가해준 것이다.
그럼 궁금한 것!! 백엔드는 ec2로 배포할 때 Listen,로드밸런서,타켓그룹 등 port에 대한 처리를 다 하고 프론트로 넘긴다. 프론트는 해당 설정이 다 되어있는 도메인 주소를 받아 백엔드와 연결작업을 한다. 그럼 아파치와 연동하기 위해서 쓴 php파일은 서버측 스크립트이니, 프론트와 같은 역할을 한 것인가? 다만 백엔드에서 했던 port연결을 이번 과제에서는 처리를 당연히 안해줬으니, mysqlport를 3308로 직접 써줘야했던 건가...?
'백엔드' 카테고리의 다른 글
[Spring Boot] Spring Security와 JWT를 이용한 OAuth2 로그인(카카오, 백엔드, 프론트의 흐름) (1) 2023.06.27 [Django] JWT TOKEN(access token, refresh token, crfs, cors error) (0) 2023.05.04 Modeling(데이터베이스 모델링) (0) 2023.04.02 [Git] 커밋 기록 삭제 및 복구 (0) 2023.03.26 django ch1 - ch4 (0) 2023.03.22