PHP: Как я могу проверить ошибки во время фиксации mysqli?

Я вставляю много записей с помощью mysqli оператор фиксации, с помощью этого кода из http://www.php.net/manual/en/mysqli.commit.php#88857. Я затем проверяю затронутое использование строк: $mysqli-> affected_rows, но даже при том, что все записи были вставлены, я добираюсь, нуль влиял на строки.

Как я могу проверить, когда неудавшаяся фиксация и получает ошибку?Спасибо

5
задан Alex 28 February 2010 в 14:51
поделиться

2 ответа

Вы можете сделать что-то вроде этого:

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());
}
10
ответ дан 18 December 2019 в 13:13
поделиться

mysqli :: loaded_rows вернет количество строк, затронутых последней операцией MySQL.

Если вы делаете что-то вроде этого (псевдокод):

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

Вы не получите количество вставленных строк: инструкция commit является последней выполненной, и она не выполняется » затронуть "любую строку.


Если вы хотите узнать, завершился ли mysqli :: commit успешно или нет, вы должны проверить его возвращаемое значение (цитируется) :

Возвращает ИСТИНА при успехе или FALSE при неудаче.

Если он вернул true , то все ваши предыдущие вставки с начала текущей транзакции будут зафиксированы.


И если произошла ошибка, вы можете использовать mysqli :: errno и / или mysqli :: error , чтобы получить информацию об этом.

4
ответ дан 18 December 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: