codeigniter方法在控制器上丢失数据

时间:2013-02-26 14:57:35

标签: php codeigniter

我有一个应用程序,我可以编辑数据库表的字段。一切都很好,数据更新,除非我去我想要更新的字段,而不是更改文本,将字段设置为空白。以这种方式我得到PHP错误,因为(我猜)我的控制器的方法失去了该行的那一行的id:

如果有人能帮助我,我会很高兴,谢谢你。

我使用方法获取的视图文件的一部分传递表行的id(edit_fuga.php)。

 <div id='tab2'>    
            <?php
            $query = $this->db->query("SELECT * FROM fugas WHERE tipo_fuga='2';");

            foreach ($query->result_array() as $row)
            {
                echo "<input type='hidden' name='id_fuga' value='". $row['id_fuga']."'>";
                echo $row['desc_fuga']."&nbsp;&nbsp;<a class='button' href='http://localhost/code/index.php/fugas/editar_fuga?var1=".$row['id_fuga']."'>Editar</a>";
                echo "<br/>";
            }

            ?>


        </div>

我被重定向的视图(editar_fuga.php):

<?php echo validation_errors(); ?>

<?php echo form_open('fugas/editar_fuga') ?>

<?php 

$query = $this->db->query("SELECT desc_fuga_table FROM tipos_fuga where tipo_fuga_table='".$fuga_selected['tipo_fuga']."';");

foreach ($query->result() as $row)
{
   echo $row->desc_fuga_table;
}

$tipo_fuga_selected=$row->desc_fuga_table;

    ?>

    <label for="tipo_fuga"><?php echo $tipo_fuga_selected; ?></label><br/>
    <p/>


    <label for="desc_fuga">Desc da fuga:</label><p/> 
    <textarea rows="4" cols="50" name="desc_fuga"><?php echo $fuga_selected['desc_fuga']; ?></textarea><p/>

    <input type="hidden" name="id_fuga" value="<?php echo $fuga_selected['id_fuga']; ?>">
    <input type="submit" name="submit" value="Alterar Fuga" /><p/>

    <INPUT Type="button" VALUE="Voltar" onClick="history.go(-1);return true;">

</form>

视图editar_fuga.php的控制器上的方法

public function editar_fuga(){

        $fuga_id = $this->input->get('var1');
        var_dump($fuga_id);

        $this->load->helper('form');
        $this->load->library('form_validation');
        //$this->load->view('templates/header');

        $this->form_validation->set_rules('desc_fuga', 'Descrição da fuga acidental', 'required');

    if ($this->form_validation->run() === FALSE)
    {
        $data['fuga_selected'] = $this->fugas_model->get_fuga($fuga_id);        
        $this->load->view('fugas/editar_fuga', $data);
    }
    else
    {
        $this->fugas_model->update_fuga();
        echo "Fuga alterada com sucesso.<br/><br/>";
        $this->load->view('fichas/index');
        }

    }

Fuga模型:

    public function update_fuga(){



    $data = array(
        'desc_fuga' => $this->input->post('desc_fuga')
    );

    $id=$this->input->post('id_fuga');

    $this->db->where('id_fuga', $id);
    $this->db->update('fugas', $data);

}

public function get_fuga($fuga_id){

    var_dump($fuga_id);

    $query = $this->db->query("SELECT * FROM fugas where id_fuga='".$fuga_id."';");

    foreach ($query->result_array() as $row)
    {
        $data_fuga = array(
    'id_fuga' => $row['id_fuga'],
    'tipo_fuga' => $row['tipo_fuga'],
    'desc_fuga' => $row['desc_fuga']
    );
    }

    return $data_fuga;

}

2 个答案:

答案 0 :(得分:0)

首先,你做的事情完全错了。

您应该阅读一些有关MVC的教程。

您绝不应该在视图文件中执行数据库操作。 您应该首先阅读优秀的codeigniter用户指南和一些关于MVC真正的通用文章:维基百科的示例是here

您还应该查看codeigniter上的活动记录,以便您可以使用而不是->query(),这是强烈劝阻的,并且只应在少数情况下使用,这些情况下存在一些无法完成的非常复杂的查询与AR。

*在发表评论后进行修改

活动记录是个人偏好,但我相信新手使用它会更容易,更安全,因为输入会自动转义。是的codeigniters AR不是实际的Active Record实现,但它仍然比裸露更好SQL。

总而言之,您的逻辑在控制器上,您的模型上的数据库交互以及您视图中的html(以及一些次要查看逻辑)。

答案 1 :(得分:0)

错误在这里,这是一种不好的做法。您不应混合视图和数据库访问

此方法应该在您的模型中     

$query = $this->db->query("SELECT desc_fuga_table FROM tipos_fuga where tipo_fuga_table='".$fuga_selected['tipo_fuga']."';");

foreach ($query->result() as $row)
{
   echo $row->desc_fuga_table;
}

$tipo_fuga_selected=$row->desc_fuga_table;

    ?>

因为你没有第二次传递$ fuga_selected ['tipo_fuga'],你就不会得到任何结果,这意味着查询将为空,表示$ row将永远不会实例化

所以给出错误的行就是这个

$tipo_fuga_selected=$row->desc_fuga_table;

正如@ tix3所说,你应该阅读更多关于MVC的内容,因为你有点搞乱了