php + mysql все еще совершает - PullRequest
0 голосов
/ 21 апреля 2020

У меня 3 mysql запросов, которые я выполняю с php, 1 успешно, а 2 - нет. Однако я установил фиксацию и откат. Когда я делаю var_dump для коммита, он возвращает true, успешный запрос вставляет значение в БД вместо отката.

// соединение установлено

function __construct() {

    $this->error['State']=0;
    $this->error['Msg']="";

    try {
        $db_con=mysqli_connect($this->server, $this->dbuname, $this->dbpassw, $this->database);
        $this->db_connection=$db_con;
        mysqli_autocommit($db_con,FALSE);
        mysqli_begin_transaction($this->db_connection);         
    }

    catch (Exception $e) {
        $this->setError("Error: Please try again");
    }

} 

/ / запрос и фиксация

public function result($sql) {

    try {
        $result=mysqli_query($this->db_connection,$sql);
        if($result) {
            $this->result=$result;
        }else {
            $this->setError("Error: Please try again");
        }
    }

    catch (Exception $e) {
        $this->setError("Error: Please try again");
    }   

}//end of result function   

public function commit() {

    $mysqli=$this->db_connection;
    $c=mysqli_commit($mysqli);
    if (!$c) {
        $this->setError("Error: Please try again");
        mysqli_rollback($mysqli);
    }else{
        return 1;
    }

}

// запрос

public function make($i){

    $sql="INSERT INTO t1(tcol1, tcol2, tcol3) VALUES ";
    ...

    $this->commit();

    $this->close_conn();

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Проблема заключалась в том, что таблицы были isam, а база данных была innoDB. Когда я изменил таблицы на innoDB, он начал работать.

0 голосов
/ 21 апреля 2020

Если вы скажете, что это будет зафиксировано, то оно будет зафиксировано. Он не будет откатываться только потому, что в одном из операторов произошла ошибка. Вы должны проверять наличие ошибок каждый раз, когда выполняете запрос, а затем выполнять откат в случае возникновения ошибки. Или просто проверьте в конце перед совершением:

public function commit() {

    $mysqli=$this->db_connection;
    if ($this->error['State'] === 0) {
        $this->setError("Error: Please try again");
        mysqli_rollback($mysqli);
    } else {
        $c = mysqli_commit($mysqli);
        if ($c) return 1;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...