提问人:Eli 提问时间:11/26/2008 最后编辑:Eli 更新时间:3/19/2013 访问量:4717
mysqli->error:是仅针对最后一个查询,还是针对查询组中的最后一个错误?
mysqli->error: Is it for the last query only, or for the last error from the query group?
问:
我是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
}
答:
4赞
Bill Karwin
11/26/2008
#1
否 -- 它报告上次 mysqli 函数调用的错误代码。零表示上次函数调用时未发生错误。因此,如果中间的一个失败了,您不会通过最后检查来了解它。
换句话说,是的,您需要在每次函数调用后检查错误代码。请注意,错误也由 的返回值指示。转述mysqli_errno文档中的示例:$mysqli->query()
if (!$mysqli->query("INSERT ...")) {
printf("Errorcode: %d\n", $mysqli->errno);
}
3赞
Ray
11/26/2008
#2
mysqli_errno — 返回最近一次函数调用的错误代码。
1赞
Dev
2/22/2011
#3
不,您必须在每个查询之间签入,因为它总是只会在最后一个查询中给您错误......因此,如果您的第一个查询失败,最后一个查询正确执行,那么您不会收到错误......所以检查毕竟一个一个地查询,而不是最后......
1赞
user2176127
3/19/2013
#4
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;
}
}
评论