현재 위치: > 최신 기사 목록> STMT_INIT 트랜잭션 함수와 결합 (시작, Commit, Rollback)

STMT_INIT 트랜잭션 함수와 결합 (시작, Commit, Rollback)

M66 2025-05-29

PHP에서 데이터베이스 작업을 수행 할 때 MySQLI는 객체 지향 및 절차 적 인터페이스를 제공하는 매우 일반적인 확장자입니다. 오늘 우리는 MySQLI :: STMT_INIT 기능을 트랜잭션 제어 ( 시작 , Commit , Rollback )와 결합하여 데이터베이스 작업의 안정성과 효율성을 향상시키는 방법에 대해 논의 할 것입니다.

1. mysqli :: stmt_init 소개

mysqli :: stmt_init은 미소 클래스의 메소드입니다. 준비된 진술은 SQL 주입 공격을 방지 할 수있을뿐만 아니라 데이터베이스 쿼리의 실행 효율성을 향상시킬 수 있습니다. 전처리 문을 사용할 때 쿼리 문이 한 번 구문 분석되고 실행 중에 다른 매개 변수를 전달할 수 있으므로 SQL 문의 반복 된 구문 분석의 오버 헤드가 줄어 듭니다.

2. 트랜잭션 제어의 기본 개념

데이터베이스에서 트랜잭션은 성공하거나 실패하는 데이터베이스 작업 세트를 나타냅니다. 트랜잭션은 데이터 일관성과 안정성을 보장합니다. 거래의 기본 운영에는 다음이 포함됩니다.

  • begin_transaction : 트랜잭션을 시작합니다.

  • 커밋 : 데이터베이스 수정이 적용되도록 거래를 커밋하십시오.

  • 롤백 : 롤백 거래 및 거래의 모든 운영을 취소합니다.

3. mysqli :: stmt_init 와 트랜잭션 제어를 결합합니다

여러 데이터베이스 작업을 수행하는 경우 이러한 작업이 성공적이거나 실패했는지 확인해야합니다. 이를 달성하기 위해 트랜잭션 제어를 사용할 수 있습니다.

MySQLI :: STMT_INIT를 사용하여 트랜잭션 제어와 결합하면 여러 데이터베이스 작업의 안정성을 보장 할 수 있습니다. 실행 중에 작업이 실패하면 트랜잭션을 롤백하여 데이터베이스의 일관성을 보장하기 위해 실행 된 모든 작업을 취소 할 수 있습니다.

다음은 mysqli :: stmt_init 과 트랜잭션 제어를 결합한 PHP 코드 예입니다.

 <?php
// 데이터베이스 연결을 만듭니다
$mysqli = new mysqli("localhost", "username", "password", "database_name");

// 연결이 성공했는지 확인하십시오
if ($mysqli->connect_error) {
    die("연결이 실패했습니다: " . $mysqli->connect_error);
}

// 거래를 시작하십시오
$mysqli->begin_transaction();

try {
    // 전처리 진술을 초기화하십시오
    $stmt = $mysqli->stmt_init();
    
    // 첫 번째 삽입 작업
    if ($stmt->prepare("INSERT INTO users (username, email) VALUES (?, ?)")) {
        $username = 'user1';
        $email = 'user1@m66.net';
        $stmt->bind_param("ss", $username, $email);
        $stmt->execute();
    } else {
        throw new Exception("진술을 준비하지 못했습니다");
    }

    // 두 번째 삽입 작업
    if ($stmt->prepare("INSERT INTO orders (user_id, product) VALUES (?, ?)")) {
        $user_id = 1; // 사용자를 가정합니다ID~을 위한1
        $product = 'Product A';
        $stmt->bind_param("is", $user_id, $product);
        $stmt->execute();
    } else {
        throw new Exception("진술을 준비하지 못했습니다");
    }

    // 거래를 제출하십시오
    $mysqli->commit();
    echo "거래가 성공적으로 제출되었습니다!";
} catch (Exception $e) {
    // 오류가 발생하면 트랜잭션을 롤백하십시오
    $mysqli->rollback();
    echo "거래 롤백: " . $e->getMessage();
}

// 연결을 닫으십시오
$mysqli->close();
?>

4. 코드 설명

  1. 데이터베이스 연결 설정 : 새로운 MySQLI () 함수를 사용하여 MySQL 데이터베이스에 연결하십시오. 연결이 실패하면 프로그램이 오류 메시지를 출력하고 실행을 중지합니다.

  2. 트랜잭션 시작 : $ mysqli-> begin_transaction ()을 사용하여 트랜잭션을 시작하십시오. 트랜잭션이 시작된 후 트랜잭션이 커밋되거나 롤백 될 때까지 모든 데이터베이스 작업이 트랜잭션에서 실행됩니다.

  3. 전처리 명세서를 초기화하고 준비하십시오. $ mysqli-> stmt_init () 메소드를 사용하여 전처리 명령문 개체를 초기화하십시오. 그런 다음 $ sql 쿼리를 준비하려면 $ stmt-> repay () 메소드를 사용하십시오.

  4. 매개 변수 바인드 및 실행 : $ stmt-> bind_param () 메소드를 사용하여 데이터가 안전하게 삽입되도록 SQL 문에서 매개 변수를 바인딩합니다. 그런 다음 $ stmt-> execute ()를 사용하여 전처리 문을 실행하십시오.

  5. 커밋 또는 롤백 트랜잭션 : 모든 작업이 성공한 경우 $ mysqli-> commit ()를 사용하여 트랜잭션을 커밋하고 모든 수정 사항을 데이터베이스에 저장하십시오. 실행 중에 오류가 발생하면 예외가 발생하고 Catch Statement 블록에서 $ mysqli-> rollback ()을 사용하여 트랜잭션이 다시 롤백되어 모든 이전 작업을 취소합니다.

  6. CLOSH 연결 : 작업이 완료된 후 $ MySQLi-> Close () 를 통해 데이터베이스 연결을 닫으십시오.

5. 장점

mysqli :: stmt_init을 트랜잭션 컨트롤과 결합하면 다음과 같은 이점을 누릴 수 있습니다.

  • SQL 주입 방지 : 전처리 문을 사용하면 SQL 주입 공격을 효과적으로 방지 할 수 있습니다.

  • 효율성 향상 : 전처리 명세서는 실행할 때 SQL을 반복적으로 구문 분석 할 필요가 없습니다. 데이터베이스의 부담이 줄어 듭니다.

  • 데이터 일관성 보장 : 트랜잭션 제어를 통해 데이터베이스 운영의 원자력이 모든 성공 또는 모든 실패로 데이터 불일치를 피합니다.

  • 예외 처리 : 작동 중에 오류가 발생하면 트랜잭션을 롤백하여 데이터베이스가 손상되지 않도록 할 수 있습니다.

6. 결론

mysqli :: stmt_init 함수 및 트랜잭션 제어 ( 시작 , Commit, Commit , Rollback )를 결합하면 데이터베이스 작업을위한 PHP 프로그램의 안정성과 효율성을 향상시킬 수 있습니다. 이는 SQL 주입 문제를 효과적으로 피할뿐만 아니라 여러 데이터베이스 작업이 실패하고 데이터 손상을 피할 때 데이터 일관성을 보장합니다.