PHP 表单提交到 MySQL,无需刷新/重定向

Posted

技术标签:

【中文标题】PHP 表单提交到 MySQL,无需刷新/重定向【英文标题】:PHP form submit to MySQL with no refresh / redirect 【发布时间】:2017-05-21 18:29:47 【问题描述】:

在我的一生中,我无法在不刷新的情况下获得 Ajax 请求来工作和提交我的 html 表单,我只是无法使用 Ajax。我希望我的表单在不刷新或重定向到另一个页面的情况下运行 register.php。理想情况下,我想在 div 或其他内容中添加“您已注册”消息,但现在我只希望我的表单无需刷新即可提交。

这是我的 HTML:

    <!DOCTYPE HTML>
    <html>
    <head>
    <title>Social Media</title>
    <script src="jquery-3.1.1.min.js"></script>
    <script src="register.js"></script>
    </head>
    <body>

    <span id='messasge'></span>    

    <form id='register_form' method='post' action='register.php'>
        First: <input type='text' name='first_name' maxlength='30' required='required'><br>
        Last: <input type='text' name='last_name' maxlength='30' required='required'><br>
        Email: <input type='text' name='email' maxlength='60' required='required'><br>
        Password: <input type='password' name='password' maxlength='60' required='required'><br>
        <input type='submit' id='register_user' name='register' value='Register'>
    </form>

        <br>

    <form id='login_form' action='login.php'>
        Email: <input type='text' name='email' maxlength='60' required='required'><br>
        Password: <input type='password' name='password' maxlength='60' required='required'><br>
        <input type='submit' name='login' value='Log In'>
    </form>

    </body>     

    </html>

这里 register.php 发送表单:

require_once 'connect.php';

// Salt for Hasing Password
$salt = '$kl._';
$pepper = 'l*&s';

// Sanative Input Completely
function sanitizeString($conn, $var) 
$var = stripslashes($var);
$var = strip_tags($var);
$var = htmlentities($var);
$var = $conn->real_escape_string($var);
return $var;


// Format Name w/ Only Capital First Letter
function formatName($var) 
$var = strtolower($var);
$var = ucwords($var);
return $var;


if(isset($_POST['register'])) 

$first_name = sanitizeString($conn, formatName($_POST['first_name']));
$last_name = sanitizeString($conn, formatName($_POST['last_name']));
$email = sanitizeString($conn, $_POST['email']);
$password = hash('ripemd128', $salt . $_POST['password'] . $pepper);

$stmt = $conn->prepare('INSERT INTO users (first_name, last_name, email, password)VALUES(?, ?, ?, ?)');
$stmt->bind_param('ssss', $first_name, $last_name, $email, $password);
$stmt->execute();

$stmt->close();
$conn->close();

?>

javascript

$('#register_user').click(function()  
    $.post( $("#register_form").attr("action"), 
    $("#register_form :input").serializeArray(), function(info) 
        $("#message").html(info); 
    ); 
); 
$("#register_user").submit(function()  return false; );

【问题讨论】:

你的 JavaScript/jQuery 在哪里?你有preventDefault()return false 吗? 请使用 PHP 的built-in functions 来处理密码安全问题。如果您使用的 PHP 版本低于 5.5,您可以使用 password_hash() compatibility pack。确保在散列之前 don't escape passwords 或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。 不要在 cmets 中转储代码。编辑您的原始问题以包含任何新信息。 @jay 我不是在逃避我的密码吗?这也是我的 JS,不知道如何格式化: $('#register_user').click(function() $.post( $("#register_form").attr("action"), $(" #register_form :input").serializeArray(), function(info) $("#message").html(info); ); ); $("#register_user").submit(function() return false; ); 当你使用准备好的语句时,为什么要使用这个函数sanitizeString() 【参考方案1】:

您需要捕获提交事件并返回false。用这个替换你的jQuery:

   $(function() 
        $('#register_form').submit(function(event) 
            event.preventDefault(); 
            $.post( $("#register_form").attr("action"), 
            $("#register_form :input").serializeArray(), function(info) 
                $("#message").html(info); 
            ); 
        );
    ); 

阅读更多关于preventing default event actions 和jQuery AJAX Basics。在进行故障排除时,请务必在浏览器的开发人员工具中查看 AJAX 请求/响应。


自从您在文档开头加载 jQuery 后,我已经编辑了代码以在 jQuery 代码周围添加一个文档就绪处理程序。这实际上使 jQuery 等待运行,直到整个文档被加载。

【讨论】:

我用这个替换了我的 register.js 并且仍然刷新? 这就是 register.js 中的全部内容吗?您是否在表单所在的 HTML 文件中包含 jQuery 库和 register.js?您的控制台中是否有任何错误? 这就是其中的全部内容,是的,您可以在我的 HTML 文件的头部看到它。 好的 - 我已经更新了一个文档准备处理程序$(function()...); 好的,所以我的 POST 的内容长度为 0,所以是的,某处有错误。我会试着从这里拿走它,非常感谢你的帮助。

以上是关于PHP 表单提交到 MySQL,无需刷新/重定向的主要内容,如果未能解决你的问题,请参考以下文章

重定向到同一页面php后避免表单重新提交[重复]

刷新页面时如何防止表单重新提交(F5 / CTRL+R)

在rails 5中没有页面刷新和重定向的模态表单提交

表单提交后PHP重定向到另一个页面

我希望我的 php 表单提交数据并在同一页面但不同的选项卡上重定向

验证 PHP 表单并更改提交按钮而不是重定向到状态页面