2013-03-07 71 views
0

我编写了一些警报系统。但我们不要看系统本身,让我们看看系统如何知道系统确实向浏览用户发送了警报/错误。函数进程之后,变量没有被定义/更新?

我做了一些事情,当你随机进入?alert = name,没有做任何错误,它会说'没有错误'。 但是,如果系统让你去?alert = name,它会回应错误。

如何处理我的帖子

function postComment() { 
    if (!empty($_POST['name']) || !empty($_POST['comment'])) { 
     $comment = mysql_real_escape_string(htmlentities($_POST['comment'])); 
     $guest = mysql_real_escape_string(htmlentities($_POST['name'])); 
    } 
    $guestId = 1; 
    if (empty($guest)) { 
     $alert = 1; 
     return header('location: index.php?alert=name'); 
    } 
    if (empty($comment)) { 
     $alert = 2; 
     return header('location: index.php?alert=comment'); 
    } 
    if (!isset($_COOKIE['alreadyPosted'])) { 
     mysql_query("INSERT INTO `comments` (`comment_guest`, `guest_id`, `comment`, `comment_date`, `comment_time`) VALUES ('$guest', '$guestId', '$comment', CURDATE(), CURTIME())") or die(mysql_error()); 
     header('Location: index.php?action=sucess'); 
     setcookie(alreadyPosted, $cookieId+1, time() + 60); 
     } else { 
      $alert = 3; 
      header('location: index.php?alert=delay'); 
     } 
} 

正如你看到的,要检查用户是否真正得到这个错误,我会设置$警惕任何错误号是。

并检查HES得到的错误,我会用这个:

if (isset($_GET['alert']) == 'name') { 
    if ($alert == 1) { 
     echo 'hai'; 
    } else { 
     echo 'No errors'; 
    } 
} 

你可能会想,为什么我做这种方式..,还有因为我用1个功能后,我的岗位函数在窗体下,我希望警报显示在表单中。

问题:

变量要么不被设置为数字,它应该运行的功能, 或..东西从它阻止它的时候..我不知道..

我的猜测:因为在变量甚至被设置之前,错误检查位于postComment函数之前?

<?php 
    if (isset($_GET['alert']) == 'name') { 
     if ($alert == 1) { 
      echo 'hai'; 
     } else { 
      echo 'No errors'; 
     } 
    } 
    ?> 

<form action="index.php" method="POST"> 
<input type="text" name="name" placeholder="Your name here" class="field"> 
<textarea class="textarea" name="comment" placeholder="Your comment here..."></textarea> 
<input type="submit" name="send" class="blue_button" value="Post Comment"> 
</form><a href="#"><input type="submit" name="" id="margin" class="blue_button" value="See all messages"></a> 
<br /> 
<?php 
//Show the comments 
    showComments(); 

    if (isset($_POST['send'])) { 
     postComment(); 
    } 

    if (isset($_GET['delete']) == "comment"){ 
     deleteComment(); 
    } 

    echo '<br />'; 

?> 

如果是,那么解决方案是什么? 谢谢!

请不要对mysql_函数的故事开始,我明白&我会用PDO来代替,但我使用mysql_目前用于测试目的

回答

0

的问题是,您要重定向上错误,所以$alert变量不会继续。

要解决此问题添加警报类型的$_GET参数:

function postComment() 
{ 

    // ... 

    if (empty($guest)) 
    { 
    header('location: index.php?alert=name&alert_type=1'); 
    exit; 
    } 

    // ... 

} 

然后当你检查错误:

if (isset($_GET['alert']) && 'name' == $_GET['alert']) 
{ 

    if (isset($_GET['alert_type']) && '1' == $_GET['alert_type']) 
    { 
    echo 'hai'; 
    } 

    else 
    { 
    echo 'No errors'; 
    } 

} 

还请注意,我在这里固定的错误:

isset($_GET['alert']) == 'name' 

这不会做我认为你认为它的作用。你想要的是:

isset($_GET['alert']) && 'name' == $_GET['alert'] 

(对不起比较的顺序;如果你错过了=我喜欢有上比较合适的变量,因为它会导致一个解析错误 - 不是它运行得更好但不是做你的期望)

+0

但是,然后我假设用户可以只是去index.php?alert = name&alert_type = 1,看到完全相同的错误,对吧? – 2013-03-07 19:15:05

+0

是的。如果您担心这一点,请将警报类型存储在'$ _SESSION'中。 – MichaelRushton 2013-03-07 19:16:30

+0

是的,我基本上忘了$ _SESSION,会试试它的欢呼声! – 2013-03-07 19:17:43

-1

如果你是一个新手,你最好考虑使用客户端脚本(即JavaScript)进行验证,因为使用服务器端验证将简单地使过程更长。但是当你遇到问题时,这可能会给你解决方案。

当您将页面重定向到index.php?alert=name'时,$ alert在页面加载时从不设置。当您调用函数postcomment()时,将启动$ alert,但在系统重定向时立即销毁。而$alert从来没有保留一个值,当你随机访问的页面,它显示no error.

+0

使用JavaScript验证不会保证您的数据将正确。任何使用Chrome的开发工具,Firebug或禁用JavaScript的用户都可以绕过您的整个客户端验证。 – 2013-03-07 19:18:06

+0

@PedroCordeiro但是对于客户端UI来说应该是流畅的,并且应该有客户端和服务器端验证这些,如果jS被禁用,服务器端验证将派上用场。作为用户,任何人都不想等待页面完全加载,然后弹出一些错误。这是非用户友好的,因此我要求他使用JS – Dev 2013-03-07 19:23:46

+0

绝对同意客户端验证对用户更好,强烈不同意信任客户端进行所有验证,正如您所建议的。使用服务器端验证不会“简单地使过程更长”。 – 2013-03-07 19:58:49