2016-06-07 50 views
0

我知道這個問題已經被問到,但我似乎在實施目前正在處理的項目中的解決方案時遇到問題。我試圖更新CodeIgniter中的兩個表,但框架的escape()數據庫函數似乎做錯了事情。下面是代碼片段很努力:在CodeIgniter中更新多個表格

public function update_taxpayer($usertin, $data){ 

    $this->usid = $usertin; 

    if($this->verify_user_tin($this->usid)){ 

     $this->db->set($data); 

     $this->db->where('t.taxpayer_id','tp.id'); 
     $this->db->where('t.tin', $usertin); 
     $this->db->update("tin AS t, taxpayer AS tp"); 

     $updated_rows = $this->db->affected_rows(); 

    } 

} 

,同時試圖從我的控制器運行更新我得到這個錯誤:

Error Number: 1146 

Table 'crsirs.tin as t, taxpayer' doesn't exist 

UPDATE `tin AS t, taxpayer` AS `tp` SET `t`.`address` = '', `t`.`name` = 'MAPS PROJECT CROSS RIVER STATE', `tp`.`lastModified` = '2016-06-07 13:54:27', `tp`.`city` = '', `tp`.`email` = '', `tp`.`mobile` = '', `tp`.`phone` = NULL WHERE `t`.`taxpayer_id` = 'tp.id' AND `t`.`tin` = '1902406349-0001' 

Filename: C:/Program Files/wamp/www/CRSIRS/system/database/DB_driver.php 

Line Number: 691 

的escape()函數似乎是合併這兩個表作爲這一行中的一個tin AS t, taxpayer,似乎沒有妥善逃避它們。請問我該如何解決這個問題?

+0

我知道我可以實現我希望通過交易實現的目標,但我固執的自我並不想這麼做! – aknessy

+0

什麼版本的CodeIgniter? – eggyal

+0

@eggyal我目前使用CodeIgniter 3.0.6 – aknessy

回答

0

這是一個旁白,但希望它會對你有所幫助。有很多不同的方法可以做到這一點,但讓我們看看這個部分:

public function update_taxpayer($usertin, $data){ 

    $this->usid = $usertin; 

    if($this->verify_user_tin($this->usid)){ 

這是什麼問題?如果用戶未被驗證 - 沒有其他事情發生。該方法的其餘部分是無用的。因此,驗證 - 應該在其他任何事情之前以另一種方法進行。然後你可以採取適當的行動。換句話說,如果用戶沒有被驗證,那麼你不應該在一個方法,期望做兩個更新。

+0

是啊!你是對的!我會做一個編輯來反映這一點!感謝您指出,我很感激。 – aknessy

+0

我覺得我太過分了!我在我的控制器中有一個驗證,然後在我的模型中有另一個驗證... – aknessy

0

有人正確地說過,這可以通過很多方式來實現,但我最終做的是使用查詢綁定,也許不是最好的方法,但它解決了我想要做的事情;

public function update_taxpayer($usertin, $data, $data_tp = null){ 

    //Tax payers TIN 
    $this->usid = $usertin; 
    //Rows Affected by update 
    $updated_rows = 0; 

    /* 
    * Since CodeIgniter ActiveRecord doesn't seem to work with 
    * multiple table updates, we'll attempt to update a user's record 
    * using Query Binding. 
    */ 

    $sql = 'UPDATE tin t, taxpayer tp 
        SET t.address = ?, t.name = ?, 
         tp.street1 = ?, tp.street2 = ?, 
         tp.lastModified = ?,tp.city = ?, tp.email = ?, 
         tp.mobile = ?, tp.phone = ? 
       WHERE t.taxpayer_id = tp.id 
        AND t.tin = ?'; 

    $this->db->query($sql, 
         array( 
           $data[0], $data[1], $data[2], 
           $data[3], $data[4], $data[5], 
           $data[6], $data[7], $data[8],$this->usid 
          ) 
        ); 

     $updated_rows = $this->db->affected_rows(); 

    /** 
    * return true on success | false on failure 
    **/ 

    return ($updated_rows > 0) ? true : false; 

} 

如果你有更好的方法來做到這一點,我想讓你知道!謝謝!!

+0

我相信與查詢綁定查詢也逃脫!你是說不是嗎? – aknessy

+0

哎呀你是對的,刪除我的評論。但仍然懷疑是否交易或使用兩種方法會有好處...... – cartalot

+0

@cartalot我曾想過要走交易的道路,但後來我意識到我會面臨同樣的問題,因爲這兩個表有關係一個依賴於外鍵! – aknessy