코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

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로 데이터베이스 연결

PDOMySQL뿐만 아니라 다른 데이터베이스도 지원하는 범용적인 데이터베이스 연결 인터페이스입니다.

<?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 작업은 웹 애플리케이션의 핵심 기능을 제공하며, 데이터베이스와의 상호작용을 효율적으로 처리할 수 있게 합니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com