2011-06-14 8 views
6

Recientemente encontré este pequeño script de clase de usuario llamado usercake (http://usercake.com/), tiene todas las funciones básicas y parece funcionar muy bien.OOP clase de usuario de PHP (usercake) no se agrega a la base de datos

Mi problema: El primer usuario se agrega a la base de datos bien, pero después de eso no está funcionando. Claramente, hay algo un poco mal que no estoy descifrando (no sé muy bien oop php). No se producen errores (que puedo ver) y se envía el correo electrónico.

Lo he instalado en varios lugares con la misma suerte. Me gustaría solucionarlo porque usar este script ahorra una gran cantidad de reinvención del tiempo de la rueda.

Aquí está la URL en la que tengo que: http://rawcomposition.com/birding/loggedin/register.php Aquí es la función que es llamada una vez que todo se valida:

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

Y aquí es la estructura de la tabla:

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

¿omitió un auto_increment en el PK? – Rufinus

+9

qué código incorrecto, comenzando por globales y no usando pdo – dynamic

+0

El incremento automático está presente en la estructura de la base de datos. @ yes123: ¿conoces una mejor clase de usuario de PHP para usar que no requiera horas y horas para que funcione? – Adam

Respuesta

0

le ha dado El nombre como NOT NULL y en la instrucción Insertar de su código no está enviando el valor Name, por lo que mysql emitirá una excepción, diciendo que Name no puede ser nulo, verifique esto una vez.

+0

aunque el nombre NO ES NULO, pero está absolutamente bien que la instrucción INSERT no lo contenga. MySQL no arrojará errores, solo insertará un valor vacío en la columna 'name'. Si hubiera permitido NULLs, habría almacenado NULL en su lugar. – Abhay

+0

Ahum. El hecho de que MySQL lo acepte (con una advertencia, mente) no significa que sea un buen plan, a menos que haya pasado un valor predeterminado para esa columna. Insertar una cadena vacía solo para eludir NOT NULL no tiene ningún sentido. –

2

Para mí, hay 2 posibilidades por las que no está agregando más usuarios después de que el primero se añade:

En primer lugar, $this->mail_failure indicador se establece en TRUE para las siguientes cuentas de usuario después de crear el primer usuario. Pero este escenario no es probable porque es el mismo código que se ejecutó con éxito para el primer usuario y, por lo tanto, no hay ninguna razón por la cual el indicador sea TRUE para los demás.

La segunda posibilidad es que $this->status es FALSE para la segunda cuenta de usuario. Si es falso, el método userCakeAddUser() no hace nada. Las razones por las cuales esta bandera puede ser falsa es ya sea el nombre de usuario o la dirección de correo electrónico ya existe.

¿Está utilizando el mismo nombre de usuario o dirección de correo electrónico que utilizó para la primera cuenta de la segunda cuenta? Estoy seguro de que no debes usar el mismo nombre de usuario, pero quizás la misma dirección de correo electrónico. Las clases usercake no permiten el mismo nombre de usuario o las mismas direcciones de correo electrónico.

Espero que esto ayude.

2

Haría 4 cosas con este código uggly:

1) para activar el modo error_reporting de manera que se puede ver algo en caso sthg se produce:

error_reporting(E_ALL); 

2) Para probar esta SQL INSERT directamente en el dB para asegurarse de que esté funcionando correctamente y valide este fragmento de código. Si la solicitud sql INSERT es válida, entonces verifique las condiciones de acceso a estas solicitudes SQL, como dijo Abhay arriba,

3) Como no tenemos todas sus configuraciones disponibles, un juego de adivinar es difícil. Entonces, le sugiero que agregue un campo NULO para el 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) para encontrar otro, mejor codificado, utilizando OOP y PDO.

+0

Gracias por el consejo, en realidad encontré otro llamado, una clase llamada "access_user" que parece ser mucho mejor. Hasta ahora no he tenido ningún problema. – Adam

Cuestiones relacionadas