【问题标题】:PHP remembers POST value after refreshPHP在刷新后记住POST值
【发布时间】:2014-12-23 19:44:11
【问题描述】:

我的 html 表单有问题。刷新我的页面后,PHP 似乎记住了我的 POST 值。这与我使用的登录表单有关。

我正在使用cookies让php与javascript通信,告诉javascript用户是否登录。

php代码:

<?php

if (isset($_POST['username'], $_POST['password'])){
    $username = $_POST['username'];
    $password = MD5($_POST['password']);

    echo '<script>console.log("' . $username . '", "username"); </script>';
    echo '<script>console.log("' . $password . '" , "password"); </script>';


    /* against sql injections */
    $username = stripslashes($username);
    $password = stripslashes($password);
    $username = mysql_real_escape_string($username);
    $password = mysql_real_escape_string($password);

    $query = "SELECT user_id FROM User WHERE username='$username' AND password='$password'";
    $result = mysql_query($query) or die(mysql_error());
    $row = mysql_fetch_array($result);

    if ($row[user_id]){
        $cookie_name = "login";
        $cookie_value = "1";
        setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day
    } else{
        echo '<script> alert("Incorrect username and password combination");</script>';
    }
}

?>

形式:

<form method="POST" id="loginForm">
    <b>Login</b>
    <table style="margin-top: 10px">
        <tr><td>Username: </td><td><input type="text" name="username" placeholder="username" required="required"></td></tr>
        <tr><td>Password: </td><td><input type="text" name="password" placeholder="password" required="required"></td></tr>
        <tr><td><input type="submit" name="login" value="Login" style="margin-top: 5px"></td></tr>
    </table>
</form>

因为我喜欢 javascript,所以我使用 ajax 调用与 php 和服务器数据库进行通信。

Javascript 代码:

function openPage(page) {
    var content;

        $.ajax({
            type: 'post',
            url: '/php/' + page + '.php',
            success: function (data) {
                document.getElementById('contentMiddle').innerHTML = data;
            }
        });
    }

}

问题是每当我尝试刷新页面时,我的 php 代码将始终运行,并且 $_POST['username'] 和 $_POST['password'] 将始终具有刷新页面之前的 POST 值。

我总是确保在刷新页面之前删除 cookie。

有什么想法吗?

【问题讨论】:

  • 称其为因祸得福。使用 MD5 不再被认为是安全的,您使用的 MySQL API 也是如此。使用password_hash() 和准备好的语句。
  • 我会使用 /Post/Redirect/Get 方法en.wikipedia.org/wiki/Post/Redirect/Get
  • 你确定你没有在刷新时重新发送帖子值?
  • 与其实际刷新页面,不如尝试单击地址栏并按 Enter。这将重新加载页面而无需重新提交表单。
  • cookies 还有效吗?将输出发送到浏览器后,您无法在 php 中设置 cookie。

标签: javascript php ajax post


【解决方案1】:

您很可能已经提交了该页面,并且通过点击刷新,浏览器正在尝试与刷新一起发送 POST 数据。

由于您使用 Ajax 处理表单,因此您可以/应该从登录按钮中删除 type="submit",因为不需要它。相反,您可以登录。

然后更新您的 Ajax 以在单击按钮时运行。您还可以使用 jQuery 通过 ID 获取元素,例如:

$("#btn_login").on("click", function() {
    $.ajax({
        type: 'post',
        url: '/php/' + page + '.php',
        success: function (data) {
            //document.getElementById('contentMiddle').innerHTML = data;
            $("#contentMiddle").html(data);
        }
    });
});

要解决@charlietfl 的评论,请处理 Enter 按下以提交您将使用的表单。

document.onkeydown = function(){
    if(window.event.keyCode=='13'){
        $("#loginForm").submit();
    }
}

【讨论】:

  • 为什么不需要submit 按钮,包括我在内的许多用户都更喜欢使用键盘提交。这也是为什么最好绑定ajax来提交表单事件而不是按钮点击
  • Enter 提交表单的好点,但不提交很容易解决。使用 Ajax 的另一个原因是不需要刷新整个页面,当输入为 type="submit" 时,AFAIK 总是会发生这种情况,因此是他的问题。我还应该提到 被替换为 而不是没有 type="submit" 的
  • 不,您捕获表单的提交事件并防止默认并在提交处理程序中执行 ajax。需要type=submit 才能允许Enter。这种方式不需要按键或按键处理程序。事实上,您的密钥处理程序会绕过 ajax
  • preventDefault 什么时候可以更改 HTML?看起来很傻。
  • 你必须防止默认。与您的按钮 clcik 相同。您并没有阻止浏览器也提交表单
猜你喜欢
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多