【问题标题】:Sending data along with a redirect in CodeIgniter在 CodeIgniter 中发送数据和重定向
【发布时间】:2010-12-22 16:31:30
【问题描述】:

我有一个简单的 C(CRUD)函数,我想发送一条消息(错误或成功)以及从我编写的“插入”函数重定向。有没有办法通过重定向来遵守 POST 字段?

在伪代码中我有:

function view_all{
    //set up some initial variables
    $this->load->view(viewing_page, $data)
}

function insert{
    if ($this->db->insert(my_table, $_POST)){
        $message = "All's well";
    }
    else {
        $message = "whoops!";
    }
    redirect(view_all);
}

因此,viewing_page 理想情况下应该有类似

if (isset($message)){
    echo $message
}

所以在第一次通过时,我看不到任何消息,并且当/如果有插入时,它会弹出与消息相同的页面。谢谢!

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    我相信redirect 使用header()。如果是这样,我不相信您可以将数据与位置标头一起发送。您可以使用会话变量或(不太好)将查询字符串附加到位置 URL 来完成同样的事情。

    对于在 CodeIgniter 中执行此操作的“公认”方式,请查看session class 文档页面的一半以上。

    CodeIgniter 支持“flashdata”,即仅可用于下一个服务器请求的会话数据,然后自动清除。这些非常有用,通常用于信息或状态消息(例如:“记录 2 已删除”)。

    这个(现已删除 - 这是一个 archived versionpost on flash messages 涵盖了查询字符串和会话 var 方法。

    更新:总结现在删除的帖子,它显示了对消息进行urlencoding和附加为查询字符串(来自帖子的示例):

    header('Location: http://www.example.com/index.php?message='.urlencode($message));
    

    并使用两个框架设置“flash”变量(来自帖子的示例):

    //Zend Framework
    $flashMessenger = $this->_helper->FlashMessenger;
    $flashMessenger->setNamespace('actionErrors');
    $flashMessenger->addMessage($message);
    
    //CakePHP
    $this->Session->setFlash('Your post has been saved.');
    $this->redirect('/news/index');
    

    当然你可以直接使用$_SESSION 做大致相同的事情(我的例子):

    //first request
    $_SESSION['flash'] = 'This is a simple flash message.';
    //next request
    $flash = $_SESSION['flash'];
    unset($_SESSION['flash']); //flash is one time only
    

    【讨论】:

    • Session 是完成此任务的唯一方法,除非您使用与 CI 的 URI 路由混淆的查询字符串。对此答案 +1。
    • 就像 Jessedc 所说,会话是唯一的方法。我将闪存数据用于此类应用程序。我通常设置闪存数据,重定向。它还有助于防止用户重新提交数据。
    • @TimLytle 您提到的帖子链接不起作用。这是关于什么的?
    • @MuhammadAhmadZafar 更新了一些来自缓存页面的示例。
    【解决方案2】:

    您可以在 CI Session Class 中使用 Flashdata。这是文件中所说的:

    CodeIgniter 支持“flashdata”或会话数据 可用于下一个服务器请求,然后自动 清除。这些可能非常有用,通常用于 信息或状态消息(例如:“记录 2 已删除”)。

    注意:Flash 变量以“flash_”开头,因此请避免在您自己的会话名称中使用此前缀。

    添加闪存数据:

    $this->session->set_flashdata('item', 'value');
    

    您也可以将数组传递给set_flashdata(),方式与set_userdata() 相同。

    读取 flashdata 变量:

    $this->session->flashdata('item');
    

    如果您发现需要通过附加请求保留 flashdata 变量,可以使用keep_flashdata() 函数来实现。

    $this->session->keep_flashdata('item');
    

    【讨论】:

      【解决方案3】:

      我想指出 CodeIgniter 在注销时会破坏当前会话。由于您不能使用闪存或会话存储,这使得传递“您已登录/注销”的消息变得更加困难。如果在登录和退出状态之间转换时需要传递消息,我建议使用memcached。其他选项(如上所述)是using URL query stringssetting cookies

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-03
        • 2016-09-29
        • 2013-05-28
        • 1970-01-01
        • 2017-06-30
        • 2018-06-04
        • 2012-03-03
        相关资源
        最近更新 更多