2011-06-14 9 views
6

Niedawno znalazłem ten mały skrypt klasy użytkownika o nazwie usercake (http://usercake.com/), ma wszystkie podstawowe funkcje i wydaje się działać bardzo dobrze.Klasa użytkownika OOP PHP (usercake) bez dodawania do bazy danych

Mój problem: Pierwszy użytkownik zostanie dodany do bazy danych w porządku, ale po tym nie działa. Najwyraźniej jest coś, co jest trochę nie tak, czego nie wymyślę (bardzo dobrze nie wiem o PHP). Nie występują żadne błędy (które widzę), a wiadomość e-mail zostanie wysłana.

Zainstalowałem wiele miejsc z tym samym przeznaczeniem. Chciałbym to naprawić, ponieważ użycie tego skryptu oszczędza wiele na nowo.

Oto URL gdzie mam go: http://rawcomposition.com/birding/loggedin/register.php Oto funkcja, która jest wywoływana raz wszystko jest potwierdzone:

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); 
     } 
    } 
} 

I tu jest struktura tabeli:

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 ; 
+0

przegapił auto_increment na PK? – Rufinus

+9

co za zły kod, począwszy od globals i nie używając pdo – dynamic

+0

Auto increment jest obecny w strukturze DB. @ yes123: czy znasz lepszą klasę użytkowników PHP, która nie wymaga wielu godzin pracy? – Adam

Odpowiedz

0

Ty podano Nazwa jako NOT NULL i w instrukcji Insert twojego kodu nie wysyła wartości Name, więc mysql wyrzuci wyjątek, mówiąc, że Name nie może mieć wartości NULL, sprawdź to raz.

+0

chociaż Nazwa NIE jest NULL, ale absolutnie w porządku, aby instrukcja INSERT nie zawierała tego. MySQL nie wyśle ​​żadnych błędów, wstawi jedynie pustą wartość do kolumny 'name'. Gdyby zezwolono na wartości NULL, zamiast tego przechowywałby wartość NULL. – Abhay

+0

Ahum. Fakt, że MySQL ją zaakceptuje (z ostrzeżeniem, umysłem) nie oznacza, że ​​jest to dobry plan, chyba że podałeś domyślną wartość dla tej kolumny. Wstawianie pustego łańcucha tylko w celu ominięcia NOT NULL nie ma żadnego sensu. –

2

Dla mnie są 2 możliwości, dlaczego nie jest dodanie kolejnych użytkowników po pierwszym w brzmieniu:

Najpierw $this->mail_failure flaga jest ustawiona na wartość true dla następujących kont użytkowników po pierwszym użytkownikiem jest tworzony. Ale ten scenariusz nie jest prawdopodobny, ponieważ jest to ten sam kod, który został uruchomiony z powodzeniem dla pierwszego użytkownika i dlatego nie ma powodu, dla którego flaga powinna mieć wartość TRUE dla innych.

Druga możliwość jest taka, że ​​$this->status ma wartość FALSE dla drugiego konta użytkownika. Jeśli wartość jest false, metoda nie działa. Powodem, dla którego ta flaga może być fałszywa, jest nazwa użytkownika lub adres e-mail już istnieje.

Czy używasz tej samej nazwy użytkownika lub adresu e-mail, który został użyty dla pierwszego konta dla drugiego konta? Jestem pewien, że nie możesz używać tej samej nazwy użytkownika, ale być może tego samego adresu e-mail. Klasy usercake nie zezwalają na tę samą nazwę użytkownika lub te same adresy e-mail.

Mam nadzieję, że to pomoże.

2

chciałbym zrobić 4 rzeczy z tym kodem uggly:

1), aby włączyć tryb error_reporting tak że można zobaczyć coś w przypadku sthg następuje:

error_reporting(E_ALL); 

2), aby przetestować ten INSERT sql bezpośrednio do dB, aby upewnić się, że działa poprawnie i sprawdź poprawność tego kodu. Jeśli żądanie SQL INSERT jest poprawne, sprawdź warunki dostępu do tych żądań SQL, jak Abhay powiedział powyżej,

3) Ponieważ nie mamy dostępnej konfiguracji, gra typu "odgadnięcie" jest trudna. Dlatego sugeruję dodanie jednego pola NULL dla AI User_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) aby znaleźć inną, lepiej zakodowaną, używając OOP i PDO.

+0

Dzięki za poradę, faktycznie znalazłem inne zwane, klasa o nazwie "access_user", która wydaje się być o wiele lepsza. Jak dotąd nie miałem żadnych problemów. – Adam

Powiązane problemy