
고급 PHP 프로그래밍 – 데이터베이스 프로그래밍 – SQL 쿼리 실행
안녕하세요! 😊
이전 시간에는 PHP에서 MySQL과 연결하는 방법을 배웠죠?
이번에는 그 연결을 바탕으로 SQL 쿼리를 실행해서 데이터를 조작하는 방법을 자세히 배워볼게요!
SQL은 데이터베이스에 명령을 내리는 ‘언어’입니다.
마치 데이터에게 “이걸 저장해줘!”, “저 정보 좀 꺼내줘!”, “이거 삭제해줘!”라고 명령하는 느낌이에요 😊
그리고 PHP는 그 명령어를 전달하고 결과를 받아오는 중간 다리 역할을 하게 되죠!
1. SQL이란?
SQL(Structured Query Language)은 데이터베이스와 대화하는 언어입니다.
✅ 주요 SQL 명령어
명령어 | 기능 |
---|---|
SELECT |
데이터 조회 |
INSERT |
데이터 삽입 |
UPDATE |
데이터 수정 |
DELETE |
데이터 삭제 |
CREATE |
테이블 생성 |
DROP |
테이블 삭제 |
2. PHP에서 SQL 쿼리 실행: mysqli_query()
mysqli_query(연결객체, "SQL문");
또는 객체형:
$conn->query("SQL문");
3. INSERT 쿼리 실행
🧪 예제 1: 데이터 삽입
$conn = mysqli_connect("localhost", "root", "1234", "test_db");
$sql = "INSERT INTO users (username, email) VALUES ('홍길동', 'hong@example.com')";
if (mysqli_query($conn, $sql)) {
echo "✅ 데이터 삽입 성공!";
} else {
echo "❌ 오류: " . mysqli_error($conn);
}
4. SELECT 쿼리 실행 및 결과 처리
🧪 예제 2: 데이터 조회
$sql = "SELECT * FROM users";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
echo "👤 이름: " . $row["username"] . ", 이메일: " . $row["email"] . "<br>";
}
} else {
echo "데이터가 없습니다.";
}
📌 주요 함수
함수 | 설명 |
---|---|
mysqli_num_rows() |
결과 행의 개수 |
mysqli_fetch_assoc() |
결과 행을 연관 배열로 반환 |
mysqli_fetch_row() |
결과 행을 숫자 인덱스 배열로 반환 |
mysqli_fetch_array() |
연관+숫자 인덱스 모두 포함된 배열 반환 |
5. UPDATE 쿼리 실행
🧪 예제 3: 데이터 수정
$sql = "UPDATE users SET email = 'gil@example.com' WHERE username = '홍길동'";
if (mysqli_query($conn, $sql)) {
echo "✏️ 수정 완료!";
} else {
echo "❗ 수정 중 오류 발생";
}
6. DELETE 쿼리 실행
🧪 예제 4: 데이터 삭제
$sql = "DELETE FROM users WHERE username = '홍길동'";
if (mysqli_query($conn, $sql)) {
echo "🗑️ 삭제 완료!";
}
7. 쿼리 실행 후 자동 증가된 ID 가져오기
🧪 예제 5: mysqli_insert_id()
$sql = "INSERT INTO users (username, email) VALUES ('이몽룡', 'lee@example.com')";
if (mysqli_query($conn, $sql)) {
$last_id = mysqli_insert_id($conn);
echo "🆔 새로 삽입된 ID: " . $last_id;
}
8. 보안: SQL 인젝션 주의!
직접 사용자 입력을 SQL에 넣으면 SQL Injection 공격에 취약합니다.
예:
$sql = "SELECT * FROM users WHERE username = '" . $_GET['name'] . "'";
사용자가 ' OR 1=1 --
같은 값을 입력하면 모든 사용자 정보가 노출될 수 있어요! 😱
9. 보안 강화: Prepared Statement 사용
🧪 예제 6: prepare()
+ bind_param()
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$username = $_GET['name'];
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "🔍 사용자: " . $row["username"] . "<br>";
}
메서드 | 설명 |
---|---|
prepare() |
SQL 문 미리 준비 |
bind_param("s", $var) |
s: 문자열 / i: 정수 |
execute() |
실행 |
get_result() |
결과 가져오기 |
✅ 이렇게 하면 입력값이 자동으로 이스케이프 처리돼 SQL Injection 방지가 가능해요!
🔍 자주 사용하는 mysqli 함수 정리
함수 | 설명 |
---|---|
mysqli_query() |
SQL 실행 |
mysqli_fetch_assoc() |
결과 행을 연관 배열로 반환 |
mysqli_num_rows() |
결과 개수 확인 |
mysqli_insert_id() |
마지막 삽입된 ID 가져오기 |
mysqli_error() |
오류 메시지 확인 |
prepare() |
SQL 준비 |
bind_param() |
변수 바인딩 |
get_result() |
실행 결과 반환 |
❗ SQL 쿼리 실행 시 주의사항
항목 | 설명 |
---|---|
문자셋 확인 | mysqli_set_charset($conn, "utf8") 설정 권장 |
보안 | 사용자 입력값은 반드시 prepare() 로 처리 |
쿼리 실패시 로그 | mysqli_error() 로 원인 파악 |
결과 행 수 체크 | mysqli_num_rows() 필수 |
리소스 해제 | mysqli_free_result() 또는 $stmt->close() 등으로 메모리 정리 |
마무리하며 😊
이제 여러분은 PHP에서 MySQL과 연결하고, SQL을 사용해 데이터를 삽입하고 조회하는
가장 핵심적인 기능들을 익히셨어요!
이 부분은 정말 웹 개발에서 핵심 중의 핵심 기능이기 때문에,
반복해서 연습하고 익숙해지면 복잡한 게시판, 로그인 시스템, 쇼핑몰까지도 손쉽게 구현할 수 있어요!
다음 시간에는 트랜잭션 처리와 오류 제어 등 더 깊은 데이터베이스 제어 기법도 함께 배워볼게요.
오늘도 단단하게 쌓아올린 실력, 축하드립니다! 💪💻✨