PHP MySQL Database
PHP와 MySQL: 데이터베이스 연동하기
PHP와 MySQL은 웹 애플리케이션에서 데이터베이스와의 상호작용을 처리하는 가장 널리 사용되는 조합 중 하나입니다. PHP를 사용하면 MySQL과 쉽게 연결하고, 데이터를 CRUD(생성, 읽기, 수정, 삭제) 작업을 통해 다룰 수 있습니다. MySQL은 **관계형 데이터베이스 관리 시스템(RDBMS)**으로, 데이터를 테이블 형태로 저장하고 관리하는 데 매우 유용합니다.
이 가이드에서는 PHP와 MySQL의 연동, 데이터베이스 연결, SQL 쿼리 실행, CRUD 작업 및 보안적인 고려 사항에 대해 다룹니다.
1. PHP와 MySQL의 연동
PHP에서 MySQL과 연결하기 위해 사용되는 방법은 몇 가지가 있지만, MySQLi
(MySQL Improved)와
PDO(PHP Data Objects)가 가장 널리 사용됩니다. 두 방법 모두 MySQL 데이터베이스와의 안정적인 연결을 제공하지만,
PDO는 다양한 데이터베이스를 지원하는 장점이 있습니다.
2. MySQL 데이터베이스 연결
2.1 MySQLi
로 데이터베이스 연결
MySQLi는 MySQL 데이터베이스와의 상호작용을 처리하기 위한 향상된 확장 라이브러리입니다.
<?php
// MySQL 데이터베이스 연결 설정
$host = "localhost";
$username = "root";
$password = "";
$database = "my_database";
// 데이터베이스 연결
$conn = new mysqli($host, $username, $password, $database);
// 연결 상태 확인
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>
설명:
new mysqli()
: MySQLi 객체를 생성하여 데이터베이스에 연결합니다.$conn->connect_error
: 연결이 실패하면 오류 메시지를 출력하고 스크립트를 종료합니다.
2.2 PDO
로 데이터베이스 연결
PDO는 MySQL뿐만 아니라 다른 데이터베이스도 지원하는 범용적인 데이터베이스 연결 인터페이스입니다.
<?php
// 데이터베이스 연결 설정
$host = "localhost";
$dbname = "my_database";
$username = "root";
$password = "";
try {
// PDO 객체 생성 및 데이터베이스 연결
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
// 에러 모드 설정
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
?>
설명:
new PDO()
: PDO 객체를 생성하고 데이터베이스에 연결합니다.setAttribute()
: 에러 모드를 예외 처리 방식으로 설정합니다.try-catch
: 연결 중 문제가 발생하면 예외를 처리하고 오류 메시지를 출력합니다.
3. MySQL 데이터베이스에서 CRUD 작업
3.1 CREATE: 데이터 삽입
MySQL에 데이터를 삽입하는 방법입니다.
MySQLi 예제:
<?php
// MySQL 데이터베이스 연결 (MySQLi 방식)
$host = "localhost";
$username = "root";
$password = "";
$database = "my_database";
$conn = new mysqli($host, $username, $password, $database);
// 데이터 삽입 쿼리
$sql = "INSERT INTO users (username, email) VALUES ('JohnDoe', 'john@example.com')";
if ($conn->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
PDO 예제:
<?php
// 데이터베이스 연결 (PDO 방식)
$host = "localhost";
$dbname = "my_database";
$username = "root";
$password = "";
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 데이터 삽입 쿼리
$sql = "INSERT INTO users (username, email) VALUES (:username, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute(['username' => 'JaneDoe', 'email' => 'jane@example.com']);
echo "New record created successfully";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
설명:
- PDO에서
prepare()
와execute()
: SQL 인젝션 방지를 위해 파라미터화된 쿼리를 사용하여 데이터를 안전하게 삽입합니다.
3.2 READ: 데이터 조회
MySQL에서 데이터를 조회하는 방법입니다.
MySQLi 예제:
<?php
$conn = new mysqli("localhost", "root", "", "my_database");
// 데이터 조회 쿼리
$sql = "SELECT id, username, email FROM users";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 데이터 출력
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "0 results";
}
$conn->close();
?>
PDO 예제:
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=my_database", "root", "");
// 데이터 조회 쿼리
$stmt = $pdo->query("SELECT id, username, email FROM users");
// 데이터 출력
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "ID: " . $row['id'] . " - Username: " . $row['username'] . " - Email: " . $row['email'] . "<br>";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
설명:
$stmt->fetch(PDO::FETCH_ASSOC)
: PDO에서 데이터를 연관 배열로 반환하여 처리할 수 있습니다.
3.3 UPDATE: 데이터 수정
MySQL의 데이터를 수정하는 방법입니다.
MySQLi 예제:
<?php
$conn = new mysqli("localhost", "root", "", "my_database");
// 데이터 수정 쿼리
$sql = "UPDATE users SET email='newemail@example.com' WHERE username='JohnDoe'";
if ($conn->query($sql) === TRUE) {
echo "Record updated successfully";
} else {
echo "Error updating record: " . $conn->error;
}
$conn->close();
?>
PDO 예제:
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=my_database", "root", "");
// 데이터 수정 쿼리
$sql = "UPDATE users SET email=:email WHERE username=:username";
$stmt = $pdo->prepare($sql);
$stmt->execute(['email' => 'newemail@example.com', 'username' => 'JaneDoe']);
echo "Record updated successfully";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
설명:
- 파라미터화된 쿼리를 사용하여 보안 강화와 SQL 인젝션 방지를 구현합니다.
3.4 DELETE: 데이터 삭제
MySQL에서 데이터를 삭제하는 방법입니다.
MySQLi 예제:
<?php
$conn = new mysqli("localhost", "root", "", "my_database");
// 데이터 삭제 쿼리
$sql = "DELETE FROM users WHERE username='JohnDoe'";
if ($conn->query($sql) === TRUE) {
echo "Record deleted successfully";
} else {
echo "Error deleting record: " . $conn->error;
}
$conn->close();
?>
PDO 예제:
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=my_database", "root", "");
// 데이터 삭제 쿼리
$sql = "DELETE FROM users WHERE username=:username";
$stmt = $pdo->prepare($sql);
$stmt->execute(['username' => 'JaneDoe']);
echo "Record deleted successfully";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
설명:
- 삭제 쿼리를 사용하여 특정 조건을 만족하는 데이터를 삭제할 수 있습니다.
4. 보안 고려 사항: SQL 인젝션 방지
SQL 인젝션은 사용
자가 입력한 값이 직접 SQL 쿼리에 포함될 때 발생할 수 있는 보안 취약점입니다. 이를 방지하기 위해 파라미터화된 쿼리를 사용해야 합니다.
- MySQLi: **
prepare()
*와 **bind_param()
*을 사용하여 쿼리를 안전하게 작성합니다. - PDO: **
prepare()
*와 **execute()
*를 사용하여 입력 데이터를 바인딩합니다.
예시: PDO로 SQL 인젝션 방지
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=my_database", "root", "");
// 파라미터화된 쿼리로 안전하게 사용자 입력 처리
$sql = "SELECT * FROM users WHERE username = :username";
$stmt = $pdo->prepare($sql);
$stmt->execute(['username' => $_POST['username']]);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['username'] . " - " . $row['email'] . "<br>";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
설명:
- 사용자의 입력값이 직접 쿼리에 포함되지 않도록 파라미터화된 쿼리를 사용하여 SQL 인젝션을 방지합니다.
요약
PHP와 MySQL을 연동하면 데이터베이스와 상호작용하여 데이터를 저장, 조회, 수정,
삭제할 수 있습니다. PHP에서 **MySQLi
**와 **PDO
**를 사용해 MySQL 데이터베이스에 연결할 수 있으며,
파라미터화된 쿼리를 통해 보안성을 강화할 수 있습니다. PHP와 MySQL을 활용한 CRUD 작업은 웹 애플리케이션의 핵심
기능을 제공하며, 데이터베이스와의 상호작용을 효율적으로 처리할 수 있게 합니다.