2014-12-30 25 views
0

這是我的代碼從我的模型:你如何在Zend 2中的代碼中處理數據庫事務?

namespace Application\Model; 

use Zend\Db\Adapter\Adapter; 
use Zend\Db\TableGateway\AbstractTableGateway; 

class UsersTable extends AbstractTableGateway { 

    public function __construct(Adapter $adapter) { 
     $this->adapter = $adapter; 
    } 

    public function fetchAll() { 

     $results = $this->adapter->query("SELECT * FROM users"); 
     $results = $results->execute(); 
     return $results->current(); 

    } 
    public function insertNewUser($new_user_data){ 
     $ip = $_SERVER['REMOTE_ADDR']; 
     try { 
      $x = $this->adapter->getDriver()->getConnection()->beginTransaction(); 
      var_dump($x); 

      $insert = $this->adapter->query("INSERT INTO users (username,`name`,email,`password`, birthday,country,city,address,website,img_url,`date`,`update`,ip,email_confirm,`status`) values ('".$new_user_data['username']."','".$new_user_data['name']."','".$new_user_data['mail']."','".md5($new_user_data['password'])."','".$new_user_data['birthday']."','".$new_user_data['country']."','".$new_user_data['city']."','".$new_user_data['address']."','".$new_user_data['website']."','".$new_user_data['user_picture']."',NOW(), 
       NOW(),'".$ip."','0','normal')"); 
      $insert->execute(); 

      $x = $this->adapter->getDriver()->getConnection()->commit(); 

     } catch (Exception $e) { 
      $this->adapter->getDriver()->getConnection()->rollback(); 
      echo "Failed: " . $e->getMessage(); 
     } 

    } 

} 

插入查詢它工作正常,並執行它。但var_dump($ x)的結果是null。爲什麼?我如何測試它以確保它能正常工作?因爲我沒有錯誤或警告。

回答

0

如果$ x爲空,這不是什麼大問題,因爲方法ConnectionInterface :: beginTransaction()應該返回Connection本身($ this),它被稱爲fluent interface

事實是,並非所有驅動程序都能正確實現它。例如在Mysqli和Pgsql中,該方法沒有任何回報。

我不確定它在這裏使用一個事務是否相關...你有一個插入,所以如果它失敗了,沒有必要回滾任何東西?

當您希望多個數據庫更改爲原子時(任何其中一個更改中的任何錯誤都會回滾整個更改),事務是有用的。

+0

其實它會比較複雜,但是對於開始我只寫了一個簡單的查詢。但是,如果我修改查詢以便崩潰,它將不會進入catch部分。爲什麼?我猜代碼是錯誤的。我在誤解什麼? thx –

+0

我在這裏採取一個瘋狂的猜測,並假定在該方法內不會引發異常,因此您將永遠不會遇到您的catch條件。爲了在轉換失敗時拋出異常,你將不得不擴展行爲並自己添加。在這一點上,我沒有看到你爲什麼想要這樣做,你可以對此表示讚賞嗎? – cptnk

+0

也許你可以複製你的插入,以便第二次插入引發重複的條目異常...當然,用戶表中的一列應該是唯一的(電子郵件?)。 – goten4

相關問題