1

私のregister.phpはすべて正常に機能し、登録しようとすると、すべて正しく機能していると表示されますが、データベースに何も表示されません。私は何か間違ったことをしていますか?

<?php
echo "<h1>Register:</h1>";  
$submit = $_POST['submit'];  
//form data  $fullname = strip_tags($_POST['fullname']);  
$username = strip_tags($_POST['username']);  
$password = strip_tags($_POST['password']);  
$repeatpassword = strip_tags($_POST['repeatpassword']);  
if ($submit)  {  
    // check for existance  
    if ($fullname && $username && $password && $repeatpassword)  {  
    if ($password == $repeatpassword)  {
        //check char length of username and fullname  
        if (strlen($username > 25) || strlen($fullname) > 25)  {  
            echo "Length of username or fullname is too long! Max 25 characters for each!";  
        }  else  {
            //check password length  
            if (strlen($password) > 25 || strlen($password) < 6)  {  
                echo "Password must be between 6 and 25 characters";  
            }  else  {  
                //register the user!  
                //encrypt password  
                $password = ($password);  
                $repeatpassword = ($repeatpassword);  
                //open database  
                $connect = mysql_connect("localhost","user","password") 
                    or die ("Couldn't Connect!");  
                mysql_select_db("user_phplogin"); 
                //select database  
                $queryreg = mysql_query("  
                    INSERT INTO `user_phplogin`.`users` (`id`, `fullname`, `username`, `password`) VALUES  (NULL,'$fullname','$username','$password')  "); 
                die("You have been registered! <a href='login.html'> Return to login page</a>");  
                echo "Success!!";  
            }  
        }  
    }  else 
        echo "Your passwords do not match!";  
}  else  
    echo "Please fill in <b>all</b> fields!";  
}
?>
4

2 に答える 2

1

私が指摘する最初の問題は、廃止されたmysql_xx()機能を使用しているということです。mysqli_xx()関数またはPDOライブラリのいずれかに切り替える必要があります。それだけでは問題は解決しませんが、指摘することが重要です。

次へ:データの衛生状態。関数を使用してデータをサニタイズしていますstrip_tags()。これにより、ユーザーはHTMLコードを投稿できなくなりますが、SQLインジェクション攻撃やその他の問題からクエリを安全にするには不十分です。SQL文字列で安全に使用できるようにするには、データをエスケープする必要があります。既存のコードでは、mysql_real_escape_string()これを行うためにを使用する必要があります。私のアドバイスに従い、別のSQL関数のセットに切り替える場合は、またはのいずれかを使用しmysqli_real_escape_string()ますPDO::quote()。これらの関数の使用方法の詳細については、関連するPHPのマニュアルページを参照してください。これを修正することは非常に重要です。

3番目のポイント:エラー処理。コードの関連部分を参照してください。

$queryreg = mysql_query("
                INSERT INTO `user_phplogin`.`users` (`id`, `fullname`, `username`, `password`) VALUES  (NULL,'$fullname','$username','$password')  ");
die("You have been registered! <a href='login.html'> Return to login page</a>");
echo "Success!!";

このコードでは、クエリ関数を呼び出していますが、クエリ関数が何を返すかに関係なく、常に「登録しました」というメッセージを報告しています。クエリ関数が失敗してエラーがスローされる可能性があります。これはほぼ確実に発生していることですが、そのエラーが何であるかを確認するために何もしていません。

PHPには、これを支援するエラー処理関数が用意されています。入力されていることを確認する必要があり$queryregます。入力されていない場合は、エラーを説明するメッセージを報告してください。例えば:

if(!$queryreg) {
    die("Something went horribly wrong. SQL error message: ".mysql_error());
}

mysql_error()または(mysqliまたはPDO libsの同等の関数)の出力は、クエリが失敗したときにMySQLが出力した正確なエラーメッセージになります。これは、問題をデバッグするのに十分なはずなので、テストに適しています。ただし、コードが本番環境にあるときにこのようなメッセージをユーザーに出力するべきではありません。これは、(a)煩雑であり、(b)クエリやデータ構造についてハッカーに伝えることで、ハッカーに不必要な助けを与えるためです。一般に、このようなエラーをログに記録して、エラーを読み取れるようにすることをお勧めしますが、より一般的なエラーメッセージをユーザーに報告します。

それが問題の解決に役立つことを願っています。

于 2012-12-07T15:00:17.230 に答える
0

なぜIDを追加するのですか?テーブルに「自動インクリメント」ID列がありますか?

$queryreg = mysql_query("INSERT INTO `users` (`fullname`, `username`, `password`) VALUES  ('$fullname','$username','$password')  ");

そしてあなたは実行されません

echo "Success";

前にdie()を使用すると、スクリプトはそこで終了するためです

于 2012-12-07T14:59:58.437 に答える