시작 오늘 분석할 코드
PHP에서 MySQL 데이터베이스에 접속하는 가장 기본적인 방법이다. new mysqli()로 접속 객체를 만들고, 접속 에러를 확인하고, 작업이 끝나면 close()로 연결을 닫는 패턴이다.
$mysqli = new mysqli('localhost', 'root', '', 'sampledb'); // 인수: 호스트, DB사용자명, DB비밀번호, DB이름 if($mysqli->connect_error) { die('Connect Error:(' . $mysqli->connect_errno . ) ' . $mysqli->connect_error); } print 'mysqli 클래스를 통해 접속이 성공하였습니다.'; // DB 관련 처리를 여기에서 진행 $mysqli->close(); // 접속 종료
실제 출력 미리보기
mysqli 클래스를 통해 접속이 성공하였습니다.
→ connect_error가 없으면 if 블록을 건너뛰고 print 문장이 실행됨
접속 실패 시: Connect Error:(2002) Connection refused (에러번호와 메시지 출력 후 종료)
용어 핵심 용어 정리
mysqliPHP에서 MySQL을 다루는 클래스. MySQL Improved의 약자. MySQL 5.0+ 전용
new mysqli()mysqli 클래스의 객체를 생성하면서 동시에 DB 서버에 접속을 시도
connect_error접속 실패 시 에러 메시지 문자열. 성공 시 NULL. if 조건으로 에러 감지
connect_errno접속 실패 에러 번호(정수). connect_error와 쌍으로 출력해 원인 파악
die()인수로 받은 메시지를 출력하고 스크립트 실행을 즉시 종료. exit()와 동일
close()DB 접속을 명시적으로 종료. 해커 공격 대비 + 서버 자원 해제
localhostMySQL 서버가 같은 컴퓨터에 있음을 의미. XAMPP 로컬 개발 환경에서 기본값
DSNData Source Name. DB 접속 정보(호스트·DB명·포트 등)를 담은 문자열. PDO에서 사용
1 PHP와 MySQL — 두 서버가 연동하는 구조
Apache 서버와 MySQL 서버가 별개로 동작한다
XAMPP를 실행하면 Apache(PHP 실행) 서버와 MySQL(데이터 저장) 서버가 별개로 동작한다. PHP 코드는 Apache를 통해 실행되고, MySQL 데이터는 별도의 MySQL 서버에서 관리된다. new mysqli()는 이 두 서버를 연결하는 다리 역할이다. 실제 서비스에서는 두 서버가 다른 컴퓨터(IP)에 있는 경우도 많다.
사용자 브라우저
→
Apache + PHP
dbtest2.php 실행
→
new mysqli()
→
MySQL 서버
sampledb
※ XAMPP에서는 두 서버가 같은 컴퓨터에 있어 localhost로 접속하지만, 운영 환경에서는 DB 서버 IP가 다르다.
2 new mysqli() — 생성자 인수 4개
인수 순서와 각 인수의 의미
new mysqli(호스트, 사용자명, 비밀번호, DB이름)의 순서는 고정이다. XAMPP 기본 설정에서는 root 비밀번호가 없어 세 번째 인수가 빈 문자열이다. 운영 환경에서는 반드시 비밀번호를 설정해야 한다.
$mysqli = new mysqli( 'localhost', // 1. 호스트: MySQL 서버 주소 'root', // 2. 사용자명: MySQL 계정 '', // 3. 비밀번호: XAMPP 기본은 빈 문자열 'sampledb' // 4. DB 이름: USE sampledb와 동일 );
| 인수 |
XAMPP 기본값 |
의미 |
| 호스트 |
localhost |
같은 컴퓨터의 MySQL 서버. 127.0.0.1과 동일 |
| 사용자명 |
root |
MySQL 최고 권한 계정. 운영 환경에서는 전용 계정 사용 |
| 비밀번호 |
'' (빈 문자열) |
XAMPP 초기 설정. 운영 환경에서는 강력한 비밀번호 필수 |
| DB 이름 |
sampledb |
접속할 데이터베이스 이름. CMD에서 USE sampledb와 동일 |
3 connect_error — 에러 감지와 die()
접속 실패 시 즉시 종료하는 방어 코드
DB 접속에 실패했는데 이후 코드가 계속 실행되면 더 큰 오류가 발생한다. connect_error로 실패를 감지하고, die()로 즉시 메시지를 출력하고 종료하는 것이 표준 패턴이다. 에러 번호(connect_errno)와 메시지(connect_error)를 함께 출력하면 원인을 파악하기 쉽다.
if($mysqli->connect_error) { die('Connect Error:(' . $mysqli->connect_errno // 에러 번호 (예: 2002) . ') ' . $mysqli->connect_error // 에러 메시지 (예: Connection refused) ); } // 접속 성공 시 이 if 블록은 실행되지 않고 건너뜀
접속 실패 시
connect_error = "Connection refused"
die() 실행 → 에러 메시지 출력
스크립트 즉시 종료
이후 코드 실행 없음
접속 성공 시
connect_error = NULL
if 조건 = false → 블록 건너뜀
print 메시지 출력
DB 작업 진행
4 close() — 접속 종료가 필요한 이유
보안과 서버 자원 해제
DB 접속은 스크립트 종료 시 자동으로 끊어지지만, close()를 명시적으로 호출하면 보안과 자원 측면에서 유리하다. 오래된 접속이 열려 있으면 해커의 공격 표면이 되고, 서버 리소스도 낭비된다. DB 작업이 모두 끝난 즉시 close()를 호출하는 것이 좋은 습관이다.
// DB 작업 완료 후 $mysqli->close(); // 명시적 접속 종료 권장
※ PHP 스크립트가 종료되면 DB 접속도 자동으로 끊어지지만, 명시적 close()를 작성하면 코드 의도가 명확해지고 접속 유지 시간을 최소화할 수 있다.
5 mysqli 쿼리 실행과 결과 읽기
접속 후 query()와 fetch_assoc()으로 데이터 꺼내기
접속에 성공했다면 $mysqli->query()로 SQL을 실행하고, 결과를 fetch_assoc()으로 행(row)씩 꺼낸다. mysqli에서 SELECT 결과를 다루는 기본 패턴이다.
$result = $mysqli->query("SELECT * FROM member"); // query()가 SELECT 결과 집합을 반환 while($row = $result->fetch_assoc()) { // fetch_assoc()은 행 하나를 연관배열로 반환. 더 없으면 null echo $row['id'] . ' ' . $row['last_name'] . ' ' . $row['first_name'] . "<br>"; } $result->free(); // 결과셋 메모리 해제 $mysqli->close(); // DB 접속 종료
1 ko gildong
2 park heedong
3 go younghee
4 go chulsoo
5 park jungja
→ while 루프가 fetch_assoc()으로 행을 하나씩 꺼내 출력. null이 반환되면 루프 종료
fetch_assoc()은 컬럼명을 키로 사용하는 연관배열을 반환한다. $row['id'], $row['last_name'] 처럼 컬럼명으로 값에 접근한다.
6 결과 행 수 확인 — num_rows
SELECT 결과가 몇 개인지 확인하는 방법
query() 실행 후 결과 집합에서 행이 몇 개인지 확인할 때 num_rows 프로퍼티를 사용한다. 로그인 처리 같은 경우에 id/pw 조합으로 검색한 결과가 1개 이상인지 확인하는 데 유용하다.
$result = $mysqli->query("SELECT * FROM member WHERE last_name = 'go'"); echo $result->num_rows . '개의 결과'; // 2개의 결과 (younghee, chulsoo) if($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo $row['first_name'] . '<br>'; } } else { echo '결과 없음'; }
num_rows는 SELECT 결과에서만 의미 있다. INSERT/UPDATE/DELETE는 $mysqli->affected_rows로 영향받은 행 수를 확인한다.
7 마지막 INSERT id 확인 — insert_id
방금 삽입한 레코드의 AUTO_INCREMENT id 확인
INSERT 후 $mysqli->insert_id를 읽으면 방금 삽입된 레코드에 AUTO_INCREMENT로 부여된 id 값을 가져올 수 있다. 회원 가입 후 생성된 user_id를 즉시 활용하거나 관련 테이블에 연관 데이터를 넣을 때 사용한다.
$mysqli->query("INSERT INTO member (last_name, first_name, age) VALUES ('Kim', 'Minjun', 25)"); echo '새로 삽입된 id: ' . $mysqli->insert_id; // 예: 6 echo '영향받은 행 수: ' . $mysqli->affected_rows; // 1
insert_id는 INSERT 직후에만 유효하다. 다른 INSERT가 실행되면 덮어쓰인다. INSERT 직후 바로 읽어야 한다.
8 mysqli 주요 프로퍼티·메서드 레퍼런스
$mysqli 객체에서 자주 쓰는 멤버 목록
| 프로퍼티·메서드 |
의미 |
반환값 |
$mysqli->connect_error |
접속 에러 메시지 |
문자열 또는 null |
$mysqli->connect_errno |
접속 에러 번호 |
정수 |
$mysqli->query($sql) |
SQL 실행 (SELECT/INSERT 등) |
결과셋 또는 true/false |
$mysqli->insert_id |
마지막 INSERT의 AUTO_INCREMENT id |
정수 |
$mysqli->affected_rows |
영향받은 행 수 (INSERT/UPDATE/DELETE) |
정수 |
$result->num_rows |
SELECT 결과 행 수 |
정수 |
$result->fetch_assoc() |
결과셋에서 행 하나를 연관배열로 |
배열 또는 null |
$mysqli->close() |
DB 접속 종료 |
bool |
9 mysqli vs PDO — 선택 기준
두 방식의 차이와 현대적 선택
| 항목 |
mysqli |
PDO |
| 지원 DB |
MySQL/MariaDB 전용 |
12개 이상 DB 지원 (MySQL, SQLite, PostgreSQL 등) |
| 에러 처리 |
connect_error 프로퍼티 체크 |
try/catch + PDOException |
| prepared statement |
가능 (별도 문법) |
가능 (더 깔끔한 문법) |
| DB 이식성 |
낮음 (MySQL 전용) |
높음 (DB 교체 시 DSN만 변경) |
| 현대적 추천 |
MySQL 전용 프로젝트 |
일반 웹 프로젝트 권장 |
6 자주 하는 실수
| 실수 |
증상 |
해결 |
| XAMPP MySQL 서비스 미시작 |
Connect Error:(2002) Connection refused |
XAMPP Control Panel에서 MySQL Start 클릭 후 재실행 |
| DB 이름 오타 (sampledb → sampleDB) |
Connect Error:(1049) Unknown database |
대소문자 주의. MySQL DB 이름은 OS에 따라 대소문자 구분 |
| connect_error 체크 없이 바로 쿼리 |
접속 실패 후 후속 오류 연쇄 발생 |
new mysqli() 직후 반드시 connect_error 체크 |
| close() 누락 |
기능상 문제는 없으나 자원 낭비 |
DB 작업 완료 후 $mysqli->close() 호출 |
| root 계정을 운영 환경에서 사용 |
보안 취약점 — 전체 DB 권한 노출 |
운영 환경에서는 최소 권한 전용 계정 생성 후 사용 |
핵심 한 줄 요약
new mysqli(host, user, pw, db)4개 인수로 MySQL 접속 객체 생성 — 생성과 동시에 접속 시도
connect_error + die()접속 실패 감지 → 에러 번호·메시지 출력 후 즉시 종료
$mysqli->close()DB 작업 완료 후 명시적 접속 종료 — 보안 + 자원 해제
query() + fetch_assoc()SELECT 실행 → while 루프로 행 꺼내기 — 더 없으면 null 반환
num_rows / insert_idSELECT 결과 행 수 / INSERT 후 생성된 AUTO_INCREMENT id
mysqli vs PDOmysqli는 MySQL 전용, PDO는 다중 DB 지원 — 현대 프로젝트는 PDO 권장
affected_rowsINSERT/UPDATE/DELETE 후 영향받은 행 수 — SELECT에는 num_rows 사용
Tags
#PHP mysqli #MySQL PHP 연동 #new mysqli #connect_error #die 함수 #PHP DB 접속 #mysqli close #PHP 서버 연동 #PHP MySQL #connect_errno #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP mysqli, MySQL PHP 연동, new mysqli, connect_error, die 함수, PHP DB 접속, mysqli close, PHP 서버 연동, PHP MySQL, connect_errno
댓글