2016-06-07 52 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