2014-02-19 1 views
1

이 클래스를 사용하여 pdo 연결 및 데이터베이스 작업을 처리하지만 롤백 기능이 작동하지 않습니다. 나는 $의 인원 쿼리에서 의도적 인 오류를 만들고, 다음과 같은 오류가 발생합니다 :PHP PDO 오류 메시지가 반환되었지만 롤백이 작동하지 않습니다.

(!) Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'webbshop.prson' doesn't exist in C:\wamp\www\webbshop\includes\db_con.php on line 21 

그러나 다른 2 querys가 여전히 실행은 데이터베이스에 추가하고, 롤백 없습니다. 모든 기능을 작동 시키려면 어떻게해야합니까?

다른 게시물에서 InnoDB를 사용해야하므로 SHOW ENGINES sql 명령을 실행했으며 InnoDB에 대한 지원이 기본이고 주석이 다음과 같이 언급했습니다. "트랜잭션, 행 수준 잠금 및 외래 키 지원 "

PDO를 연결 클래스 :

<?php 
    class DB{ 

private $db_host = "localhost"; 
private $db_usr = "root"; 
private $db_pass = ""; 
private $db_name = "webbshop"; 
private $db; 

function __construct(){ 
    $this->db = new PDO('mysql:host=' . $this->db_host . ';' 
    .'dbname=' . $this->db_name, $this->db_usr, $this->db_pass); 
    $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
} 

function error(){ 

} €$€$£ 

function Trans(){ 
    $this->db->beginTransaction(); 
} 

function insert($sql){ 
    $stmt = $this->db->query($sql); 
} 

function fetch($sql){ 
    $stmt = $this->db->prepare($sql); 
    $stmt->execute(); 
    return $stmt->fetchAll(); 
} 

function lastInsertID() { 
    return $this->db->lastInsertId(); 
} 

function commitTrans(){ 
    $this->db->commit(); 
} 

function rollback() { 
    $this->db->rollBack(); 
} 

function __destruct() { 
    $this->db = null; 
} 
} 

그리고 이것은 내가 사용하는 코드가 querys 실행된다

<?php 
require 'db_con.php'; 

try { 
    $db = new DB(); 
    $db->Trans(); 
    $db->insert("INSERT INTO `webbshop`.`user` (`userID`, `nick`, `pass`) VALUES (NULL, '$_POST[nick]', '$_POST[pass]')"); 
    $nickID = $db->lastInsertID(); 
    echo $nickID; 

    $pers = "INSERT INTO `webbshop`.`prson` (`personID`, `userID`, `fname`, `lname`, `persnr`, `email`) VALUES (NULL, $nickID, '$_POST[firstname]', '$_POST[lastname]', '$_POST[personnr]','$_POST[email]')"; 
    $addr = "INSERT INTO `webbshop`.`address` (`addressID`, `userID`, `street`, `city`, `zip`) VALUES (NULL, $nickID, '$_POST[address]', '$_POST[city]', '$_POST[zip]')"; 

    $db->insert($pers); 
    $db->insert($addr); 

    $db->commitTrans(); 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "</br>"; 
    $db->rollback(); 
} 

답변

2

당신이 이노를 사용하고 있습니까? 트랜잭션을 사용하려면 InnoDB를 사용해야합니다. 그렇지 않으면 롤백이 작동하지 않습니다!

편집 : PDO에 ERRMODE_WARNING :: PDO를 변경하는

시도 :: ERRMODE_EXCEPTION

+0

예, 죄송합니다, 나는 그것을 작성하는 잊어 버렸습니다. 나는 다른 게시물과 사용자에게 SHOW ENGINES sql 커맨드를 읽었고 InnoDB에 대한 지원은 디폴트이고 : 트랜잭션, 행 레벨 잠금 및 외래 키를 지원한다고 말한다. – Cevil

+0

PDO :: ERRMODE_WARNING을 (를) PDO :: ERRMODE_EXCEPTION (으)로 변경하십시오. –

+0

도움을 주셔서 대단히 감사합니다. 매력처럼 일했습니다! – Cevil

0

이 문제는 나를 미치게 만들어 내 solution.The 주요 문제와 유 도움을 원하는 것은 우리가 서로 거래를 호출입니다 수업.

중요한 것은 InnoDB와 setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION)를 사용하고 마지막으로 연결이 오픈 싱글 톤 기능이어야한다는 것입니다.

내 코드는 다음과 같습니다

클래스 PDO_db { 보호 정적 $ _conn;

- [CONNECTION] -

public function __construct(){ 
    if(empty(self::$_conn)){ 
     try{ 
      self::$_conn = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_NAME, DB_USERNAME, DB_PASSWORD, array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES 'UTF8'")); 
      self::$_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     }catch(PDOException $e){ 
      die("No Connection :: ".DB_NAME." : ".$e->getMessage()); 
     } 
    }else{ 
     return self::$_conn; 
    } 
} 

- [TRANSACTION] -

public static function Trans(){ 
    return self::$_conn->beginTransaction(); 
} 

- [COMMIT] -

public static function Commit(){ 
    return self::$_conn->commit(); 
} 

- [ROLLBACK ] -

public static function Rollback(){ 
    return self::$_conn->rollBack(); 
} 

- [삽입] -

public static function Insert($tablo, $rows){ 
} 

}

클래스 dB {

public function __construct(){ 
    $this->prodb = new PDO_db(); 
} 

public function datainsert(){ 
    $this->prodb->Trans(); 
    try{ 
     $datainsert = $this->prodb->Insert($table, $data); 
     $this->prodb->Commit(); 
     $message = "Insert True"; 
     return $message; 
    }catch(Exception $ex){ 
     $this->prodb->Rollback(); 
     $message = "Insert Flase"; 
     return $message; 
    } 
} 

은}