11. PHP와 MySQL 연동 (PHP and MySQL Integration)
MySQLi 확장 (MySQLi Extension)
MySQLi는 MySQL 데이터베이스에 PHP에서 접근하기 위한 확장 라이브러리입니다. 객체지향적 방식과 절차적 방식 두 가지 방법을 지원합니다.
데이터베이스 연결 (Connecting to the Database)
MySQLi를 사용하여 MySQL 데이터베이스에 연결하는 방법입니다.
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "mydatabase"; // MySQLi 객체 생성 및 연결 $conn = new mysqli($servername, $username, $password, $dbname); // 연결 확인 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } else { echo "Connected successfully"; } ?>
데이터 삽입, 조회, 수정, 삭제 (Inserting, Retrieving, Updating, and Deleting Data)
MySQLi를 사용하여 데이터를 삽입, 조회, 수정, 삭제하는 방법입니다.
<?php // 데이터 삽입 (INSERT) $sql = "INSERT INTO users (username, password, email) VALUES ('john_doe', 'password123', 'john.doe@example.com')"; if ($conn->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } // 데이터 조회 (SELECT) $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"]. " - Name: " . $row["username"]. " - Email: " . $row["email"]. "<br>"; } } else { echo "0 results"; } // 데이터 수정 (UPDATE) $sql = "UPDATE users SET email='new_email@example.com' WHERE username='john_doe'"; if ($conn->query($sql) === TRUE) { echo "Record updated successfully"; } else { echo "Error updating record: " . $conn->error; } // 데이터 삭제 (DELETE) $sql = "DELETE FROM users WHERE id=1"; if ($conn->query($sql) === TRUE) { echo "Record deleted successfully"; } else { echo "Error deleting record: " . $conn->error; } ?>
PDO (PHP Data Objects)
PDO는 PHP에서 여러 종류의 데이터베이스에 접근할 수 있는 유연하고 효율적인 인터페이스를 제공하는 데이터베이스 추상화 계층입니다.
데이터베이스 연결 (Connecting to the Database)
PDO를 사용하여 MySQL 데이터베이스에 연결하는 방법입니다.
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "mydatabase"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Connected successfully"; } catch(PDOException $e) { echo "Connection failed: " . $e->getMessage(); } ?>
데이터 삽입, 조회, 수정, 삭제 (Inserting, Retrieving, Updating, and Deleting Data)
PDO를 사용하여 데이터를 삽입, 조회, 수정, 삭제하는 방법입니다.
<?php // 데이터 삽입 (INSERT) $sql = "INSERT INTO users (username, password, email) VALUES ('john_doe', 'password123', 'john.doe@example.com')"; if ($conn->exec($sql)) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->errorInfo(); } // 데이터 조회 (SELECT) $sql = "SELECT id, username, email FROM users"; $stmt = $conn->query($sql); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { echo "ID: " . $row["id"]. " - Name: " . $row["username"]. " - Email: " . $row["email"]. "<br>"; } // 데이터 수정 (UPDATE) $sql = "UPDATE users SET email='new_email@example.com' WHERE username='john_doe'"; if ($conn->exec($sql)) { echo "Record updated successfully"; } else { echo "Error updating record: " . $conn->errorInfo(); } // 데이터 삭제 (DELETE) $sql = "DELETE FROM users WHERE id=1"; if ($conn->exec($sql)) { echo "Record deleted successfully"; } else { echo "Error deleting record: " . $conn->errorInfo(); } ?>
트랜잭션 (Transactions)
트랜잭션을 사용하여 데이터베이스 작업을 그룹화하고, 롤백이나 커밋을 사용하여 데이터 일관성을 유지할 수 있습니다.
<?php try { $conn->beginTransaction(); // 여러 SQL 문 실행 $conn->exec("INSERT INTO users (username, password) VALUES ('john_doe', 'password123')"); $conn->exec("UPDATE users SET email='new_email@example.com' WHERE username='john_doe'"); $conn->commit(); // 모든 SQL 문이 성공적으로 실행되면 커밋 echo "Transaction committed successfully"; } catch(PDOException $e) { $conn->rollBack(); // 오류 발생 시 롤백 echo "Transaction failed: " . $e->getMessage(); } ?>
준비된 쿼리 (Prepared Statements)
준비된 쿼리를 사용하여 SQL 쿼리에 대한 입력 값을 안전하게 처리할 수 있습니다.
<?php $username = "john_doe"; $password = "password123"; $stmt = $conn->prepare("SELECT * FROM users WHERE username = :username AND password = :password"); $stmt->bindParam(':username', $username); $stmt->bindParam(':password', $password); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($result as $row) { echo "Username: " . $row["username"] . "<br>"; } ?>
데이터베이스 보안 (SQL Injection Prevention)
SQL 삽입 공격을 방지하기 위해 준비된 쿼리나 PDO의 매개변수화된 쿼리를 사용하여 사용자 입력을 안전하게 처리해야 합니다.
<?php $username = $_POST['username']; $password = $_POST['password']; $stmt = $conn->prepare("SELECT * FROM users WHERE username = :username AND password = :password"); $stmt->bindParam(':username', $username); $stmt->bindParam(':password', $password); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($result as $row) { echo "Username: " . $row["username"] . "<br>"; } ?>
위의 코드 예제들은 MySQL 데이터베이스와 PHP를 연동하여 데이터를 다루는 기본적인 방법들을 보여줍니다. MySQLi와 PDO는 각각의 장단점을 가지고 있으며, 프로젝트 요구 사항에 맞게 적절히 선택하여 사용하는 것이 중요합니다.