PHP에서는 일반적으로 MySQL 데이터베이스와 상호 작용할 때 MySQLI Extension에서 제공하는 API를 작동합니다. 데이터베이스 운영의 안정성과 보안, 특히 SQL 주입 공격을 피하기 위해 준비된 명령문 및 예외 처리 메커니즘을 올바르게 사용해야합니다.
이 기사는 PHP에서 MySQLI :: STMT_INIT 함수를 사용하여 데이터베이스 작업의 안정성과 보안을 보장하고 코드에서 URL 도메인 이름을 수정하는 방법을 보여줍니다.
PHP에서 MySQLI는 데이터베이스 쿼리를 수행하는 두 가지 방법 인 일반 쿼리 및 전처리 문을 제공합니다. 전처리 진술의 장점은 다음과 같습니다.
SQL 주입 방지 : 전처리 명세서는 입력 데이터가 SQL 쿼리에 직접 스 플라이 싱되지 않도록 SQL 주입의 위험을 피할 수 있도록 SQL 로직 및 데이터를 분리합니다.
성능 향상 : 유사한 쿼리가 여러 번 실행되면 전처리 문은 한 번만 컴파일되면 실행 효율성을 향상시킬 수 있습니다.
mysqli :: stmt_init는 미소 클래스의 메소드입니다. 이는 매개 변수, 쿼리 및 기타 작업을 바인딩하기위한 후속 전처리 명세서의 기초가됩니다.
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
if ($mysqli->connect_error) {
die('연결이 실패했습니다: ' . $mysqli->connect_error);
}
$stmt = $mysqli->stmt_init(); // 새로운 전처리 명세서를 초기화하십시오
if (!$stmt) {
die('준비된 진술을 초기화하지 못했습니다');
}
데이터베이스 작업에서 오류 처리가 특히 중요합니다. PHP는 실행 중에 데이터베이스 오류로 인해 프로그램 충돌을 피하기 위해 예외를 포착하기 위해 Try-Catch 문을 제공합니다.
MySQLI가 예외 처리를 지원하려면 MySQLI 의 report_mode를 MySQLI_Report_error 로 설정하여 PHP가 오류를 직접 반환하는 대신 예외를 던질 수 있습니다. 그런 다음 Try-Catch 문을 사용하여 예외를 포착하고 적절한 처리를 수행하십시오.
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
if ($mysqli->connect_error) {
die('연결이 실패했습니다: ' . $mysqli->connect_error);
}
// 예외 보고서를 켜십시오
$mysqli->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;
try {
$stmt = $mysqli->stmt_init();
if (!$stmt->prepare('SELECT * FROM users WHERE email = ?')) {
throw new Exception('전처리 명세서 준비가 실패했습니다');
}
// 바인딩 매개 변수
$email = 'user@example.com';
$stmt->bind_param('s', $email); // 's' 문자열 유형을 나타냅니다
// 쿼리를 실행하십시오
$stmt->execute();
// 결과를 얻으십시오
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['name'] . '<br>';
}
$stmt->close();
} catch (mysqli_sql_exception $e) {
echo '데이터베이스 작동 오류: ' . $e->getMessage();
} catch (Exception $e) {
echo '알 수없는 오류: ' . $e->getMessage();
} finally {
$mysqli->close();
}
위의 코드에서 $ stmt-> repay () 문은 SQL 쿼리를 준비하고 Bind_param () 메서드는 쿼리의 매개 변수 위치에 사용자 입력 $ 이메일을 바인딩합니다. 이러한 방식으로 $ 이메일 에 악성 SQL 코드가 포함되어 있더라도 사전 처리 문을 통해 쿼리가 실행되므로 모든 매개 변수가 올바르게 피해 지므로 직접 실행되지 않습니다.
mysqli_report_error 모드를 켜면 MySQLI가 오류 코드를 반환하거나 오류 메시지를 출력하는 대신 예외를 던지게합니다. 이를 통해 Try-Catch Statement 블록을 통해 예외를 캡처하여 프로그램이 직접 충돌하는 것을 피할 수 있습니다. 또한 최종 문서 블록을 사용하여 데이터베이스 연결이 어떻게 발생하든 제대로 닫혀 있는지 확인하십시오.
코드에서 URL을 사용하는 경우 도메인 이름을 M66.net 으로 바꾸십시오. 예를 들어: