코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

PHP MySQL Insert Multiple

PHP MySQL Insert Multiple : 여러 개의 데이터 삽입하기


PHP를 사용하여 MySQL여러 개의 레코드를 한 번에 삽입하는 방법은 성능을 최적화하고 코드의 효율성을 높일 수 있습니다. 일반적으로 **배치 삽입(Batch Insert)**이라고도 불리며, 데이터를 하나씩 삽입하는 것보다 훨씬 빠르고 효율적입니다.

이 가이드에서는 PHP에서 MySQL에 여러 개의 데이터를 한 번에 삽입하는 방법, MySQLiPDO를 사용한 배치 삽입 예제, 그리고 보안적인 고려 사항을 다룹니다.


1. MySQL 여러 레코드 삽입(SQL 쿼리)

MySQL에서 여러 레코드를 한 번에 삽입하기 위한 SQL 쿼리는 다음과 같습니다:

INSERT INTO table_name (column1, column2) VALUES (value1_1, value1_2), (value2_1, value2_2), ...;

  • table_name: 데이터를 삽입할 테이블의 이름입니다.
  • column1, column2: 각 열의 이름입니다.
  • (value1_1, value1_2), (value2_1, value2_2): 각 레코드에 해당하는 값들입니다.

예시: 사용자 정보를 저장할 users 테이블에 여러 레코드를 한 번에 삽입

INSERT INTO users (username, email) VALUES
('JohnDoe', 'john@example.com'),
('JaneDoe', 'jane@example.com'),
('SamSmith', 'sam@example.com');


2. MySQLi를 사용한 여러 데이터 삽입

2.1 객체 지향 방식으로 여러 데이터 삽입

<?php
// MySQL 데이터베이스 연결 정보
$host = "localhost";
$username = "root";
$password = "";
$database = "my_database";

// MySQL 데이터베이스 연결
$conn = new mysqli($host, $username, $password, $database);

// 연결 확인
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// 여러 데이터 삽입 SQL 쿼리
$sql = "INSERT INTO users (username, email) VALUES
        ('JohnDoe', 'john@example.com'),
        ('JaneDoe', 'jane@example.com'),
        ('SamSmith', 'sam@example.com')";

