2014-02-19 48 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的?要使用事務你應該使用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),最後你的連接必須打開singleton函數。

我的代碼是:

類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(); 
} 

- [INSERT] -

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

}

類分貝{

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; 
    } 
} 

}