OOP PHP пользовательский класс (usercake) не добавляется в базу данных - PullRequest
6 голосов
/ 14 июня 2011

Я недавно обнаружил этот маленький скрипт класса пользователя, называемый usercake (http://usercake.com/), имеет все основные функции и, кажется, работает очень хорошо.

Моя проблема : Первый пользователь добавляется в базу данных нормально, но после этого он не работает. Очевидно, что что-то не так, что я не понимаю (я не очень хорошо знаю 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 ;

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

Для меня есть 2 возможности, почему он не добавляет других пользователей после добавления первого:

Во-первых, флаг $this->mail_failure устанавливается на ИСТИНА для следующих учетных записей пользователей после создания первого пользователя. Но этот сценарий маловероятен, потому что это тот же код, который был успешно выполнен для первого пользователя, и поэтому нет причины, по которой флаг должен быть ИСТИНА для других.

Вторая возможность: $this->status - ЛОЖЬ для второй учетной записи пользователя. Если false, метод userCakeAddUser() ничего не делает. Причины, по которым этот флаг может быть ложным, заключается в том, что имя пользователя или адрес электронной почты уже существуют.

Используете ли вы то же имя пользователя или адрес электронной почты, который вы использовали для первой учетной записи, а также для второй учетной записи? Я уверен, что вы не должны использовать то же имя пользователя, но, возможно, тот же адрес электронной почты. Классы usercake не позволяют использовать одно и то же имя пользователя или один и тот же адрес электронной почты.

Надеюсь, это поможет.

2 голосов
/ 23 июня 2011

Я бы сделал 4 вещи с этим уродливым кодом:

1) включить режим error_reporting, чтобы вы могли что-то увидеть в случае возникновения sthg:

 error_reporting(E_ALL);  

2), чтобы протестировать этот INSERT sql прямо в dB , чтобы убедиться, что он работает правильно, и проверить этот фрагмент кода. Если SQL-запрос INSERT действителен, проверьте условия доступа к этому SQL-запросу, как сказал Абхай,

3) Поскольку у нас нет всех ваших настроек, игра в догадки сложна. Поэтому я бы предложил вам добавить одно пустое поле для AI_ID пользователя.

$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) найти другой, лучше закодированный, используя ООП и PDO.

0 голосов
/ 22 июня 2011

Вы задали имя как NOT NULL, и в операторе вставки вашего кода не отправляется значение имени, поэтому mysql выдаст исключение, говоря, что имя не может быть пустым, проверьте это один раз.

...