데이터베이스 개발에 PHP를 사용할 때 pdostatement :: fetchObject ()는 매우 실용적인 방법입니다. 쉽게 후속 처리를 위해 쿼리 결과를 객체에 직접 매핑 할 수 있습니다. 그러나 때때로 우리는 fetchObject ()가 거짓 또는 빈 객체를 반환하는 상황을 만납니다. 이 기사는이 문제의 일반적인 원인과 해당 솔루션을 자세히 분석합니다.
실행 된 SQL 문 자체가 레코드와 일치하지 않으면 Natural FetchObject ()가 False를 반환합니다. 이것은 무시하는 가장 일반적이고 가장 쉬운 이유 중 하나입니다.
샘플 코드 :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT * FROM users WHERE id = 999'); // 가정 ID 999 존재하지 않습니다
$obj = $stmt->fetchObject();
if (!$obj) {
echo "데이터를 찾을 수 없습니다";
}
?>
해결책:
SQL 쿼리가 데이터를 올바르게 반환 할 수 있는지 확인하려면 프로그램에 로그를 추가하거나 데이터베이스 클라이언트 (예 : PhpmyAdmin )로 쿼리 문을 직접 테스트 할 수 있습니다.
쿼리 문 자체에 구문 오류가 있거나 데이터베이스 예외가 있으면 Query ()가 False를 반환 할 수 있으며 후속 FetchObject () 호출은 자연스럽게 성공하지 못합니다.
샘플 코드 :
<?php
$stmt = $pdo->query('SELECT FROM users'); // 누락 된 필드,SQL실수
if ($stmt === false) {
echo "SQL실행 실패";
}
?>
해결책:
query () 또는 repay () 후에 항상 반환 값을 확인하고 pdo :: errorinfo ()를 사용하여 특정 오류 정보를보십시오.
쿼리의 열 이름이 잘못 기록되면 SQL이 정상적으로 실행될 수 있지만 검색된 데이터가 잘못되어 FetchObject () 가 객체를 채우지 못합니다.
샘플 코드 :
<?php
$stmt = $pdo->query('SELECT id, username FROM users');
$obj = $stmt->fetchObject();
echo $obj->email; // 알아채다:email字段존재하지 않습니다
?>
해결책:
쿼리 문에 필요한 모든 필드가 포함되어 있고 필드 이름이 올바른지 확인하십시오.
fetchObject ()는 기본적으로 데이터를 stdclass 객체에 매핑합니다. 코드 또는 논리에 특정 클래스 맵이 필요한 경우 클래스 이름을 지정하는 것을 잊어 버리면 검색된 객체를 사용할 수 없습니다.
샘플 코드 :
<?php
class User {
public $id;
public $username;
}
$stmt = $pdo->query('SELECT id, username FROM users');
$obj = $stmt->fetchObject('User');
?>
사용자 클래스가 존재하지 않거나 생성자에 복잡한 매개 변수 요구 사항이있는 경우 FetchObject () 도 실패 할 수 있습니다.
해결책:
지정된 클래스가 존재하는지 확인하십시오.
클래스에 생성자 매개 변수가있는 경우 매개 변수 배열을 FetchObject 로 전달할 수 있습니다.
클래스의 생성자를 가능한 한 간단하게 유지하거나 매개 변수가없는 생성자를 구현하십시오.
FetchObject ()가 호출 될 때마다 내부 포인터는 한 줄을 앞으로 이동합니다. 실수로 여러 번 호출하면 두 번째 후에는 비어있을 가능성이 높습니다.
샘플 코드 :
<?php
$obj1 = $stmt->fetchObject();
$obj2 = $stmt->fetchObject(); // 한 행의 데이터 만있는 경우,이것은 false
?>
해결책:
루프를 사용하여 여러 행의 데이터를 처리하십시오.
한 번 호출 한 후 실수로 다시 전화하지 마십시오.
쿼리하기 전에 SQL이 정확하고 필드 이름이 정확한지 확인하십시오.
쿼리 후 $ stmt 가 false 인지 확인하십시오.
fetchObject ()를 호출 한 후 리턴 값이 False 인지 확인하십시오.
사용자 정의 클래스에 매핑하려면 클래스 구조가 요구 사항을 충족하는지 확인하십시오.
멀티 로우 데이터는 ($ obj = $ stmt-> fetchObject ()) 루프를 사용하여 처리됩니다.
위의 검사 단계를 통해 FetchObject ()가 맹인 조사를 통해 낭비되는 시간을 피하기 위해 FetchObject () 가 비어있는 실제 이유를 신속하게 찾을 수 있습니다.