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 / mysqlを想定すると、addslashes値をエスケープするには十分ではありません。どちらもに依存していません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 に答える