【问题标题】:Codeigniter - Variable undefined after redirectCodeigniter - 重定向后变量未定义
【发布时间】:2014-09-02 18:14:37
【问题描述】:

在做项目时遇到一些问题。这就是正在发生的事情:通过选择我选择我想要编辑的用户。一个表格包含该用户发布的所有消息。单击编辑后,使用 Ajax 会出现一个带有可编辑字段的窗口。然后,提交信息后,会出现以下消息:

消息:未定义变量:数据

目前,在提交之后,我添加了一个重定向,通过用户 ID 的 url 再次将我发送到表格视图。

下面是更能说明情况的代码:

   function traer_tabla(){ //Here is the function that loads the table after post
     $nombre = $this->input->post('nombre');
     $data['titulo'] = 'Update con codeIgniter';
    $data['mensajes'] = $this->datos_model->mensajes($nombre);
    $this->load->view('datos_view', $data);

}

重定向到traer_tabla的函数

       function actualizar_datos()    
       {        
           $id = $this->input->post('id_mensaje');
           $nombre = $this->input->post('nombre');
           $email = $this->input->post('email');
           $asunto = $this->input->post('asunto');
           $mensaje = $this->input->post('mensaje');

           $actualizar = $this->datos_model->actualizar_mensaje($id,$nombre,$email,$asunto,$mensaje);
           if($actualizar)
           {
            $this->session->set_flashdata('actualizado', 'El mensaje se actualizó correctamente');
            redirect(base_url().'datos/traer_tabla/'.$id, 'refresh'); 
           }
}

最后,模型中失去价值的函数:

function mensajes($nombre){        
   $this->db->where('id', $nombre);
$query = $this->db->get('mensajes');
    foreach ($query->result() as $fila)
    {
        $data[] = $fila;
    }
return $data;}

如果我尝试直接访问函数而不是先通过选择表单,则会出现同样的问题。

选择要编辑的用户后,如何返回表格视图?

编辑:添加重定向到 traer_tabla() 的表单

  function mostrar_datos()
{

    $id = $this->input->post('id'); //This post is from the table when the user click edit button

    $edicion = $this->datos_model->obtener($id);

        $nombre = array(
            'name' => 'nombre',
            'id' => 'nombre',
            'value' => $edicion->nombre
        );
        $email = array(
            'name' => 'email',
            'id' => 'email',
            'value' => $edicion->email
        );
        $asunto = array(
            'name' => 'asunto',
            'id' => 'asunto',
            'value' => $edicion->asunto
        );
        $mensaje = array(
            'name' => 'mensaje',
            'id' => 'mensaje',
            'cols' => '50',
            'rows' => '6',
            'value' => $edicion->mensaje
        );
        $submit = array(
            'name' => 'editando',
            'id' => 'editando',
            'value' => 'Editar mensaje'
        );
        $oculto = array(
            'id_mensaje' => $id
           );

        ?>
        <?= form_open(base_url() . 'datos/actualizar_datos','', $oculto) ?>
        <?= form_label('Nombre') ?>
        <?= form_input($nombre) ?>
        <?= form_label('Email') ?>
        <?= form_input($email) ?>
        <?= form_label('Asunto') ?>
        <?= form_input($asunto) ?>
        <?= form_label('Mensaje') ?>
        <?= form_textarea($mensaje) ?>

        <?= form_submit($submit) ?>
        <?php    
        }    

【问题讨论】:

  • 通过 set_flashdata() 设法让它“工作”。但老实说,我相信这不是问题的真正解决方案。显然,如果用户刷新,数据丢失,未定义变量消息重新出现。

标签: php codeigniter variables redirect


【解决方案1】:

如上所述,当您重定向时会丢失变量数据,因此解决方案是将数据存储在会话中。

在您的情况下,您可以做的是使用 session 来存储“名词”,因为我看到您正在尝试访问 $nombre = $this-&gt;input-&gt;post('nombre');,我猜这将无法正常工作。

像这样在会话中存储“名词”

$this->session->set_userdata('number',$nombre);

并像这样在任何你想要的地方访问它:

$this->session->userdata('number');

还要注意你的重定向是

redirect(base_url().'datos/traer_tabla/'.$id, 'refresh');

这意味着您将参数“id”传递给您的函数 traer_tabla。如果您想传递该变量,您想让您的函数像这样接收它。

function traer_tabla($id,$number)
{
//code goes here
}

同样,如果您不想在会话中存储您的号码,您可以通过上面的 url 传递它。

如有任何疑问,请随时告诉我。

【讨论】:

    【解决方案2】:

    如果您将浏览器指向另一个脚本,当前脚本定义的所有变量都会 执行完毕后销毁。

    要跨脚本保存变量,您需要使用会话或 cookie。

    script1.php

    session_start();
    $data['titulo'] = 'Update con codeIgniter';
    $_SESSION['data']=$data;
    header('location:script2.php');
    die();
    

    script2.php

    session_start();
    echo $_SESSION['data']['titulo'];
    

    【讨论】:

    • 没什么。如果 die 在函数中,我点击提交后会出现一个空白页面。如果没有,编辑后会出现相同的未定义变量消息。而且,script2 是actualizar_datos 还是视图?
    • 那么您是否使用表单进行重定向?也许您应该将表单标记添加到帖子中
    • 将表单添加到帖子中。
    【解决方案3】:

    找到解决方案。我没有使用 set_flashdata(),而是使用了 set_userdata()。现在,它返回到表格,刷新后,表格继续出现。

    当我选择要编辑的用户时,还添加了 unset_userdata()。

    感谢您的帮助。

    【讨论】:

    • 这就是我在回答中建议您的内容,请接受它作为答案,因为它将帮助其他有需要的用户。
    猜你喜欢
    • 2020-12-04
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    相关资源
    最近更新 更多