PHP联系表格问题 $_POST, $_GET $_SESSION

PHP Contact Form question $_POST, $_GET $_SESSION

提问人:Jeff 提问时间:8/19/2009 最后编辑:Jeff 更新时间:8/19/2009 访问量:779

问:

编辑:

所以我剩下的问题是:(1) 我应该使用 302 还是 303 进行 header() 重定向?我相信 303 是正确的方法。(2) $_SESSION 是将变量传递到 ?contact=thankyou 页面的最佳方式吗?

我修改后的代码:

if ( isset( $_POST[ 'submit' ] ) )
{
  if ( is_bot() )
  {
    header( "Location: http://www.example.com/contact/?contact=thankyou",
        TRUE, 303 );
    exit;
  }
  elseif ( is_input_error() )
  {
    // show error form stuff...
  }
  else
  {
    contact_send_email();
    header( "Location: http://www.example.com/contact/?contact=thankyou",
        TRUE, 303 );
    exit;
  }
}

原始(已解决):

我只是在学习 PHP 的 _POST 美元、_GET 美元和表单。我有一个联系表格,一开始很简单,但现在对我的经验来说变得有点复杂。

// curly braces left out for brevity
if ( isset( $_POST[ 'submit' ] ) )
  if ( is_bot() )
    header( "Location: http://www.example.com/contact/?contact=thankyou", 
            TRUE, 303 );
  if ( is_input_error() )
    header( "Location: http://www.example.com/contact/?contact=error", 
            TRUE, 303 );
  else
    contact_send_email()
    header( "Location: http://www.example.com/contact/?contact=thankyou", 
            TRUE, 303 );
  1. 作为新手,我想我想知道你是否看到任何明显的问题?
  2. 我的重定向代码看起来是否完整有效?header()
  3. 重定向后传递变量的最常见和/或推荐的方法是什么?是用 ,还是有更好的方法?我以前从未使用过会话,所以我对它们有点害怕。$_POSTheader()$_SESSION

编辑:顺便说一句,我想通过重定向来避免“刷新-重新发送”非常可怕和邪恶的警告消息。header()$_GET

PHP 重定向

评论

0赞 Sinan Ünür 8/19/2009
困境是什么?google.com/search?q=define%3Adilemma

答:

0赞 warpech 8/19/2009 #1

第一个问题。我建议在 之后使用括号,因为您的条件块看起来无效。{}if

第二个问题。我认为您不需要 303 状态代码。一个典型的会做。header('Location: ...');

至于第三个问题。两种可能的解决方案是:会话或数据库。

总而言之,我会这样做:

if ( isset( $_POST[ 'submit' ] ) )
{
  if ( is_bot() )
  {
    header( "Location: http://www.example.com/contact/?contact=thankyou" );
  }
  elseif ( is_input_error() )
  {
    header( "Location: http://www.example.com/contact/?contact=error" );
  }
  else
  {
    contact_send_email();
    header( "Location: http://www.example.com/contact/?contact=thankyou" );
  }
}

评论

1赞 warpech 8/19/2009
第二个想法,我认为在“输入错误”的情况下,您不应该重定向到错误页面。您应该在当前页面上显示错误消息。
0赞 warpech 8/19/2009
是的,并添加 exit();正如 Gumbo 所提议的那样
0赞 Jeff 8/19/2009
这是一个很好的信息,这正是我最初设置表单的方式——错误页面不使用 header() 重定向,但其他两个场景使用它。
0赞 Jeff 8/19/2009
对于那些感兴趣的人,303 重定向是 POST 后的正确方法。
1赞 Gumbo 8/19/2009 #2

作为新手,我想我想知道你是否看到任何明显的问题?

我不知道你是否是故意的,但你的代码读起来翻译成一个带有大括号的版本,如下所示:

if (isset($_POST['submit'])) {
    if (is_bot()) {
        header("Location: http://www.example.com/contact/?contact=thankyou", TRUE, 303);
    }
}
if (is_input_error()) {
    header("Location: http://www.example.com/contact/?contact=error", TRUE, 303);
} else {
    contact_send_email();
}
header("Location: http://www.example.com/contact/?contact=thankyou", TRUE, 303);

如果缺少大括号,则块的主体始终只是下一个语句。我怀疑你真的想要那个。if

我的 header() 重定向代码看起来是否完整有效?

我会在每个之后添加一个以防止执行进一步的代码。但其余的看起来都不错。exitheader

评论

0赞 Jeff 8/19/2009
戈奇亚。为了简洁起见,我省略了大括号。
0赞 JonB 8/19/2009 #3

从标头功能中删除 303。这是您想要的 302 临时重定向,如果您未显式设置,该函数将默认使用它。

一个小点,但值得注意;选择错误的HTTP重定向状态代码会非常轻微地扰乱SEO。

评论

0赞 Jeff 8/19/2009
我读到此页面上的重定向代码应该是 303:ajaxray.com/blog/2008/01/12/......维基百科在这里引用了:en.wikipedia.org/wiki/Post/Redirect/Get
0赞 Jeff 8/19/2009
为了补充我上面的评论,评论者(Sam)说: 要记住的一件事是,您的HTTP状态代码也应该是303而不是302,这样它就符合标准,并且对于可能出现的新浏览器来说是安全的。
0赞 JonB 8/19/2009
只要读了这些东西,它就很有道理了。唯一的问题是,你是否更担心你的网站在未来得到证明,或者确保它被老客户(w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4)使用。
0赞 Jeff 8/19/2009
做一些谷歌搜索,我也发现了关于重定向的这个:drupal.org/node/355157
0赞 Jeff 8/19/2009
似乎正确的答案是使用 303。techblog.blupinnacle.net/2009/07/......
0赞 OIS 8/19/2009 #4

我不明白你为什么要重定向到那些错误或感谢页面。

出错时:再次显示表单并显示提交的值,突出显示必填字段错误或缺失的字段。

成功后:显示感谢 html 页面。

评论

0赞 Jeff 8/19/2009
我想用 $_GET 传递 header() 重定向,以避免“刷新-重新发送”非常可怕和邪恶的警告消息。
1赞 warpech 8/19/2009
重定向到“谢谢”页面是一种很好的做法,因为它可以防止用户意外提交表单两次