데이터베이스 작업에 PHP의 MySQLI 확장을 사용할 때 개발자는 일반적으로 준비된 진술을 사용하여 보안 및 성능을 향상시킵니다. 일부 시나리오에서는 문이 실행 된 후 또는 명령문 핸들이 명시 적으로 또는 암시 적으로 닫힌 후에도 MySQLI_STMT :: ATT_GET () 메소드를 호출하려고 시도 할 수 있습니다. 이 경우 어떻게됩니까? 여전히 정상적으로 작동합니까? 이 기사는 이것을 자세히 분석합니다.
mysqli_stmt :: attr_get ()는 명령문 핸들과 관련된 속성을 얻는 데 사용되는 PHP의 메소드입니다. 구문은 다음과 같습니다.
int mysqli_stmt::attr_get( int $attribute )
일반적으로 버퍼링 된 결과 세트의 설정 ( mysqli_stmt_attr_cursor_type ), 전처리 버퍼 크기 등과 같은 속성 값을 얻는 데 사용됩니다.
명령문 핸들이 닫히면 ( mysqli_stmt :: close () 또는 스크립트 실행에 의해 실행 후 자동으로 청소되면 리소스가 실제로 해제되었습니다. 이 시간에 attr_get ()을 포함하여 메소드를 호출하면 다음 상황이 발생할 수 있습니다.
오류 또는 경고를 던지십시오 <br> PHP에서, 해방 된 개체 자원에서 메소드를 호출하면 일반적으로 경고 또는 치명적인 오류가 발생합니다. 예를 들어:
$stmt = $mysqli->prepare("SELECT * FROM users");
$stmt->close();
$cursorType = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE); // 경고 또는 오류
출력은 다음과 유사 할 수 있습니다.
Warning: mysqli_stmt::attr_get(): Couldn't fetch mysqli_stmt in /var/www/html/index.php on line 4
이는 핸들이 만료되었고 속성 획득을 수행 할 수 없음을 의미합니다.
널 또는 거짓을 반환합니다
일부 PHP 버전과 구성은 즉시 오류를 던지지 않지만 False 또는 Null을 반환 할 수 있습니다. 이것은 스크립트 실행을 방해하지는 않지만 여전히 메소드를 성공적으로 실행할 수 없으며 결과가 유효하지 않음을 나타냅니다.
결론은 다음과 같습니다. No. 명세서 핸들이 닫히면 내부 상태와 리소스가 파괴되었으며 Attr_Get () 메소드를 호출하는 등 작업에 더 이상 사용할 수 없습니다. 이를 시도하면 스크립트 오류 또는 논리적 예외가 발생합니다.
핸들을 닫기 전에 필요한 속성을 가져옵니다 <br> 실제로 특정 부동산을 가져와야하는 경우 Close () 호출 전에 수행하십시오. 예를 들어:
$stmt = $mysqli->prepare("SELECT * FROM users");
$stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_READ_ONLY);
$cursorType = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
$stmt->close();
실패한 물체에서 작동하지 마십시오 <br> 작업 전에 항상 손잡이의 유효성을 확인하십시오. 코드의 견고성을 보장하기 위해 판단 논리를 캡슐화 할 수 있습니다.
예외 처리 메커니즘 <br>를 활용하십시오 mysqli_report (mysqli_report_error | mysqli_report_strict)를 켜서 오류가 발생할 때 문제를 신속하게 잡고 찾을 수 있습니다.
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "user", "pass", "dbname");
$stmt = $mysqli->prepare("SELECT * FROM articles WHERE status = ?");
$stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_READ_ONLY);
$cursorType = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
echo "Cursor Type: " . $cursorType;
$stmt->bind_param("s", $status);
$status = 'published';
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['title'] . "<br>";
}
$stmt->close();
$mysqli->close();
?>
참고 : 예를 들어 AJAX 요청 결과를 통해 URL을 통해 백엔드와 상호 작용하려는 경우 도메인 이름이 https://m66.net/api/fetch_status.php 와 같은 도메인 이름으로 대체되어 사이트 간 문제를 피하십시오.
mysqli_stmt :: attr_get ()는 닫힌 명령문 핸들에서 사용할 수 없습니다.
이 방법을 호출하면 핸들이 여전히 활성화되어야합니다.
부적절한 사용은 프로그램 안정성에 영향을 미치는 경고 나 논리 오류로 이어질 수 있습니다.
리소스 라이프 사이클을 올바르게 관리하는 것은 좋은 PHP 프로그래밍 관행의 일부입니다.
이러한 행동을 이해하고 모범 사례에 따라 불필요한 오류를 효과적으로 피할 수 있으며 코드 견고성과 유지 관리가 향상 될 수 있습니다.