0

以下の私のコード(SQLステートメント(UPDATEクエリステートメント)と関係があるはずです)。基本的に、ブラウザにアクセスして、データベースに存在することがわかっているキーを使用してスクリプトにアクセスすると、次のエラーが表示されます。

[15/04/2012 18:33:57] - exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'user_activation_key'' in C:\wamp\www\user-verify.php:53
Stack trace:
#0 C:\wamp\www\user-verify.php(53): PDOStatement->execute(Array)
#1 {main}

これが私のコードです: user_activation_key 列は一意であり、データの相互性のために InnoDB と外部キーを使用しているため、重複エントリについて何を言っているのかわかりません。

// check if key is set and alphanumeric and equals 40 chars long
// we use sha1 so it will always be 40 chars long.
if(isset($_GET['key']) && ctype_alnum($_GET['key']) && strlen($_GET['key']) == 40){
    $key = trim($_GET['key']);
}

// if key isset
if(isset($key)){

try {
        // connect to database
        $dbh = sql_con();

        // if key is of valid length and type we need to update the `user_activation_key` in the `users_status` table to NULL
        // and update the `user_status`in the `users` table to 1 (tinyint)(active) based on the condition that the 
        // activation key can be found in the users_status.user_activation_key column and user_uid match in both users_status and users table
        $stmt = $dbh->prepare("
                            UPDATE
                                users
                            JOIN
                                users_status
                            ON
                                users_status.user_activation_key = ?
                            SET
                                users.user_status = 1,
                                users_status.user_activation_key = NULL
                            WHERE
                                users_status.user_uid = users.user_uid");

        // execute query
        $stmt->execute(array($key));

        if ( $stmt->rowCount() > 0 ) {

            echo 'account now activated';
            exit;

        } else {
            echo 'could not activate account at this time';
            exit;
        }

    // close database connection
    $dbh = null;

} // if any errors found log them and display friendly message
catch (PDOException $e) {
    ExceptionErrorHandler($e);
    require_once($footer_inc);
    exit;
}

} else {

// else key not valid or set
echo '<h1>Invalid Activation Link</h1>';

$SiteErrorMessages =
"Oops! Your account could not be activated. Please recheck the link in your email.
The activation link appears to be invalid.<br /><br />
If the problem persists please request a new one <a href='/member/resend-activation-email'>here</a>.";

SiteErrorMessages();

include($footer_inc);
exit;

}

なぜそのエラーが発生するのかわかりませんが、それが正確に何を意味するのか知っていますか?

users_statusキーがテーブルに存在する場合でも、更新は実行されません。無効なキーを入力すると、現時点でアカウントをアクティブ化できませんでしたと表示されますが、キーが有効な場合は更新する必要がありますが、上記のエラーが出力されます。

アップデート:

これら 2 つのテーブルのデータベース設計は次のとおりです。

CREATE TABLE `users` (
  `user_uid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'users unique id',
  `user_status` tinyint(1) unsigned NOT NULL COMMENT '0 = verify | 1 = active |  2 =  suspended | 3 = delete | 4 = spam |',
  `user_login` varchar(15) NOT NULL COMMENT 'users login username',
  `user_pass` char(152) NOT NULL,
  `user_email` varchar(255) NOT NULL COMMENT 'users email',
  `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'user registration date',
  `user_display_name` varchar(60) NOT NULL COMMENT 'users display name (first & last name)',
  `user_failed_logins` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'failed login attempts',
  PRIMARY KEY (`user_uid`),
  UNIQUE KEY `user_login` (`user_login`),
  UNIQUE KEY `user_email` (`user_email`),
  KEY `user_pass` (`user_pass`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT=Users Table';

CREATE TABLE `users_status` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'auto generated id',
  `user_uid` int(10) unsigned NOT NULL,
  `user_activation_key` char(40) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_uid` (`user_uid`),
  UNIQUE KEY `user_activation_key` (`user_activation_key`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='user status table, when a user registers they must first activate there account';


ALTER TABLE `users_status`
  ADD CONSTRAINT `FK_user_status` FOREIGN KEY (`user_uid`) REFERENCES `users` (`user_uid`) ON DELETE CASCADE ON UPDATE CASCADE;
4

3 に答える 3

4

users_status.user_activation_keyとして設定して いるクエリでは、インデックスがあり、値がテーブルで既に使用可能である必要があるとNULL確信して います。UNIQUENULL

そのため、そのエラーが発生しています。

于 2012-04-15T17:56:36.930 に答える
0

頭を何度か叩いた後、解決しましたが、問題は、user_activation_key が一意であり、インデックスを持っていたにもかかわらず、NULL 値を許可するように列を設定しなかったため、エラーが発生したことでした。

私はそれを変更して、まだ一意であり、インデックスを持っていますが、NULL 値を許可し、機能するようにしました。

于 2012-04-16T10:54:19.513 に答える
0

NULLの値を渡していますuser_status.user_activiation_keyが、このフィールドは主キーでありNULL、重複キー (存在するキー) にすることはできないため、これはIntegrity constraint violation

于 2012-04-15T17:59:05.790 に答える