2012-07-15 121 views
3

Zend_Db_Adapter::update()返回受更新操作影響的行數。 確定查詢是否成功的最佳方法是什麼?

$data = array(
    'updated_on'  => '2007-03-23', 
    'bug_status'  => 'FIXED' 
); 

$n = $db->update('bugs', $data, 'bug_id = 2'); 
+0

如果它不是全成 - 一個將引發異常 – zerkms 2012-07-15 10:59:13

+1

@zerkms我認爲,除非有一個適配器問題或將引發Zend_Db_Statement例外更新將返回0行,如果沒有行受影響不正確的查詢。然而,你可能會得到一個關於沒有足夠的參數綁定或一些這樣的Mysql/pdo錯誤。 – RockyFord 2012-07-15 11:18:45

+0

@RockyFord:如果發生異常 - 從此次調用中將不會返回任何信息 – zerkms 2012-07-15 11:22:03

回答

0

可能:

$data = array(
    'updated_on'  => '2007-03-23', 

    'bug_status'  => 'FIXED' 
); 
$result = $db->update('bugs', $data, 'bug_id = 2'); 
if ($result < $numRows) {//pass in numRows as method arg or hardcode integer. 
    //handle error 
} else { 
    return TRUE; 
} 

嘗試像這樣的想法是要驗證人想要更新的記錄數得到了更新。

+0

實際更新的行數取決於原始值。所以即使'$ result'等於0 - 那也不意味着發生了什麼錯誤 – zerkms 2012-07-15 12:05:16

5
$data = array(
    'updated_on' => '2007-03-23', 
    'bug_status' => 'FIXED', 
); 
$n = 0; 
try { 
    $n = $db->update('bugs', $data, 'bug_id = 2'); 
} catch (Zend_Exception $e) { 
    die('Something went wrong: ' . $e->getMessage()); 
} 
if (empty($n)) { 
    die('Zero rows affected'); 
} 
3

如果你只是在尋找一個布爾返回值,這個解決方案是最好的模型處理成功:

類Default_Model_Test擴展Zend_Db_Table類{

public function updateTest($testId, $testData){ 

    try { 

     $this->_db->update('test', $testData, array(
      'id = ?'  => $testId 
     )); 

     return true; 

    } 
    catch (Exception $exception){ 

     return false; 

    } 

} 

}

但是,更好的解決方案是從控制器級別處理成功,因爲它發出請求:

class Default_Model_Test extends Zend_Db_Table { 

    public function updateTest($testId, $testData){ 

     $this->_db->update('test', $testData, array(
      'id = ?'  => $testId 
     )); 

    } 

} 

class Default_TestController extends Zend_Controller_Action { 

    public function updateAction(){ 

     try { 

      $testId = $this->_request->getParam('testId'); 
      if (empty($testId)) throw new Zend_Argument_Exception('testId is empty'); 

      $testData = $this->_request->getPost(); 
      if (empty($testId)) throw new Zend_Argument_Exception('testData is empty'); 

      $testModel->updateTest($testId, $testData); 

     } 
     catch (Exception $exception){ 

      switch (get_class($exception)){ 

       case 'Zend_Argument_Exception': $message = 'Argument error.'; break; 
       case 'Zend_Db_Statement_Exception': $message = 'Database error.'; break; 
       case default: $message = 'Unknown error.'; break; 

      } 

     } 

    } 

} 

這與多個資源類型時,使用的異常類型的開關,並且做根據你的程序的需要,什麼是適當的是一個很好的解決方案。沒有什麼可以擺脫這種真空