首页 > 解决方案 > 如何在 php echo 中从表单调用 javascript 函数?

问题描述

下面的代码所做的是确保用户不允许提交评论,除非他使用 $_SESSION['login_user'] 超变量登录。但这给了我一个错误。我认为问题是因为我在 onsumbit="return(checkUser())" 中调用了一个 javascript 函数。那里有问题,但我不知道为什么。

我有以下代码:

<script type="text/javascript">  
      // notice the quotes around the ?php tag 
      function checkUser() {     
          <?php
          if(isset($_SESSION['login_user'])){
            $isExist = true;

        }
        ?>
        else{
            $isExist= false;
            alert( "Please register first!" );

        }
      var htmlString="<?php echo $isExist; ?>";
      return isExist;
      }
    </script>

...
...

<?php
echo "<form method='POST' onsubmit="return(checkUser());" action='".setComments($connection, $res['post_id'])."'>
    //echo "<form method='POST' action='".setComments($connection, $res['post_id'])."'>
    <input type='hidden' name='uid' value='".$_SESSION['login_user']."'>
    <input type='hidden' name='date' value='".date('Y-m-d H:i:s')."'>
    <textarea name='message'> </textarea><br>
    <button type='submit' name='commentSubmit'>Comment</button>
     </form>";
    getComments($connection, $res['post_id']);

?>

....

如果这不是阻止用户提交评论的正确方法,那么另一种方法可能是什么?

标签: javascriptphphtmlsession

解决方案


除了@RonaldT 所说的,你需要了解 PHP 代码在发送到浏览器之前是在服务器上执行的。所以检查$_SESSION['login_user']Javascript 函数内部有点傻,因为在用户刷新页面之前它总是相同的(只有这样 PHP 才会重新检查该值)。

所以你的功能可以像这样简化:

<script type="text/javascript">
    // on page load, define a global variable using PHP
    var isLoggedIn = <?php echo isset($_SESSION['login_user']) ? "true" : "false"; ?>;

    function checkUser() {
        // check that global variable every time checkUser() is called in Javascript
        if (!isLoggedIn) {
            alert( "Please register first!" );
        }

        return isLoggedIn;
    }
</script>

请记住,这种“安全性”非常容易被愚弄(任何用户都可以打开他们的浏览器控制台,输入isLoggedIn = true;并瞧瞧),因此请务必在提交表单时检查服务器。

或者更好的是:如果不允许用户做某事,就不要给他们机会。如果无论如何都不允许用户提交表单,为什么还要显示表单呢?

<?php
if (!isset($_SESSION['login_user'])) {
    echo "Please register to add a comment";
} else {
    echo "<form [...everything else...] /form>";
}

getComments($connection, $res['post_id']);
?>

推荐阅读