PHP:如何在mysqli提交期间检查错误?

时间:2010-02-28 14:51:22

标签: php mysqli commit

我使用来自http://www.php.net/manual/en/mysqli.commit.php#88857的代码,使用mysqli commit语句插入大量记录。然后,我使用以下方法检查受影 $ mysqli-> affected_rows 但即使插入了所有记录,我也会得到零影响的行。

如何检查提交失败并检索错误? 谢谢

2 个答案:

答案 0 :(得分:9)

你可以这样做:

mysqli_autocommit($dbconn, FALSE);

$errors = array();

if (!$mysqli->query(/* some SQL query */)) {
    $errors[] = $mysqli->error;
}
// ... more queries like the above
if(count($errors) === 0) {
    $mysqli->commit()
} else {
    $mysqli->rollback();
    print_r($errors);
}

当查询出错时,它会将错误添加到$ errors数组中,这样您就会知道出了什么问题。您还可以添加带有查询标识符的密钥,以便了解哪个查询出错。

为了更好地处理,您可以为此编写UnitOfWork类:

class UnitOfWork
{
    protected $_db;
    protected $_errors;
    protected $_queries;
    public function __construct($db) {
        $this->_db = $db;
        $this->_errors = array();
        $this->_queries = array();
    }
    public function addQuery($id, $sql) {
        $this->_queries[$id] = $sql;
        return $this;
    }
    public function getErrors() {
        return $this->_errors;
    }    
    public function try() {
        $this->_db->autocommit($this->_db, FALSE);
        foreach($this->_queries as $id => $query) {
            if ($this->_db->query($query) === FALSE) {
                $this->_errors[$id] = $this->_db->error;
            }
        }
        $hasErrors = count($this->_errors);
        ($hasErrors) ? $this->_db->rollback() : $this->_db->commit();
        $this->_db->autocommit($this->_db, TRUE);
        return !$hasErrors; // return true on success
    }
}

你可以像

一样使用它
$unit = new UnitOfWork($mysqli);
$unit->addQuery('foo', 'SELECT foo FROM somewhere')
     ->addQuery('bar', 'SELECT bar FROM somewhereElse')
     ->addQuery('baz', 'SELECT baz WITH brokenQuery');

if($unit->try() === FALSE) {
    print_r($unit->getErrors());
}

答案 1 :(得分:3)

mysqli::affected_rows将返回受上一次MySQL操作影响的行数。

如果你正在做这样的事情(伪代码):

$db->query("insert ...");
$db->query("insert ...");
$db->query("insert ...");
$db->commit();
$num = $db->affected_rows();

您不会获得插入的行数:commit指令是最后执行的指令,并且它不会“影响”任何行。


如果您想知道mysqli::commit是否成功,您应该检查它的返回值(引用)

  

成功或TRUE时返回FALSE   故障。

如果它返回true,那么从当前事务开始的所有先前插入都将被提交。


如果发生错误,您可以使用mysqli::errno和/或mysqli::error获取相关信息。