2011-02-02 13 views
0

誰かがこの電子メールのアクティベーションが機能しない理由を知りたいですか?基本的には、アクティベーションキーと電子メールをスティールとして格納する2つのURLクエリ変数を送信しています。私はそれらをlist()として抽出し、それらをdbクエリとして使用しています。すべてのdbオブジェクトは正常に動作していますが、電子メールからスクリプトを実行すると、「アカウントは現在アクティブです...」というエコー文が表示されますが、データベースをチェックすると、私はそれをすなわちアクティベーションキー、ステータス、およびユーザーIDに伝えました。電子メールアクティベーションスクリプトの問題

奇妙な部分は次のとおりです。データベースに1人のユーザーしかいない場合、コードは必要なだけ実行されます。しかし、別のユーザーを追加しようとすると、指示どおりに新しいレコードは更新されません。だから私の質問:なぜこのコードは、データベースに1人のユーザーがいて、それ以上の人がいるときには機能しないのですか?それは意味をなさない。ここで本当に助けに感謝します。

include $_SERVER['DOCUMENT_ROOT']. '/video_dating/includes/Database.php'; 
list($queryString,$email) = explode('&', $_SERVER['QUERY_STRING']); 

print_r($email); 
$dbname = new Database(); 
$dbname->Query('select activationkey, id, email from users'); 
$userinfo = $dbname->Getdata(); 
foreach ($userinfo as $users) 
{ 

    if ($queryString == $users['activationkey']) 
    { 
    $dbname->Query("update users set activationkey='', status='activated', userid='1' where email='$email'"); 
    echo "Thank you for registering. Your account is now active. Please login any time."; 

    } 
    else 
     echo "Sorry, your account was not activated."; 
} 

答えて

0

フィールドuseridはキーとして定義できますか?はい、それは一意である必要がありますが、あなたは常に1

に設定している場合は、UPDATEからその部分を削除してください:

, userid='1' 
+0

お返事ありがとうございました。実際には、それは意味的に誤解を招くかもしれませんが、ユーザーIDは実際にはユーザーのアカウントの種類(1は基本、2は標準、3はプレミアム)に関連付けられているため、auto_incrementはありません。彼らはアクティベーション時に自動的に「基本アカウント」を取得します。私はauto_incrementを行うIDフィールドを持っています...そして確かに、私は確実にそのセキュリティ手段を追加しますが、最初に私はこのことを正しく動作させたいと思っています。それでは、私の更新クエリはどうですか?文字列の$電子メールを参照する必要があるので、正しいレコードを更新できますか? – bill

+0

まず、QUERY_STRINGから目的の値が得られたかどうかを確認する必要があります。私はあなたが '&'ではなく '&'によって爆発するべきだと思います。 '&'をエンコードするためにHTMLで使用する '& '。 URIの場合、QUERY_STRING内には '&' –

+0

となります。2ステップは必要ありません。アップデートをしてください: 'update users set activationkey = ''、status = 'activated'、userid = '1'ここでemail = '$ email'とactivationkey = '$ queryString'です。更新が成功した場合は、mysql_affected_rowsが通知します。もちろん、GWWのように、作業する前にユーザーからのデータをサニタイズ/検証する必要があります。 –

2

私はあなたのデータベースの構造を知らないが、私は、ユーザーIDがあると仮定します自動インクリメントキー。私は問題があると推測していますuserid='1'あなたのコードのこの部分は、常にあなたのIDが1であると仮定します。

また、アクティベーションキーを直接照会するだけでコードをかなり単純化することもできます。

ie。

$dbname->Query('select activationkey, id, email from users WHERE activationkey="'.$queryString.'" and email = "'.$email.'"'); 

さらに、あなたは本当にあなたがデータベースインジェクション攻撃を防ぐために、あなたのqueryStringと電子メールをエスケープされていることを確認しなければなりません。 mysql_real_escape_stringまたはデータベースクラスに基づく代替を使用することができます。

+0

あなたの質問にあなたのテーブルスキーマを投稿できますか? – GWW

+0

私は3つのテーブルしか持っていません:ユーザーにはすべてのユーザー情報列(ユーザー名、電子メール、ユーザーID、パスワード、dobなど)が含まれています。 id列とdescription列(各レベルのサービスにユーザーに与えられるものを説明しています)を持つMemberです。私はまた、メンバーテーブルのIDと説明とユーザーテーブルのユーザーIDフィールドを結合するルックアップテーブルを持っています。ただし、この起動スクリプトが必要とするテーブルはusersテーブルだけです。私が言ったように、usersテーブルには1つのユーザー情報しかない限り動作します。 – bill

+0

それは問題を引き起こす奇妙な列があると思います。あるいは、あなたの認証キーに何か問題があるかもしれません。 – GWW

関連する問題