在 CodeIgniter 中发送数据和重定向

Posted

技术标签:

【中文标题】在 CodeIgniter 中发送数据和重定向【英文标题】:Sending data along with a redirect in 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

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

【问题讨论】:

【参考方案1】:

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

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

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

这个(现已删除 - 这是一个 archived version)post 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 strings 和setting cookies。

【讨论】:

以上是关于在 CodeIgniter 中发送数据和重定向的主要内容,如果未能解决你的问题,请参考以下文章

单击 Razor Pages Asp 发送电子邮件和重定向

如何使用 php 发送欢迎电子邮件和重定向页面

转发(forward)和重定向(redirect)的区别

转发和重定向的区别

转向和重定向

JavaWeb学习笔记-08转发和重定向