mysqli-> error:最後のクエリのみですか、それともクエリグループからの最後のエラーですか?
-
11-07-2019 - |
質問
mysqliを初めて使用します。以下のようにすると、errnoは最後のクエリのエラーではなく最後のエラーに設定されることを確認しようとしています。
これは適切なプラクティスですか、それともすべてのクエリの間にエラーをチェックする必要がありますか?
ありがとう!
$mysqli->autocommit(FALSE);
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
if ( 0==$mysqli->errno ) {
$mysqli->commit();
} else {
$mysqli->rollback();
// Handle error
}
解決
mysqli_errno— 最新の関数呼び出しのエラーコードを返します。
他のヒント
いいえ-最後のmysqli関数呼び出しのエラーコードを報告します。ゼロは、最後の関数呼び出しでエラーが発生しなかったことを意味します。そのため、中間の1つに障害が発生した場合、最後のチェックのみではそのことを知ることができません。
つまり、はい、各関数呼び出しの後にエラーコードを確認する必要があります。エラーは $ mysqli-> query()
の戻り値によっても示されることに注意してください。 mysqli_errno ドキュメントの例を言い換えます:
if (!$mysqli->query("INSERT ...")) {
printf("Errorcode: %d\n", $mysqli->errno);
}
いいえ、すべてのクエリの間にチェックインする必要があります。常に最後のクエリに対してのみエラーが発生するためです...最後に一つずつ...
すべてのエラーをキャッチするためのIMOの最良の方法および最も簡単な方法は、mysqliクラスを拡張することです。
class DBException extends Exception {
}
class DBConnectException extends DBException {
}
class DBQueryException extends DBException {
}
class DB extends MySQLi {
private static $instance = null;
private function __construct() {
parent::__construct('host',
'username',
'passwd',
'dbname');
if ($this->connect_errno) {
throw new DBConnectException($this->connect_error, $this->connect_errno);
}
}
private function __destructor() {
parent::close();
}
private function __clone() {
}
public static function getInstance() {
if (self::$instance == null) {
self::$instance = new self();
}
return self::$instance;
}
public function query($query, $resultmode = MYSQLI_STORE_RESULT) {
$result = parent::query($query, $resultmode);
if (!$result) {
// or do whatever you wanna do when an error occurs
throw new DBQueryException($this->error, $this->errno);
}
return $result;
}
}
所属していません StackOverflow