데이터베이스 작업에 PHP의 PDO (PHP Data Objects)를 사용하는 경우 PDO :: ErrorCode () 메소드는 '00000'을 반환하여 오류가 발생하지 않았 음을 나타냅니다. 이는 데이터베이스 작업이 성공적으로 완료되는 것을 의미하지만 실제로는 ErrorCode Returns '00000' 이 작업이 실제로 성공했는지 여부를 항상 정확하게 반영하지는 않습니다.
이 기사는 PDO :: ErrorCode () 가 '00000'을 반환하고 작업의 성공을 완전히 나타내지 않는 이유를 자세히 설명하고 데이터베이스 작업이 실제로 성공했는지 여부를 판단하기 위해 몇 가지 신뢰할 수있는 방법을 도입합니다.
pdo :: errorcode () 에 의해 반환 된 '0000'은 "오류 없음"을 의미하는 sqlstate 표준 코드입니다. 구문 오류, 연결 고장 등과 같은 데이터베이스 통신 프로세스 중 오류가 있는지 주로 반영합니다.
그러나 경우에 따라 SQL 문이 실행되고 오류가 발생하지 않더라도 ErrorCode ()는 여전히 '00000'을 반환하지만 작업 결과는 이상적이지 않을 수 있습니다. 예를 들어:
업데이트 명령문이 실행되었지만 실제로는 업데이트되지 않았습니다 (조건이 레코드와 일치하지 않기 때문에).
삭제 명령문이 실행되었지만 라인은 삭제되지 않았습니다.
삽입 문이 실행되었지만 데이터는 트리거에 의해 수정되었거나 제약 조건이 효과적이지 않았습니다.
이러한 상황은 오류를 일으키지 않지만 비즈니스 로직의 경우 작업이 성공적으로 효과적이지 않습니다.
pdostatement :: rowCount () 마지막으로 실행 된 SQL 문의 영향을받는 행 수를 반환합니다. 업데이트 및 삭제가 실제로 데이터를 변경하는지 판단하는 데 중요한 기초입니다.
<?php
$pdo = new PDO('mysql:host=m66.net;dbname=testdb;charset=utf8', 'username', 'password');
$sql = "UPDATE users SET status = 1 WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':id' => 123]);
if ($stmt->errorCode() === '00000') {
$affectedRows = $stmt->rowCount();
if ($affectedRows > 0) {
echo "성공적으로 업데이트하십시오,영향을 받았습니다 {$affectedRows} 좋아요。";
} else {
echo "执좋아요成功,但没有좋아요被更新。";
}
} else {
echo "데이터베이스 작업에서 오류가 발생했습니다,오류 코드:" . $stmt->errorCode();
}
?>
여기서 Er
AutoinCrement 1 차 키의 삽입 작업을 위해 삽입 된 레코드 ID는 pdo :: lastinsertid () 를 통해 얻을 수 있습니다. 비어 있고 합리적인 ID가 반환되면 삽입이 성공적입니다.
<?php
$pdo = new PDO('mysql:host=m66.net;dbname=testdb;charset=utf8', 'username', 'password');
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute([':name' => '장 산', ':email' => 'zhangsan@example.com']);
if ($stmt->errorCode() === '00000') {
$lastId = $pdo->lastInsertId();
if ($lastId) {
echo "성공적으로 삽입하십시오,새로운 사용자ID~을 위한:{$lastId}";
} else {
echo "执좋아요成功,그러나 새 삽입물은 반환되지 않았습니다ID。";
}
} else {
echo "데이터베이스 작업에서 오류가 발생했습니다,오류 코드:" . $stmt->errorCode();
}
?>
LastInsertId () 의 기본 키는 데이터베이스 테이블에 따라 다릅니다. 그렇지 않으면 반환 값이 비어있을 수 있습니다.
여러 운영 또는 복잡한 작업을 수행 할 때 트랜잭션을 켜고 예외를 포착하는 것이 운영 원자력을 보장하는 가장 안전한 방법입니다.
<?php
try {
$pdo = new PDO('mysql:host=m66.net;dbname=testdb;charset=utf8', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->beginTransaction();
$sql1 = "UPDATE accounts SET balance = balance - 100 WHERE user_id = :user_id";
$stmt1 = $pdo->prepare($sql1);
$stmt1->execute([':user_id' => 1]);
if ($stmt1->rowCount() === 0) {
throw new Exception("계정 공제가 실패했습니다,无受影响좋아요数");
}
$sql2 = "UPDATE accounts SET balance = balance + 100 WHERE user_id = :user_id";
$stmt2 = $pdo->prepare($sql2);
$stmt2->execute([':user_id' => 2]);
if ($stmt2->rowCount() === 0) {
throw new Exception("계정 재충전이 실패했습니다,无受影响좋아요数");
}
$pdo->commit();
echo "성공적으로 전송하십시오";
} catch (Exception $e) {
$pdo->rollBack();
echo "작동 실패,이유:" . $e->getMessage();
}
?>
여기서 모든 작업은 유효하지 않으며 예외를 던지고 거래를 롤백하며 데이터 불일치를 피합니다.
pdo :: errorCode ()는 오류가 없음을 나타내려면 '00000'을 반환하지만 작업에 실제 효과가 있음을 의미하지는 않습니다.
PDOSTATEMENT :: ROWCOUNT ()를 결합하여 영향을받는 행의 수를 결정하는 것이 수정 작업이 실제로 효과적인지 여부를 결정하는 열쇠입니다.
삽입 작업의 경우 pdo :: lastinsertid ()를 사용하여 삽입이 성공했는지 여부를 확인하십시오.
복잡한 운영에 거래 및 예외 캡처를 사용하여 데이터 운영의 무결성과 정확성을 보장하는 것이 좋습니다.
위의 방법을 통해 ErrorCode () 에만 의존하여 발생하는 논리적 취약점을 피하면서 데이터베이스 작업이 실제로 성공했는지 더 정확하게 결정할 수 있습니다.