6

私は最近、usercake (http://usercake.com/) と呼ばれるこの小さなユーザー クラス スクリプトを見つけました。これにはすべての基本機能があり、非常にうまく機能しているようです。

私の問題:最初のユーザーはデータベースに正常に追加されますが、その後は機能しません。明らかに、私が把握していないわずかな問題があります (私は oop php をよく知りません)。エラーは発生せず(確認できます)、メールが送信されます。

同じ運命の複数の場所にインストールしました。このスクリプトを使用すると、車輪の再発明の時間を大幅に節約できるため、修正したいと思います。

私が持っている URL は次のとおりです: http://rawcomposition.com/birding/loggedin/register.php すべてが検証されると呼び出される関数は次のとおりです。

    public function userCakeAddUser()
{
    global $db,$emailActivation,$websiteUrl,$db_table_prefix;

    //Prevent this function being called if there were construction errors
    if($this->status)
    {
        //Construct a secure hash for the plain text password
        $secure_pass = generateHash($this->clean_password);

        //Construct a unique activation token
        $this->activation_token = generateActivationToken();

        //Do we need to send out an activation email?
        if($emailActivation)
        {
            //User must activate their account first
            $this->user_active = 0;

            $mail = new userCakeMail();

            //Build the activation message
            $activation_message = lang("ACTIVATION_MESSAGE",array($websiteUrl,$this->activation_token));

            //Define more if you want to build larger structures
            $hooks = array(
                "searchStrs" => array("#ACTIVATION-MESSAGE","#ACTIVATION-KEY","#USERNAME#"),
                "subjectStrs" => array($activation_message,$this->activation_token,$this->unclean_username)
            );

            /* Build the template - Optional, you can just use the sendMail function 
            Instead to pass a message. */
            if(!$mail->newTemplateMsg("new-registration.txt",$hooks))
            {
                $this->mail_failure = true;
            }
            else
            {
                //Send the mail. Specify users email here and subject. 
                //SendMail can have a third parementer for message if you do not wish to build a template.

                if(!$mail->sendMail($this->clean_email,"New User"))
                {
                    $this->mail_failure = true;
                }
            }
        }
        else
        {
            //Instant account activation
            $this->user_active = 1;
        }   


        if(!$this->mail_failure)
        {
                //Insert the user into the database providing no errors have been found.
                $sql = "INSERT INTO `".$db_table_prefix."Users` (
                        `Username`,
                        `Username_Clean`,
                        `Password`,
                        `Email`,
                        `ActivationToken`,
                        `LastActivationRequest`,
                        `LostPasswordRequest`, 
                        `Active`,
                        `Group_ID`,
                        `SignUpDate`,
                        `LastSignIn`
                        )
                        VALUES (
                        '".$db->sql_escape($this->unclean_username)."',
                        '".$db->sql_escape($this->clean_username)."',
                        '".$secure_pass."',
                        '".$db->sql_escape($this->clean_email)."',
                        '".$this->activation_token."',
                        '".time()."',
                        '0',
                        '".$this->user_active."',
                        '1',
                        '".time()."',
                        '0'
                        )";

            return $db->sql_query($sql);
        }
    }
}

そして、ここにテーブル構造があります:

CREATE TABLE IF NOT EXISTS `userCake_Users` (
  `User_ID` int(11) NOT NULL AUTO_INCREMENT,
  `Username` varchar(150) NOT NULL,
  `Name` varchar(100) NOT NULL,
  `Username_Clean` varchar(150) NOT NULL,
  `Password` varchar(225) NOT NULL,
  `Email` varchar(150) NOT NULL,
  `ActivationToken` varchar(225) NOT NULL,
  `LastActivationRequest` int(11) NOT NULL,
  `LostPasswordRequest` int(1) NOT NULL DEFAULT '0',
  `Active` int(1) NOT NULL,
  `Group_ID` int(11) NOT NULL,
  `SignUpDate` int(11) NOT NULL,
  `LastSignIn` int(11) NOT NULL,
  PRIMARY KEY (`User_ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
4

3 に答える 3

2

この醜いコードで 4 つのことを行います。

1) error_reporting モードを有効にして、sthg が発生した場合に何かを確認できるようにします。

 error_reporting(E_ALL);  

2) この INSERT sqlを dB に直接テストして、正しく機能していることを確認し、このコードを検証します。SQL INSERT リクエストが有効な場合は、上記の Abhay のように、これらの SQL リクエストへのアクセス条件を確認してください。

3) すべての設定が利用可能ではないため、推測ゲームは困難です。そのため、AI User_ID に NULL フィールドを 1 つ追加することをお勧めします。

$sql = "INSERT INTO `".$db_table_prefix."Users` (
                    `User_ID`, // Add this here
                    `Username`,
                    `Username_Clean`,
                    `Password`,
                    `Email`,
                    `ActivationToken`,
                    `LastActivationRequest`,
                    `LostPasswordRequest`, 
                    `Active`,
                    `Group_ID`,
                    `SignUpDate`,
                    `LastSignIn`
                    )
                    VALUES (
                    NULL,  // and that one
                    '".$db->sql_escape($this->unclean_username)."',
                    '".$db->sql_escape($this->clean_username)."',
                    '".$secure_pass."',
                    '".$db->sql_escape($this->clean_email)."',
                    '".$this->activation_token."',
                    '".time()."',
                    '0', // later, I would also try using an int for an int
                    '".$this->user_active."',
                    '1',
                    '".time()."',
                    '0'
                    )";

4) OOP と PDO を使用して、より適切にコーディングされた別のものを見つける。

于 2011-06-22T23:03:19.493 に答える
2

私には、最初のユーザーが追加された後にユーザーが追加されない理由が 2 つあります。

まず、$this->mail_failure最初のユーザーが作成された後、次のユーザー アカウントのフラグが TRUE に設定されます。ただし、最初のユーザーに対して正常に実行されたのと同じコードであり、他のユーザーに対してフラグを TRUE にする理由がないため、このシナリオはありそうにありません。

2 番目の可能性は$this->status、2 番目のユーザー アカウントが FALSE であるということです。false の場合、メソッドuserCakeAddUser()は何もしません。このフラグが false になる理由は、ユーザー名または電子メール アドレスが既に存在するためです。

最初のアカウントに使用したのと同じユーザー名またはメール アドレスを 2 番目のアカウントにも使用していますか? 同じユーザー名ではなく、おそらく同じメール アドレスを使用しているに違いありません。usercake クラスは、同じユーザー名または同じ電子メール アドレスを許可しません。

お役に立てれば。

于 2011-06-22T09:36:51.080 に答える
0

NameをNOTNULLとして指定し、コードのInsertステートメントでName値を送信していないため、mysqlは、Nameをnullにすることはできないという例外をスローします。これを一度確認してください。

于 2011-06-22T06:27:23.790 に答える