0

我正在尝试创建一个注册表单,以检查用户输入的电子邮件和密码是否匹配,所有表单是否完整,以及该电子邮件是否以前用于注册。当实际上有错误时,我希望代码在注册表顶部显示错误消息。

但是,我无法弄清楚如何使错误消息显示在注册输入上方。相反,发生的情况是错误消息替换了注册输入并单独出现(要求用户刷新页面以再次尝试注册)。这是我在 stackoverflow 上的第一篇文章,如果我的编码术语不正确,请见谅!下面是我一直在尝试使用的代码。

<?php

// Connect to database server
mysql_connect("localhost", "root") or die (mysql_error ());

// Select database
mysql_select_db("mydatabase") or die(mysql_error());

    //Checks to make sure form has been submitted
    if (isset($_POST['submit'])) { 

//Checks to make sure all fields are complete
if (!$_POST['FirstName'] | !$_POST['LastName'] | !$_POST['Username']| !$_POST['Username2']| !$_POST['Password']| !$_POST['Password2'] ) {
    die('You did not complete all of the required fields');
}

//Check to see if email has already been used to reigster
if (!get_magic_quotes_gpc()) {
    $_POST['Username'] = addslashes($_POST['Username']);
}

$usercheck = $_POST['Username'];

$check = mysql_query("SELECT Username FROM people WHERE Username = '$usercheck'") 
or die(mysql_error());

$check2 = mysql_num_rows($check);

//Email has already been used to register message
if ($check2 != 0) {
    die('Sorry, the Email '.$_POST['Username'].' has already been used to register.');
}

//Confirm that Emails match
if ($_POST['Username'] != $_POST['Username2']) {
    die('The Email addresses you entered do not match. ');
}

//Confirm that passwords match
if ($_POST['Password'] != $_POST['Password2']) {
    die('The passwords you entered do not match. ');
}

//Encrypt the password and add slashes if needed
$_POST['Password'] = md5($_POST['Password']);
if (!get_magic_quotes_gpc()) {
    $_POST['Password'] = addslashes($_POST['Password']);
    $_POST['Username'] = addslashes($_POST['Username']);
    }

    // now we insert it into the database
$insert = "INSERT INTO people(FirstName,LastName,Username,Password) VALUES ('" . $_POST["FirstName"] . "','" . $_POST["LastName"] . "','" . $_POST["Username"] . "','" . $_POST["Password"] . "')";

$add_member = mysql_query($insert);
?>

挂号的

谢谢,您已注册 - 您现在可以登录了。

    <?php 
    } 
    else 
    {   
    ?>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
        <table border="0">
            <tr><td>First Name:</td><td>
                <input type="text" name="FirstName" maxlength="60">
            </td></tr>
            <tr><td>Last Name:</td><td>
                <input type="text" name="LastName" maxlength="60">
            </td></tr>
            <tr><td>Email Address:</td><td>
                <input type="text" name="Username" maxlength="60">
            </td></tr>
            <tr><td>Confirm Email Address:</td><td>
                <input type="text" name="Username2" maxlength="60">
            </td></tr>
            <tr><td>Password (8 character minimum):</td><td>
                <input type="password" name="Password">
            </td></tr>
            <tr><td>Confirm Password:</td><td>
                <input type="password" name="Password2">
            </td></tr>
            <tr><th colspan=2>
        <input type="submit" name="submit" value="Register"></th></tr> </table>
    </form>
    <?php
    }
    ?>
4

1 回答 1

1

正如我在上面的评论中提到的,几乎每一行代码都有一些不好的做法。这是一个快速的总结。

  • 正如 Geek Num 88 所述,您应该使用 PDO 或 mysqli。有关链接,请参见上面的评论。
  • 假设 ext/mysqladdslashes不足以转义值。也不靠get_magic_quotes_gpc。适当的功能是mysql_real_escape_string。但是,从前一点来看,您也不应该使用它。使用参数化查询,无需任何形式的转义。
  • 编码时,最好将其放在error_reporting(-1);文件的顶部。这将迫使您对标准进行更严格的编码。
  • 您在比较中使用按位或|而不是||. 如果您不知道“按位或”的含义,请使用||.
  • 而不是这样做if (!$_POST['FirstName']),您应该检查它是否已设置,然后使用检查它是否为空strlen()
  • 不要die()为每个错误做,而是将它们附加到一个数组并在最后迭代它。使用die()很糟糕,因为可能会发生不止一个错误,然后用户将不得不多次填写表单,而且如果您省略出现在底部的正常页脚,您的 HTML 可能不再有效页。
  • 看在上帝的份上,不要md5用于散列密码。您不妨将它们存储为纯文本。而是使用bcrypt
  • 永远不要回$_SERVER['PHP_SELF']显到浏览器,因为这会使您的脚本容易受到 XSS 攻击。

所以要真正回答你的问题,这就是我要做的:

  1. 查看表格是否已发布。这可以通过 HTML 中的隐藏字段来完成。如果已设置,请进行验证
  2. 遍历所有可能的错误并将所有错误附加到数组中。说,$errors[]
  3. 如果存在错误,请将其回显给用户
  4. 如果没有错误,安全地散列密码并将所有值存储在数据库中
  5. 成功后将浏览器重定向到某种成功页面。这可以防止用户推送刷新和重新提交表单。
  6. 如果表单尚未提交或出现错误,请显示仍填充任何值的表单,以便他们不必再次填写或退回
于 2013-02-07T01:02:46.173 回答