【问题标题】:Multiple Tables update in CodeIgniterCodeIgniter 中的多个表更新
【发布时间】:2016-10-07 07:40:58
【问题描述】:

我知道已经有人问过这个问题,但我似乎在当前正在进行的项目中实施解决方案时遇到了问题。我试图更新 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 中的一个,而似乎没有正确地对它们进行转义。请问我该如何解决这个问题?

【问题讨论】:

  • 我知道我可以通过交易实现我希望实现的目标,但我固执的自己不想这样做!
  • 什么版本的 CodeIgniter?
  • @eggyal 我目前正在使用 CodeIgniter 3.0.6
  • 试试$this->db->update("tin t, taxpayer tp");。虽然我认为它不会起作用,因为它将整个字符串作为一张表转义。你只需要使用事务。
  • $this->db->from('tin AS t')->join('taxpayer AS tp', 't.taxpayer_id = tp.id')->set($data)->where('t.tin', $usertin)->update(); 应该这样做吗?

标签: php mysql codeigniter model-view-controller


【解决方案1】:

这是一个旁白,但希望对您有所帮助。有很多不同的方法可以做到这一点,但让我们看看这部分:

public function update_taxpayer( $usertin, $data ){

    $this->usid = $usertin;

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

这有什么问题?如果用户未通过验证 - 不会发生其他任何事情。该方法的其余部分是无用的。因此,验证 - 应该在其他任何事情之前以另一种方法发生。然后您可以采取适当的措施。换句话说,如果用户未通过验证,那么您不应该使用期望进行两次更新的方法。

【讨论】:

  • 是的!你说得对!我会做一个编辑来反映这一点!感谢您指出这一点,我很感激。
  • 我觉得我做得过火了!我在我的控制器中进行了验证,然后在我的模型中进行了另一个验证...
【解决方案2】:

有人说得对,这可以通过多种方式实现,但我最终做的是使用查询绑定,也许不是最好的方法,但它解决了我想做的事情;

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;

}

如果您有更好的方法来做到这一点,我希望您让我们知道!谢谢!!

【讨论】:

  • 我相信使用查询绑定查询也被转义了!你说不是吗?
  • 哎呀你是对的,删除了我的评论。但仍然想知道交易或使用两种方法是否有好处....
  • @cartalot 我曾想过采用事务的方式,但后来我意识到我会面临同样的问题,因为这两个表有关系,一个依赖于外键!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
相关资源
最近更新 更多