1

私は登録のために次のコードを持っています-

<?php 
 // Connects to your Database 
 mysql_connect("my serner", "user", "password") or die(mysql_error()); 
 mysql_select_db("ec09580") or die(mysql_error()); 
 //This code runs if the form has been submitted
 if (isset($_POST['submit'])) { 
 //This makes sure they did not leave any fields blank
 if(isset($_POST['firstname']) && isset($_POST['lastname']) && isset($_POST['email']) && isset($_POST['username']) && isset($_POST['pass1']) && isset($_POST['pass2']))
           {
            $fname = $_POST['firstname'];
            $lname = $_POST['lastname'];

            $email_id = $_POST['email'];

            $username_r = $_POST['username'];
            $password_1 = $_POST['pass'];
            $password_2 = $_POST['pass2'];



 // checks if the username is in use
    if (!get_magic_quotes_gpc()) {

        $_POST['username'] = addslashes($_POST['username']);
    }
 $usercheck = $_POST['username'];
 $check = mysql_query("SELECT username FROM User WHERE username = '$usercheck'") 
or die(mysql_error());
 $check2 = mysql_num_rows($check);

 //if the name exists it gives an error
 if ($check2 != 0) {
        die('Sorry, the username '.$_POST['username'].' is already in use.');
    }
 // this makes sure both passwords entered match

    if ($_POST['pass'] != $_POST['pass2']) {
        die('Your passwords did not match. ');
    }
    // here we encrypt the password and add slashes if needed

    $_POST['pass'] = md5($_POST['pass']);

    if (!get_magic_quotes_gpc()) {
        $_POST['pass'] = addslashes($_POST['pass']);
        $_POST['username'] = addslashes($_POST['username']);
    }
}
 // now we insert it into the database
    $insert = "INSERT INTO User set FirstName='$fname', LastName='$lname',  Email='$email_id', username='$username_r', password='$password_1'";
    $add_member = mysql_query($insert);
    ?>
 <h1>Registered</h1>
 <p>Thank you, you have registered - you may now login</a>.</p>
 <?php 
 } 
 else 
 {  
 ?>
 <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
 <table border="0">
 <tr><td>Firstname:</td><td>
 <input type="text" name="firstname" maxlength="60">
 </td></tr>
 <tr><td>LastName:</td><td>
 <input type="text" name="lastname" maxlength="60">
 </td></tr>
 <tr><td>Email:</td><td>
 <input type="text" name="email" maxlength="60">
 </td></tr>
 <tr><td>Username:</td><td>
 <input type="text" name="username" maxlength="60">
 </td></tr>
 <tr><td>Password:</td><td>
 <input type="password" name="pass" maxlength="10">
 </td></tr>
 <tr><td>Confirm Password:</td><td>
 <input type="password" name="pass2" maxlength="10">
 </td></tr>
 <tr><th colspan=2><input type="submit" name="submit" 
value="Register"></th></tr> </table>
 </form>
 <?php
 }
 ?> 

そしてアクティベーションのために私は次のコードを持っています-

<?php
if (isset($_GET['x'])) {
    $x = (int) $_GET['x'];
} else {
    $x = 0;
}
if (isset($_GET['y'])) {
    $y = $_GET['y'];
} else {
    $y = 0;
}
if ( ($x> 0) && (strlen($y) == 32)) {
    require_once ('mysql_connect.php');
    $query = "UPDATE User SET active=NULL WHERE (id=$x AND active='" . $y . "') LIMIT 1";  
    $result = mysql_query($query);

    if (mysql_affected_rows() == 1) {
        echo "<h3>Your account is now active. You may now log in.</h3>";
    } else {
        echo '<p><font color="red" size="+1">Your account could not be activated. Please re-check the link or contact the system administrator.</font></p>';
    }
    mysql_close();
} else {
    echo '<b>Activation link not valid!</b>';
}
?>

私はこのエラーを受け取り続けます--

注意:未定義の変数:87行目の/var/www/users/ec09580/project_test/r_test.phpのfname注意:87行目の/var/www/users/ec09580/project_test/r_test.phpの未定義の変数:lname注意:未定義の変数:87行目の/var/www/users/ec09580/project_test/r_test.phpのemail_id注意:未定義の変数:87行目の/var/www/users/ec09580/project_test/r_test.phpのusername_r注意:未定義の変数:87行目の/var/www/users/ec09580/project_test/r_test.phpのpassword_1

私は何をすべきか混乱しています。誰か助けてくれませんか?ありがとうございました。

4

2 に答える 2

3

これらの行を移動する必要があります。

$insert = "INSERT INTO User set FirstName='$fname', LastName='$lname',  Email='$email_id', username='$username_r', password='$password_1'";

$add_member = mysql_query($insert);

現在、これらの値が設定されているかどうかをチェックする条件の範囲外です。したがって、フォームが適切に入力されていない場合、これらの変数が設定されていないため、これらの通知が表示されます。

より明確にするために、これらの2行を次の条件付きに移動する必要があります。

if(isset($_POST['firstname']) && isset($_POST['lastname']) && isset($_POST['email']) && isset($_POST['username']) && isset($_POST['pass1']) && isset($_POST['pass2']))
           {
                //Your existing code here

                //And move these two lines in here also:
                $insert = "INSERT INTO User set FirstName='$fname', LastName='$lname',  Email='$email_id', username='$username_r', password='$password_1'";

                $add_member = mysql_query($insert);
           }

フォーム値のいずれかが設定されていない場合、変数$ fname、$ lname、$ email_idは条件付きで設定されるため、そのコードをそこに移動する必要があります。

この場合、設定されていない変数にアクセスしようとすると、PHPは通知をスローします。

Bradが指摘したように、コードはあまり安全ではないため、本番環境では使用しないでください。私はあなたの質問に対する修正を提供しました。

学校でこれを学習または実行しているだけの場合は、ある程度問題ありませんが、SQLインジェクションを防止し、ユーザー入力を検証する習慣を身に付けることは間違いなく良い考えです。

SQLインジェクションの防止に関するスタックオーバーフローの質問は、私ができるよりもはるかによく説明しています。

PHPでSQLインジェクションを防ぐにはどうすればよいですか?

于 2012-04-22T06:16:19.797 に答える
1

注意:未定義..。

使用しているインスタンスがまだインスタンス化されていない場合、このタイプのエラーがスローされます。


クエリで使用している変数は、すべての実行フローでインスタンス化されるわけではありません。したがって、そのエラーを受け取ります。

isset()これは、を使用して変数が以前に設定されているかどうかを確認することで解消できます。

例えば:

$fname = isset($fname) ? $fname : '';
于 2012-04-22T06:20:12.633 に答える