在 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 中发送数据和重定向的主要内容,如果未能解决你的问题,请参考以下文章