修复Codeigniter Active Record更新查询

时间:2014-02-07 17:29:15

标签: php codeigniter

这是一个用于在Codeigniter应用程序中处理模型的类

class MY_Model extends CI_Model {

    const DB_TABLE = 'abstract';
    const DB_TABLE_PK = 'abstract';

    private function update() {
        $this->db->update($this::DB_TABLE, $this, $this::DB_TABLE_PK);
    }
    public function save() {
        if (isset($this->{$this::DB_TABLE_PK})) {
            $this->update();
        }
        else {
            $this->insert();
        }}

这是从上面扩展的模型:

class Projects extends MY_Model {

    const DB_TABLE = 'projects';
    const DB_TABLE_PK = 'project_id';


    public $project_id;
    public $project_name;
    public $project_investment;
    public $project_employment;
    public $project_province;
    public $project_city;
    public $project_address;
    public $project_estimate;
    public $project_duration;
    public $project_construction;
}

根据Codeigniter用户指南,我认为更新查询的第3个参数存在问题(它只发送DB_TABLE_PK名称,在本例中为'project_id')但由于我是OOP的新手,不知道如何解决它。

Codeigniter用户指南:

$this->db->update('mytable', $data, "id = 4");

3 个答案:

答案 0 :(得分:0)

guide clrearly says

$data_array = array();
$where_array = array();
$this->db->update('table_name', $where_array, $data_array());

例如

$data_array = array('name' => 'Alpha', 'gender' => 'male'); // change column name to "Alpha", and gender column to 'male'
$where_array = array('id' => '4', 'allowed' => '1'); // update row with $data_array where id = 4 and allowed = 1
$this->db->update('person', $where_array, $data_array());

我强烈建议您使用探查器$this->output->enable_profiler(TRUE);将其置于控制器的任何位置,并且在您的页面下将有“探查器”显示发布时的发布/获取数据查询,会话和所有有用信息。

答案 1 :(得分:0)

上面的函数似乎没有update()

的完整WHERE语句
$this->db->update($this::DB_TABLE, $this, $this::DB_TABLE_PK); 

将转换为

UPDATE $this::DB_TABLE SET $this WHERE $this::DB_TABLE_PK

在上面的示例中,$ this :: DB_TABLE_PK是键的名称('project_id'),而不是其值。

我会坚持

$this->db->where($this::DB_TABLE_PK, $pk)->update($this::DB_TABLE, $this);

其中$ pk是PRIMARY KEY的实际值

答案 2 :(得分:0)

我修好了:

private function update() {
    $value=$this::DB_TABLE_PK;
    $this->db->update($this::DB_TABLE, $this, $this::DB_TABLE_PK.' = '.$this->$value);

}