CodeIgniter中的多个表更新

时间:2016-06-07 11:58:19

标签: php mysql codeigniter model-view-controller

我知道这个问题已被提出,但我似乎在目前正在进行的项目中实施解决方案时遇到问题。我试图更新CodeIgniter中的两个表,但框架的escape()数据库函数似乎做错了。下面是我正在处理的代码片段:

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中的一个,而不会正确地逃避它们。请问我该如何解决这个问题呢?

2 个答案:

答案 0 :(得分:0)

这是暂时的,但希望它会对你有所帮助。有很多不同的方法可以做到这一点,但我们来看看这个部分:

public function update_taxpayer( $usertin, $data ){

    $this->usid = $usertin;

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

这有什么问题?如果未验证用户 - 则不会发生任何其他情况。该方法的其余部分是无用的。因此,验证 - 应该先于其他任何方法和其他方法进行。然后你可以采取适当的行动。换句话说,如果用户未经过验证,那么您不应该使用期望进行两次更新的方法。

答案 1 :(得分: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;

}

如果您有更好的方法,我希望您能让我们知道!谢谢!!