programing

RETURN 조항이 제약 조건 위반에 대한 예외를 초래하지 않는 것이 예상되는 동작입니까?

sourcejob 2023. 8. 12. 10:13
반응형

RETURN 조항이 제약 조건 위반에 대한 예외를 초래하지 않는 것이 예상되는 동작입니까?

이것은 일전에 제가 잘못 작성한 질문에 대한 후속 질문입니다.

그 모든 의견들의 마지막에, 저는 만약 제가 mysqli 예외를 사용한다면 답은mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);모든 진술의 반환 값을 처리하려고 시도하는 것보다, 요구하는.mysqli_report(MYSQLI_REPORT_OFF);내 문제는 해결될 것입니다.하지만, 제가 틀렸습니다.

PHP에서 SQL 오류를 잡기 위해 반환 값이나 예외가 사용되는지 여부와 상관없이,RETURNING절은 결과적으로 a가 됩니다.$stmt->execute()의 반환가.true아니요1062예외.

이전 질문에서 집계한 다음 테스트 코드의 작동 예가 여기에 제공됩니다.

문제는, 이제, 왜 그것이RETURNING제약 조건 위반으로 인해 첫 번째 실패가 아닌 "성공"으로 이어지는 절?예상된 동작입니까?사용하는 것이 "나쁜" 관행입니까?RETURNING의 절.INSERT INTO진술서?

CLI에서 동일한 문이 실행되는 경우(사용 및 사용 안 함)RETURNING와 대조적으로 1062로 실패합니다.RETURNING결과적으로NULL반환 가격

감사해요.


$mysqli->query("create table t (id int primary key unique, stat tinyint default 1)");

// First two blocks use default of: 
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
echo "mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);\n";

// Without RETURNING clause.
$stmt = $mysqli->stmt_init();
$stmt->prepare("insert into t (id) values(?)");
$id = 3;
$stmt->bind_param('i',$id);
$stmt->execute();
$id = 3;
try {
$stmt->execute();
echo "This doesn't execute;\n";
} catch (mysqli_sql_exception $e) {
    if ($e->getCode() === 1062) {
        echo "Without RETURNING: Duplicate id $id\n";
    } else {
        throw $e; // in case there is any other error
    }
}
$stmt->close();

// With RETURNING clause.
$stmt = $mysqli->stmt_init();
$stmt = $mysqli->prepare("insert into t (id) values(?) RETURNING id");
$id = 3;
$stmt->bind_param('i',$id);
$stmt->execute();
$id = 3;
try {
$stmt->execute();
echo "With RETURNING: No exception reported.\n";
} catch (mysqli_sql_exception $e) {
    if ($e->getCode() === 1062) {
        echo "Duplicate id $id\n";
    } else {
        throw $e; // in case there is any other error
    }
}
$stmt->close();

// Next two blocks use:
mysqli_report(MYSQLI_REPORT_OFF);
echo "\nmysqli_report(MYSQLI_REPORT_OFF);\n";

$stmt = $mysqli->stmt_init();
$stmt->prepare("insert into t (id) values(?)");
$id = 3;
$stmt->bind_param('i',$id);
echo "Without RETURNING: ";
var_dump($stmt->execute());
$stmt->close();

// With RETURNING clause.
$stmt = $mysqli->stmt_init();
$stmt->prepare("insert into t (id) values(?) RETURNING id;");
$id = 3;
$stmt->bind_param('i',$i);
echo "With RETURNING: ";
var_dump($stmt->execute());

결과:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Without RETURNING: Duplicate id 3
With RETURNING: No exception reported.

mysqli_report(MYSQLI_REPORT_OFF);
Without RETURNING: bool(false)
With RETURNING: bool(true)

언급URL : https://stackoverflow.com/questions/72455294/is-it-expected-behavior-for-a-returning-clause-to-result-in-no-exception-for-a-c

반응형