// 데이터 삽입 시도
if ($conn->query($sql) === TRUE) {
    echo "New records created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

// 연결 종료
$conn->close();
?>

설명:

  • $conn->query(): SQL 쿼리를 실행하여 한 번에 여러 레코드를 삽입합니다.
  • 이 방법을 통해 데이터베이스와의 통신을 한 번만 수행하여 성능을 개선할 수 있습니다.

2.2 절차적 방식으로 여러 데이터 삽입

<?php
// MySQL 데이터베이스 연결 정보
$host = "localhost";
$username = "root";
$password = "";
$database = "my_database";

// MySQL 데이터베이스 연결
$conn = mysqli_connect($host, $username, $password, $database);

// 연결 확인
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

// 여러 데이터 삽입 SQL 쿼리
$sql = "INSERT INTO users (username, email) VALUES
        ('JohnDoe', 'john@example.com'),
        ('JaneDoe', 'jane@example.com'),
        ('SamSmith', 'sam@example.com')";

// 데이터 삽입 시도
if (mysqli_query($conn, $sql)) {
    echo "New records created successfully";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

// 연결 종료
mysqli_close($conn);
?>

설명:

  • mysqli_query(): MySQLi 절차적 방식에서 쿼리를 실행하여 한 번에 여러 레코드를 삽입합니다.
  • *mysqli_close()*를 사용하여 작업이 완료되면 데이터베이스 연결을 종료합니다.

3. PDO를 사용한 여러 데이터 삽입

PDO파라미터화된 쿼리를 통해 보안을 강화하고, 성능 면에서도 여러 데이터를 한 번에 삽입할 수 있습니다.

<?php
// 데이터베이스 연결 정보
$host = "localhost";
$dbname = "my_database";
$username = "root";
$password = "";

try {
    // PDO 객체 생성 및 MySQL 서버 연결
    $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 여러 데이터 삽입 SQL 쿼리
    $sql = "INSERT INTO users (username, email) VALUES
            ('JohnDoe', 'john@example.com'),
            ('JaneDoe', 'jane@example.com'),
            ('SamSmith', 'sam@example.com')";

    // 쿼리 실행
    $pdo->exec($sql);
    echo "New records created successfully";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}
?>

설명:

  • $pdo->exec(): PDO 방식에서 SQL 쿼리를 한 번에 실행하여 여러 레코드를 삽입합니다.
  • 예외 처리를 통해 오류 발생 시 오류 메시지를 출력합니다.

4. 사용자 입력을 통한 여러 데이터 삽입

4.1 MySQLi를 통한 사용자 입력 데이터 삽입

사용자가 제출한 여러 데이터를 동적으로 삽입할 경우, 파라미터화된 쿼리를 사용해 SQL 인젝션을 방지하는 것이 중요합니다.

<?php
// MySQL 데이터베이스 연결 정보
$host = "localhost";
$username = "root";
$password = "";
$database = "my_database";

// MySQL 데이터베이스 연결
$conn = new mysqli($host, $username, $password, $database);

// 연결 확인
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// 사용자 입력을 통한 여러 데이터 삽입 (파라미터화된 쿼리)
$stmt = $conn->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt->bind_param("ss", $username, $email);

// 사용자 입력 값
$users = [
    ['JohnDoe', 'john@example.com'],
    ['JaneDoe', 'jane@example.com'],
    ['SamSmith', 'sam@example.com']
];

// 반복문을 통해 여러 데이터 삽입
foreach ($users as $user) {
    $username = $user[0];
    $email = $user[1];
    $stmt->execute();
}

echo "New records created successfully";

$stmt->close();
$conn->close();
?>

설명:

  • $stmt->bind_param(): 파라미터 바인딩을 통해 SQL 인젝션을 방지합니다.
  • 반복문을 사용하여 여러 데이터를 동적으로 삽입합니다.

4.2 PDO를 통한 사용자 입력 데이터 삽입

PDO에서도 파라미터화된 쿼리를 사용하여 SQL 인젝션 방지보안 강화를 구현할 수 있습니다.

<?php
// 데이터베이스 연결 정보
$host = "localhost";
$dbname = "my_database";
$username = "root";
$password = "";

try {
    // PDO 객체 생성 및 MySQL 서버 연결
    $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);

    // 사용자 입력 값
    $users = [
        ['JohnDoe', 'john@example.com'],
        ['JaneDoe', 'jane@example.com'],
        ['SamSmith', 'sam@example.com']
    ];

    // 반복문을 통해 여러 데이터 삽입
    foreach ($users as $user) {
        $stmt->execute(['username' => $user[0], 'email' => $user[1]]);
    }

    echo "New records created successfully";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}
?>

설명:

  • $stmt->execute(): 배열을 사용해 파라미터를 바인딩하고 데이터를 삽입합니다.
  • 반복문을 통해 여러 레코드를 효율적으로 삽입합니다.

5. 보안 고려 사항

5.1 SQL 인젝션 방지

여러 데이터를 삽입할 때도 **SQL 인젝션

  • *의 위험을 방지하기 위해 파라미터화된 쿼리 또는 프리페어드 스테이트먼트를 사용하는 것이 중요합니다.

MySQLi에서의 예:

$stmt = $conn->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt->bind_param("ss", $username, $email);

PDO에서의 예:

$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (:username, :email)");

5.2 트랜잭션 사용

여러 데이터를 삽입할 때 **트랜잭션(Transaction)**을 사용하는 것이 좋습니다. 이를 통해 삽입 도중 오류가 발생하면 **롤백(Rollback)**을 수행하여 데이터베이스의 일관성을 유지할 수 있습니다.


요약

PHP에서 MySQL에 여러 개의 레코드를 한 번에 삽입하는 것은 성능을 최적화하고 데이터베이스 작업을 효율적으로 처리할 수 있는 방법입니다. MySQLiPDO를 사용하여 여러 데이터를 삽입할 수 있으며, 파라미터화된 쿼리를 사용하여 SQL 인젝션을 방지할 수 있습니다. 사용자 입력을 동적으로 처리할 때는 반드시 보안적인 고려 사항을 적용하여 안전한 데이터 처리를 보장해야 합니다.


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