2

アクティベーションページを作成しようとしています。ユーザーがアクティベーションリンクをクリックすると、ユーザーはactivate.phpページに移動し、アカウントがアクティベートされているかどうかを示すメッセージが表示されます。

私が抱えている問題は、「コードとユーザー名が一致しません!アカウントがアクティブ化されていません」というメッセージが表示され続けることです。アクティベーションリンクがクリックされても、成功したメッセージ「アカウントはアクティベートされました」はまったく表示されません。

また、正しいユーザー名とコードが識別された場合、データベースの「アクティブ」列は「1」に変更されますが、それでも「0」が表示され続けます。これは、アカウントがまだ非アクティブであることを意味します。

私の質問は、ユーザー名とアクティベーションコードが正しいことを認識しないのはなぜですか?

以下は、registration.phpスクリプトで、ユーザーの登録の詳細を挿入し、アクティベーションリンクを電子メールで送信します。

$teacherpassword = md5(md5("j3j".$teacherpassword."D2n"));  
$code = md5(rand(1,9));

$insertsql = "
INSERT INTO Teacher
(TeacherForename, TeacherSurname, TeacherEmail, TeacherAlias, TeacherUsername, TeacherPassword, Code)
VALUES
(?, ?, ?, ?, ?, ?, ?)
";
if (!$insert = $mysqli->prepare($insertsql)) {
// Handle errors with prepare operation here
}                                           

$insert->bind_param("sssssss", $getfirstname, $getsurname,
$getemail, $getid, $getuser,
$teacherpassword, $code);

$insert->execute();

if ($insert->errno) {
// Handle query error here
}

$insert->close();

    $getuser = $_POST['user'];
    $code = md5(rand(1,9));

    $site = "http://helios.hud.ac.uk/......../Mobile_app";
    $webmaster = "Mayur Patel <.......@hud.ac.uk>";
    $headers = "From: $webmaster";
    $subject = "Activate Your Account";
    $message = "Thanks for Registering. Click the link below to Acivate your Account. \n";
    $message .= "$site/activate.php?user=$getuser&code=$code\n";
    $message .= "You must Activate your Account to Login";

    if(mail($getemail, $subject, $message, $headers)){
    $errormsg = "You have been Registered. You must Activate your Account from the Activation Link sent to <b>$getemail</b>";
    $getfirstname = "";
    $getsurname = "";
    $getid = "";
    $getuser = "";
    $getemail = "";
    }

以下は、アクティベーションリンクをチェックしてmysqli操作を実行し、メッセージを表示するactivate.phpページです。

 <?php
    $user_to_be_activated  =   $_GET['user'];
    $code_to_be_matched   =   $_GET['code'];


    // don't use $mysqli->prepare here
    $query = "SELECT TeacherUsername, Active, Code FROM Teacher WHERE TeacherUsername = ? AND Code = ? ";
    // prepare query
    $stmt=$mysqli->prepare($query);
    // You only need to call bind_param once
    $stmt->bind_param("ss",$user_to_be_activated, $code_to_be_matched);
    // execute query
    $stmt->execute(); 
    // get result and assign variables (prefix with db)
    $stmt->bind_result($dbTeacherUsername, $dbActive, $dbCode);
    //get number of rows
    $stmt->store_result();
    $counting = $stmt->num_rows();

    if($counting == '1')
    {

   $updatesql = "UPDATE Teacher SET Active = ? WHERE TeacherUsername = ? AND Code = ?";                                         
    $update = $mysqli->prepare($updatesql);
    $update->bind_param("iss", 1, $user_to_be_activated, $code_to_be_matched);
        $update->execute();
        $update->close();

        echo "Account is Activated";
    }
    else
    {
        echo "The Code and Username doesn't match! Account is not Activated.";
    }

        ?>

リンクが初めてクリックされたときにアカウントをアクティブ化できるようにしたいだけです。

4

4 に答える 4

1

私がそれをした方法:

次のような方法でユーザーがアカウントをアクティブ化するときに、データベース (新しい列) に security_key を作成します。

      example.com/activate/username/security_key

「アクティブ化」列を 1 に設定します。ここで新しいハッシュを設定するため、「再度」アクティブ化して奇妙なバグを取得することはできません。

ここで、ユーザーがログインしようとすると、資格情報は設定されていませんが、電子メールは既知です。そのため、復旧リンクを記載した「パスワード紛失」の電子メールを彼に送信するだけです。

     example.com/set-password/username/security_key

セキュリティ上の理由から、行の更新ごとに security_key を更新することをお勧めします。そのため、サードパーティのユーザー (ハッカー) が自分のセキュリティ キーを目にするような奇妙な出来事が起こることはありません。

これがお役に立てば幸いです:)

結論として、新鮮な空気を吸って、少し時間を取って、明確な心でもう一度見てください。このようなシステムを最初に紙にスケッチして、何に取り組んでいるのかを理解するのが最善です。(私も同じことをしました、それは本当に私を助けました!)

于 2012-08-25T22:11:50.427 に答える
1

わかりました、エラーは次のとおりです。

$update->bind_param("iss", 1, $user_to_be_activated, $code_to_be_matched);

単純に 1 を渡さず、エラーが表示されない理由がわかりません。

したがって、その数値 1 を変数に入れるだけで、SQL コードで次のように使用できます。

コード全体:

   $code_activated = 1;

// don't use $mysqli->prepare here
    $query = "SELECT TeacherUsername, Active, Code FROM Teacher WHERE TeacherUsername = ? AND Code = ? ";
    // prepare query
    $stmt=$mysqli->prepare($query);
    // You only need to call bind_param once
    $stmt->bind_param("ss",$user_to_be_activated, $code_to_be_matched);
    // execute query
    $stmt->execute(); 
    // get result and assign variables (prefix with db)
    $stmt->bind_result($dbTeacherUsername, $dbActive, $dbCode);
    //get number of rows
    $stmt->store_result();
    $counting = $stmt->num_rows();

    if($counting == '1')
    {

   $updatesql = "UPDATE Teacher SET Active = ? WHERE TeacherUsername = ? AND Code = ?";                                         
    $update = $mysqli->prepare($updatesql);
    $update->bind_param("sss", $code_activated, $user_to_be_activated,  $code_to_be_matched);
        $update->execute() or die(mysql_error());
        $update->close();

        echo "Account is Activated";
    }
    else
    {
        echo "The Code and Username doesn't match! Account is not Activated.";
    }

ここでテストできます:

http://design05.comuf.com/avtivate.php

以下の詳細を含む:

ユーザー: マスター

コード: bbb111

http://design05.comuf.com/avtivate.php?user=master&code=bbb111

ユーザー:管理者

コード: abc123

http://design05.comuf.com/avtivate.php?user=admin&code=abc123

もちろん、いくつかの間違ったものを試してみてください。

于 2012-08-25T23:41:17.593 に答える
0

データベースに保存するランダムなコードを生成してから、電子メール内に追加する別のコードを生成するようです。これらの2つのコードは異なる可能性があります:)

于 2012-08-26T00:05:44.743 に答える
-1

コード md5 が既にあるため、その 2 番目のコード md5 を削除するだけです。

于 2016-08-26T09:20:34.533 に答える