PHP 프로그래밍에서 MySQLI 확장은 MySQL 데이터베이스와 상호 작용하는 데 사용되며 MySQLI_STMT는 이의 중요한 구성 요소이며 종종 사전 처리 문을 실행하는 데 사용됩니다. mysqli_stmt :: $ error는 sql 문을 실행할 때 발생하는 오류 메시지를 반환하는 mysqli_stmt 객체의 속성입니다. SQL 실행이 성공하면 $ 오류 가 비어 있습니다. 오류가 발생하면 개발자가 문제를 해결하도록 촉진하기 위해 자세한 오류 정보가 포함됩니다.
그러나 트랜잭션에서 MySQLI_STMT :: $ 오류를 사용할 때 개발자는 일부 함정에 직면 할 수 있습니다. 이 기사는 이러한 일반적인 문제에 대해 논의하고 피하는 방법에 대한 해결책을 제공합니다.
트랜잭션에서 MySQLI는 데이터베이스 트랜잭션을 관리하기 위해 begin_transaction () , Commit () 및 Rollback () 과 같은 메소드를 제공합니다. 트랜잭션 실행 중에 오류가 발생하면 데이터 불일치를 방지하기 위해 Rollback ()을 사용하여 트랜잭션을 롤백해야합니다. 그러나 트랜잭션이 성공했는지 여부를 결정하기 위해 MySQLI_STMT :: $ 오류 만 사용하면 일부 오류가 누락되어 트랜잭션이 롤백에 실패 할 수 있습니다.
mysqli :: errno를 사용하여 오류가 발생하는지 확인하고 오류가 발생하면 항상 트랜잭션을 롤백하십시오. 이렇게하면 오류가 어디에서 발생하든 제 시간에 처리 할 수 있습니다.
$mysqli->begin_transaction();
$stmt = $mysqli->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt->bind_param("ss", $username, $email);
if (!$stmt->execute()) {
echo "Error executing query: " . $stmt->error;
$mysqli->rollback(); // 오류가 발생하는 경우,트랜잭션을 롤백하십시오
exit();
}
// 모든 것이 괜찮다면,거래를 제출하십시오
$mysqli->commit();
mysqli_stmt :: $ 오류는 단일 명령문 실행에 대한 오류 정보 만 반환하면 전체 트랜잭션의 오류를 다루지 않습니다. 여러 문장을 실행하고 오류를 확인하기 위해 $ stmt-> 오류 에만 의존하는 경우 트랜잭션의 전체 오류를 놓치면 데이터 불일치가 발생할 수 있습니다.
MySQLI를 사용하면 트랜잭션이 여러 데이터베이스 연결에서 실행될 수 있습니다. 개발자가 트랜잭션을 실행할 때 실수로 한 연결에서 트랜잭션을 시작하고 다른 연결에서 쿼리를 실행하여 트랜잭션 관리 혼란을 일으킬 수 있습니다. MySQLI_STMT :: $ 오류가 호출되면 다른 연결에서 수행 된 작업에서 오류가 발생하면 오류가 제 시간에 캡처되지 않아 응용 프로그램의 일관성이없는 상태가 발생할 수 있습니다.
항상 트랜잭션의 모든 운영이 동일한 데이터베이스 연결에서 수행되는지 확인하십시오. MySQLI 객체 연결을 사용하여 전체 트랜잭션의 컨텍스트가 동일한 연결 하에서 실행되도록 할 수 있습니다.
$mysqli->begin_transaction(); // 동일한 연결에서 모든 트랜잭션이 수행되는지 확인하십시오.
$stmt1 = $mysqli->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt1->bind_param("ss", $username, $email);
$stmt2 = $mysqli->prepare("INSERT INTO orders (user_id, amount) VALUES (?, ?)");
$stmt2->bind_param("id", $user_id, $amount);
// 행동을 수행하십시오
if (!$stmt1->execute() || !$stmt2->execute()) {
echo "Error executing queries: " . $mysqli->error;
$mysqli->rollback();
exit();
}
$mysqli->commit(); // 제출하십시오
이를 통해 모든 데이터베이스 작업이 동일한 연결 하에서 수행되며 교차 연결 트랜잭션 관리의 혼란을 피합니다.
MySQL에서 트랜잭션의 오차 수준은 다른 유형으로 나뉩니다. 일부 오류는 치명적일 수 있으며 즉각적인 거래가 필요합니다. 다른 사람들은 실행을 계속할 수있는 경고 레벨 일 수 있습니다. mysqli_stmt :: $ error는 SQL 오류 메시지 만 반환하지만 오류의 심각성을 알려주지 않습니다.
트랜잭션에서 먼저 MySQLI_STMT :: $ 오류가 비어 있는지 확인한 다음 오류 유형에 따라 적절한 조치를 취하십시오. 치명적인 오류 인 경우 거래는 롤백해야합니다. 경고 오류 인 경우 계속 선택할 수 있습니다.
if (!$stmt1->execute()) {
if ($stmt1->errno) {
echo "Fatal error: " . $stmt1->error;
$mysqli->rollback(); // 致命错误时트랜잭션을 롤백하십시오
exit();
} else {
echo "Warning: " . $stmt1->error;
// 다른 작업을 계속 수행하도록 선택할 수 있습니다
}
}
MySQLI 의 전처리 명세서는 SQL 주입 공격을 방지하는 데 도움이되었지만 개발자가 BINT_PARAM () 메소드를 올바르게 사용하지 않으면 응용 프로그램이 SQL 주입 공격의 위험에 노출됩니다. 트랜잭션에서 MySQLI_STMT :: $ 오류를 사용하여 오류를 잡기 위해 오류가 허용되면 이러한 오류 메시지가 공격자에게 노출 될 수 있습니다.
항상 bind_param () 또는 bind_value () 메소드를 사용하여 매개 변수의 데이터 유형이 올바르게 설정되도록 매개 변수를 바인딩하십시오.
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username); // 바인딩 사용자 이름 매개 변수,예방하다 SQL 주입
$stmt->execute();
이러한 방식으로 일부 오류가 캡처 되더라도 데이터베이스의 구조 또는 민감한 정보는 공격자에게 노출되지 않습니다.
MySQLI_STMT :: $ 오류를 사용하는 경우 개발자는 데이터 불일치로 이어지는 누락을 피하기 위해 트랜잭션 오류를 처리하는 데주의를 기울여야합니다. 가장 일반적인 함정에는 다음이 포함됩니다. 트랜잭션이 올바르게 롤백되지 않는 트랜잭션, 다른 연결에서 트랜잭션 관리가 혼란, 데이터베이스 오류 수준을 무시하고 SQL 주입을 잘못 방지합니다. 합리적인 오류 처리를 통해 이러한 문제를 크게 줄일 수 있으며, 동일한 연결에서 트랜잭션이 실행되고 Bind_param () 의 합리적인 사용이 가능합니다.