0

所以我有一个表单,当用户按下提交时,表单会将它们扔到处理文件中,如果这些字段值中的任何一个没有验证,那么该处理表单会将用户发送回他们来自的页面。我认为添加一条消息告诉他们出了什么问题很有用......

例如表单页面(contact.php)是这样构造的(下)

<?php 
$errormssg = stripslashes(str_replace("'","",$_GET['errormssg']));
if($errormssg){
    echo $errormssg;    
} 
?>
<html>
<form fields here >
</html>

并且php进程形式或多或少是这样构造的(下)

<?php 

<form validation code goes here and if it fails, then throws them back to form page exactly 
like this (below)

header("Location:contact.php?errormssg='You seem to have forgotten one of the fields'");



?>

我遇到的问题是,当我第一次加载联系页面时,我收到一个错误,我假设这是因为第一次加载联系页面时,$_GET['errormssg']不存在。

我试过像

if($_GET['errormssg']){
    echo $errormssg;
}

仍然有错误,我是否以错误的方式解决这个问题?

我基本上想做的是,当联系页面加载时,错误消息吐出消息的唯一方法是用户是否从处理表单中被送回。因此,如果消息存在,则在指定区域回显,否则不显示任何内容。

我怎样才能做到这一点??先谢谢了。

4

6 回答 6

5

您需要先检查该值是否已定义:

if (isset($_GET) && isset($_GET['errormssg'])) {
    echo $_GET['errormssg'];
}

编辑:根据 MrCode $_GET 现在总是被定义。不是在我学习 PHP 的时候,从那以后就再也没有失去这个习惯,很抱歉造成混乱。你不需要 if 的第一部分

于 2012-12-05T16:53:13.160 回答
2

尝试:

if(isset($_GET['errormssg']))

于 2012-12-05T16:52:44.883 回答
2

if(isset($_GET['errormssg'])){

这应该工作:)

于 2012-12-05T16:53:40.027 回答
2

尝试类似:

if(isset($_GET['errormsg']) {
   echo $_GET['errormsg'];
}
于 2012-12-05T16:54:00.530 回答
1

正如其他答案所说,您需要在尝试使用之前检查变量是否已设置。Undefined index如果您尝试访问未设置的数组元素,PHP 会自动发出通知。

您的错误消息系统有更好的解决方案。缺点是用户基本上可以通过使用查询字符串来修改页面上的直接内容。第一个问题是它容易受到 XSS 的攻击,因此您应该传递消息htmlspecialchars()htmlentities()阻止它。即使没有 XSS,用户仍然可以在您的页面上设置不受欢迎的内容。

最简单的解决方案是在 URL 中使用错误代码而不是整个消息。在您的 PHP 中,您可以将错误代码映射到消息。这样做的好处是,用户不能篡改消息内容,但他们仍然可以更改代码以产生不同的消息。

更好的解决方案是使用基于会话的消息队列系统。这可以通过将消息数组存储为会话变量来实现。当您需要显示一条消息时,您只需添加到数组中即可。在您的前端,您可以遍历会话数组中的消息并输出它们,然后(重要的是)清除数组。

这会更好,因为它与用户完全隔离,并且可以在系统或站点范围内工作,而不仅仅是您的联系表格。下面是一个简单的例子。

// add a message if validation fails
MesssageManager::addMessage('You seem to have forgotten one of the fields');

在前端输出无序列表中的消息并清除它们:

<html>

<?php echo MessageManager::getHTML(); MessageManager::clear(); ?>

</html>

这个类可能看起来像

session_start();
class MessageManager
{
    public static function addMessage($message)
    {
        if(isset($_SESSION['messages']))
        {
            $_SESSION['messages'][] = $message;
        }
        else
        {
            $_SESSION['messages'] = array($message);
        }
    }

    public static function clear()
    {
        $_SESSION['messages'] = array();
    }

    public static function getHTML()
    {
        $h  = '<ul>';
        foreach($_SESSION['messages'] as $message)
        {
            $h .= '<li>' . htmlentities($message) . '<li>';
        }
        $h .= '</ul>';

        return $h;
    }
}
于 2012-12-05T17:00:48.147 回答
1

首先,我想解决最初的问题。因为已经有了显而易见的答案isset().. 我想指出 1) 你不需要检查是否存在$_GET先验,这只是浪费的代码。因此,例如:

if(isset($_GET['errormsg']) {
  echo $_GET['errormsg'];
} 

确实是正确的用法。我还想指出,您将在任何时候使用PHP 通知和警告,$_GET['foo']而无需先对其进行初始化。因此,例如,这产生一个通知:(注意:在下面的示例中,我将“errormssg”更改为“errormsg”,注意删除了双“s”)

$errormsg = stripslashes(str_replace("'","",$_GET['errormsg']));
if(isset($errormsg)) {
  echo $errmsg;
}

事实上,该代码是非常多余的,因为除非代码更改,否则$errmsg将始终设置。要正确使用它,您可能想说:

if(isset($_GET['errormsg'])) { 
   $errormsg = stripslashes(str_replace("'","",$_GET['errormsg']));
   echo $errormsg;
}

我还想指出!empty()as well 的用法。 !empty()isset()以下示例不同:

$x = '';
if(isset($x)) { echo 'This will fire, since $x *is* set, just empty'; }
if(!empty($x)) { echo 'This will not fire, even though $x is set, it is empty'; }

尽管对于您的示例,它很可能只会产生不明显的差异。

其次,虽然与原始问题没有直接关系,但我想指出您对header()and URLs 的使用是非常不正确的:

header("Location:contact.php?errormssg='You seem to have forgotten one of the fields'");

这都是错误的。你应该改用这样的东西:

header("位置:contact.php?errormsg=" . urlencode("您似乎忘记了其中一个字段"));

请注意 Location: 和 URL 之间的空格。从技术上讲,这仍然是不正确的,但会起作用。100% 正确的方法(根据 RFC)是在标头中包含完整的URL,例如:

header("Location: http://www.yoursite.com/contact.php?errormsg=" . 
  urlencode("You seem to have forgotten one of the fields"));

stripslashes()如果您正确地对数据进行 URL 转义/编码,则不需要您的。

于 2012-12-05T17:04:53.237 回答