php $ _GET - 澄清

时间:2012-12-05 16:51:18

标签: php conditional-statements

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

例如,表格页面(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;
}

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

所有我实际上都试图做的是,当联系页面加载时,错误消息将向消息吐出的唯一方式是用户是否从处理表单发回。因此,如果消息存在,则在指定区域回显它,否则不显示任何内容。

我怎么能这样做?谢谢你提前。

6 个答案:

答案 0 :(得分:5)

您需要首先检查是否定义了值:

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

编辑:根据MrCode $ _GET现在总是被定义。当我从那时起学习PHP并且从那时起就没有失去这种习惯,对此感到困惑。你不需要if

的第一部分

答案 1 :(得分:2)

尝试:

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

答案 2 :(得分:2)

如果(isset($ _ GET [ 'errormssg'])){

这应该有效:)

答案 3 :(得分:2)

尝试类似:

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

答案 4 :(得分:1)

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

您的错误消息系统有更好的解决方案。缺点是用户可以通过使用查询字符串实质上修改页面上的直接内容。第一个问题是它易受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;
    }
}

答案 5 :(得分:1)

首先,我想谈谈原来的问题。因为已经有明显isset()的答案..我想指出1)你不需要先检查$_GET是否存在,它只是浪费了代码。所以例如:

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

确实是正确的用法。我还想指出你会得到PHP Notices&amp;警告随时您使用$_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()的用法。 !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()并且网址非常不正确:

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

这都错了。您应该而是使用以下内容:

标题(“位置: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()