반응형
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
반응형
'programing' 카테고리의 다른 글
| Oracle에서 키워드 뒤에 테이블 변경 (0) | 2023.08.12 |
|---|---|
| jQuery에 대한 Google Closure Library의 기능은 무엇입니까? (0) | 2023.08.12 |
| mysql 구성을 시작할 수 없음: 복구 절차 (0) | 2023.08.07 |
| MySQL | 정의자('test'@'%')로 지정된 사용자가 없습니다. (0) | 2023.08.07 |
| ID에 대한 변수를 사용하여 jQuery에서 요소를 선택하려면 어떻게 해야 합니까? (0) | 2023.08.07 |