고급 PHP 프로그래밍 – 데이터베이스 프로그래밍 – 1 – SQL 쿼리 실행

고급 PHP 프로그래밍 - 데이터베이스 프로그래밍 - 1 - SQL 쿼리 실행
고급 PHP 프로그래밍 – 데이터베이스 프로그래밍 – 1 – SQL 쿼리 실행

고급 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을 사용해 데이터를 삽입하고 조회하는
가장 핵심적인 기능들을 익히셨어요!

이 부분은 정말 웹 개발에서 핵심 중의 핵심 기능이기 때문에,
반복해서 연습하고 익숙해지면 복잡한 게시판, 로그인 시스템, 쇼핑몰까지도 손쉽게 구현할 수 있어요!

다음 시간에는 트랜잭션 처리와 오류 제어 등 더 깊은 데이터베이스 제어 기법도 함께 배워볼게요.
오늘도 단단하게 쌓아올린 실력, 축하드립니다! 💪💻✨

답글 남기기