Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:如何在mysqli提交期间检查错误?_Php_Mysqli_Commit - Fatal编程技术网

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

PHP:如何在mysqli提交期间检查错误?,php,mysqli,commit,Php,Mysqli,Commit,我正在使用mysqli commit语句插入大量记录,使用来自的代码。然后,我使用以下方法检查受影响的行: $mysqli->受影响的\u行 但是,即使插入了所有记录,我也没有收到任何受影响的行 如何在提交失败时检查并检索错误? 谢谢你你可以这样做: mysqli_autocommit($dbconn, FALSE); $errors = array(); if (!$mysqli->query(/* some SQL query */)) { $errors[] = $mys

我正在使用mysqli commit语句插入大量记录,使用来自的代码。然后,我使用以下方法检查受影响的行: $mysqli->受影响的\u行 但是,即使插入了所有记录,我也没有收到任何受影响的行

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

你可以这样做:

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数组中,这样您就可以知道哪里出错了。您还可以为查询添加带有标识符的键,以便知道哪个查询出错

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

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());
}
将返回受上次MySQL操作影响的行数

如果您正在执行类似的操作(伪代码):

您将无法获得插入的行数:
commit
指令是最后执行的一条指令,它不会“影响”任何行


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

成功时返回
TRUE
,成功时返回
FALSE
失败

如果返回
true
,则自当前事务开始以来,您以前的所有插入都已提交


如果发生错误,您可以使用和/或获取有关错误的信息

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