0

このアカウント登録アクティベーションスクリプトは自分で作ったもので、何度もチェックしてエラーを見つけたのですが、特にエラーは見当たりません...

ドメインは次のようになります。

http://domain.com/include/register.php?key=true&p=AfRWDCOWF0BO6KSb6UmNMf7d333gaBOB

ユーザーがメールをクリックすると、次のスクリプトにリダイレクトされます。

if($_GET['key'] == true)
{
    $key = $_GET['p'];

    $sql = "SELECT * FROM users
            WHERE user_key = '" . $key . "'";

    $result = mysql_query($sql) or die(mysql_error());

    if(mysql_affected_rows($result) > 0)
    {
        $sql = "UPDATE users
                SET user_key = '', user_active = '1'
                WHERE user_key = '" . $key . "'";

        $result = mysql_query(sql) or die(mysql_error());

        if($result)
        {
            $_SESSION['PROCESS'] = $lang['Account_activated'];
            header("Location: ../index.php");
        }
        else
        {
            $_SESSION['ERROR'] = $lang['Key_error'];
            header("Location: ../index.php");
        }
    }
    else
    {
        $_SESSION['ERROR'] = $lang['Invalid_key'];
        header("Location: ../index.php");
    }
}

まったく機能しません。そのキーを持つユーザーでデータベースを調べましたが、一致しますが、非常に迷惑なエラーとして表示され続けます。データベースは正しく、テーブルと列は正しく、データベースに問題はありません。機能していないのはスクリプトです。

みんな、私を助けて。

ありがとう :)

4

3 に答える 3

3
  1. $_GET['key'] == trueに変更$_GET['key'] == "true"
  2. あなたはこの前ifに、成功したmysql_connect(...)mysql_pconnect(...)
  3. に変更mysql_affected_rows($result);mysql_num_rows($result);ます。DELETEforまたはUPDATE SQL ステートメントを使用できる影響を受けます。
  4. 前の結果に割り当てられたメモリを解放するためにmysql_result(...)、が開かれた場合は 2 番目の前に を追加します。mysql_free_result($result);
  5. if($result)に変更しif(mysql_affected_rows($result));ます。ここでそれを行うことができます。
  6. header(...);関数呼び出しの後に、完全なコード ロジックに応じてreturn 0;orを追加します。exit(0);
  7. SQL インジェクション攻撃に対してコードをより安全にするために、SQL ステートメント$keyで変数を使用しています。$key = $_GET['p'];$key = mysql_real_escape_string($_GET['p']);
  8. 関数でのあなたの場所は失敗すると思いますheader()。URL アドレスは、 http: //www.example.com/somewhere/index.phpheader()のように完全にする必要があります。
  9. そして、$_GET['p']変数が存在することを確認してください!! これが存在せず、存在する場合$_GET['key']は、アクティブ化されたすべてのユーザーが見つかります。次に、user_activated マーカーがある場合は、user_key を '' に設定する必要があると思います。
于 2010-06-09T23:54:59.390 に答える
0

あなたは使用すべきではありません:

if(mysql_affected_rows($result) > 0)

mysql_num_rows() を使用する必要があります

于 2010-06-09T23:59:48.507 に答える
-1

あなたの問題は次のとおりです。

$result = mysql_query($sql) or die(mysql_error());

「または」はステートメントを作成booleanするため、 $result はTruemysql_query() によって返される値の代わりに取得されます

echo 'Hello' or die('bye'); // outputs nothing, because result is True not 'Hello'

3 or die() == True; // true
3 or die() != 3; // true

ORは||と同じです。論理文の演算子です。

これはうまくいきます:

$result = mysql_query($sql);
if(!$result) die(mysql_error());    

同じ間違いが数時間前に行われました:リンク


OR を使用できるケース:

defined('FOO') or
    define('FOO', 'BAR');

mysql_connect(...) or die(...);

mysql_select_db( .... ) or die(...);

mysql_query('UPDATE ...') or die(...);

if(FOO or BAR) { ... }
于 2010-06-10T00:02:53.773 に答える