所以我有一个表单,当用户按下提交时,表单会将它们抛出到处理文件中,如果这些字段值中的任何一个值没有验证,那么该进程表单会将用户返回到它们来自的页面。我认为添加一条告诉他们错误的消息很有用.....
例如,表格页面(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;
}
仍然是错误,我是以错误的方式解决这个问题吗?
所有我实际上都试图做的是,当联系页面加载时,错误消息将向消息吐出的唯一方式是用户是否从处理表单发回。因此,如果消息存在,则在指定区域回显它,否则不显示任何内容。
我怎么能这样做?谢谢你提前。
答案 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()
。