Problema con regreso de valores usando clases (no me regresa lo que yo espero)

Iniciado por Fireball-CH, 27 Mayo 2008, 03:40 AM

0 Miembros y 1 Visitante están viendo este tema.

Fireball-CH

Hola, gente.

Leí que las clases en la versión 5 de PHP están mejoradas (o los objetos). Bueno, quise hacer una sección de Login usando clases pero tengo un problema... no se cómo regresar valores.

Mis archivos son:
  * index.html  -  Ahí está el formulario donde pide el nombre de usuario y la clave.
  * index.php  -   Esta página recibe los datos del formulario para comprobar si los
                         datos son correctos y redireccionar a la página para usuarios
                         registrados.
  * autoload.php  -  Tiene la función __autoload($clase) para incluir la clase necesaria.
  * Login.php  -   Esta página tiene la clase Login que se encarga de comprobar si existe el usuario, si existe regresa como valor el nombre de usuario de la base de datos, en caso contrario regresa la frase "Usuario inexistente".

Bien, el código de la página index.php es el siguiente:

<?php
require("../includes/database.php"); // Con esto no tengo problema
require("classes/autoload.php");

$username $_POST['username'];
$lowerUser strtolower($username);
$password $_POST['password'];
$login = new Login($lowerUser$password);

if(
$login != "Usuario inexistente") {
  
$_SESSION['logged'] = $login;
  echo 
"<p align=\"center\">Accesando...</p>\n";
  echo 
"<meta http-equiv=\"refresh\" content=\"2;URL=controlPanel.php\" />\n";
}
else
  echo 
"<p align=\"center\">El nombre de usuario y/o la contrase&ntilde;a no coincide.</p>\n<p align=\"center\"><a href=\"index.html\" target=\"_self\">Click aqu&iacute; para regresar.</a></p>\n";

mysql_close($connection);
?>



El de la clase Login.php:

<?php
class Login {

  function 
Login($usuario$clave) {
    
$usuarioExiste $this->comprobarUsuario($usuario$clave);
    if(
$usuarioExiste != "")
      return 
$usuarioExiste;
    else
      return 
"Usuario inexistente";
  }

  function 
comprobarUsuario($usuario$clave) {
    
$sql "SELECT Usuario,Clave FROM Registro WHERE UsuarioMin = '" $usuario "' AND Clave = '" $clave "'";
    
$result = @mysql_query($sql)
      or die(
"<p align=\"center\"><strong>Ocurri&oacute; un error con la consulta.</strong></p>\n");

    while(
$row mysql_fetch_array($result)) {
      
$rowUser $row['Usuario'];
      
$rowPassword $row['Clave'];
    }

    if(
$clave == $rowPassword)
      return 
$rowUser;
    else
      return 
"";
  }

}
?>



Bien, mi problema es de que cuando creo una instancia de la clase Login, no me regresa los valores como yo esperaba, siempre me regresa la frase "Object id #1". Me refiero a esta parte:

$login = new Login($lowerUser, $password);


Es decir, cuando llega a la parte de if($login != "Usuario inexistente") { (en index.php), la ejecuta porque no lleva la frase "Usuario inexistente"... lo que provoca que se inicie sesión escribiendo lo que sea en el formulario.

¿Qué puedo hacer?
Video en el que explico cómo instalar y configurar Apache 2.0.54, PHP 5.0.0 y MySQL 4.0.20: http://www.mediafire.com/?fevmmnlyzzd

Hans el Topo

haces cosas raras xD

para llamar métodos, funciones o variables de la classe se hace con objeto->nombrefuncion() y tal

$login->comprobarUsuario()

 

alone-in-the-chat

Tu constructor utilizalo para inicializar variables de tu clase.

Un constructor no retorna valores .

Al comprobar $login tu lo que haces es comparar al objeto creado (instancia de la clase). 

Como dijo Hans , haces cosas raras X) .

Saludos¡¡

Because maybe
You're gonna be the one that saves me
And after all
You're my wonderwall
d[n_n]b

Fireball-CH

Jajaja...

OK, si un constructor no retorna valores entonces cómo le puedo hacer?

Hans el Topo, según yo, ésto:

$login = new Login($lowerUser, $password);


es lo mismo que ésto:

$login = new Login();
$login->comprobarUsuario($lowerUser, $password)

¿no? Para eso creo la función Login, para pasar directamente los parámetros cuando uso la palabra clave new.

También se me olvidó agregar la palabra clave private antes de function comprobarUsuario($usuario, $clave) {, entonces quedaría así:

private function comprobarUsuario($usuario, $clave) {
Video en el que explico cómo instalar y configurar Apache 2.0.54, PHP 5.0.0 y MySQL 4.0.20: http://www.mediafire.com/?fevmmnlyzzd

Hans el Topo

http://es.php.net/manual/es/language.oop.php

si no lo entiendes mirate el manual y una vez entendido si tienes laguna duda concreta pregunta
si te respondemos y sigues en las tuyas para que preguntas?
 

Fireball-CH

No ps llego a la conclusión de que PHP sigue sin estar bien con la POO. ¿Cómo es posible que no pueda regresar valores? ¡Java sí puede!

¿Pero sí se entendió lo que quiero hacer? Modifiqué un poco el código y así sí me funciona:

index.php

<?php
require("../includes/database.php");  // No hay problema con esto.
require("classes/autoload.php");

$username $_POST['username'];
$lowerUser strtolower($username);
$password $_POST['password'];
$login = new Login($lowerUser$password);

mysql_close($connection);
?>



Login.php

<?php
class Login {

  function 
Login($user$pass) {
    
$sql "SELECT Usuario,Clave FROM Registro WHERE UsuarioMin = '" $user "' AND Clave = '" $pass "'";
    
$result = @mysql_query($sql)
      or die(
"<p align=\"center\"><strong>Ocurri&oacute; un error con la consulta.</strong></p>\n");

    while(
$row mysql_fetch_array($result)) {
      
$rowUser $row['Usuario'];
      
$rowPassword $row['Clave'];
    }

    if(
$rowUser != "" and $rowPassword != "" and $pass == $rowPassword) {
      
$_SESSION['logged'] = $rowUser;
      echo 
"<p align=\"center\">Accesando...</p>\n";
      echo 
"<meta http-equiv=\"refresh\" content=\"2;URL=controlPanel.php\" />\n";
    }
    else
      echo 
"<p align=\"center\">El nombre de usuario y/o la contrase&ntilde;a no coincide.</p>\n<p align=\"center\"><a href=\"index.html\" target=\"_self\">Click aqu&iacute; para regresar.</a></p>\n";
  }

}
?>

Video en el que explico cómo instalar y configurar Apache 2.0.54, PHP 5.0.0 y MySQL 4.0.20: http://www.mediafire.com/?fevmmnlyzzd

alone-in-the-chat

Un constructor que retorna valores????

Puedes pasarme un ejemplo , te juro que es la primera vez que veo  :-\
Bueno remitete a las pruebas , postea un code aqui lo ejecuto , pero por concepto un constructor no retorna valores , solo se usa para inicializar el objeto , creo que el que no esta bien con la POO es otro  :-\.

Atribuirle la culpa de que algo no te funcione al lenguaje es sencillo , ni siquiera reviso tu codigo por que lo que pretendes hacer es tan sencillo que hasta flojera me da verlo.

Dedicale un poco mas a la lectura de php orientado a objetos , veras que no tiene nada que envidiar a otros lenguajes.


Saludos


Because maybe
You're gonna be the one that saves me
And after all
You're my wonderwall
d[n_n]b

Fireball-CH

Sí, tienes razón, es que ando medio... "norteadón" jajaja...
Sí, tendré que leer más sobre la POO en PHP. Y sí, lo que quiero hacer es sencillo pero aún así lo quería hacer usando clases.
Video en el que explico cómo instalar y configurar Apache 2.0.54, PHP 5.0.0 y MySQL 4.0.20: http://www.mediafire.com/?fevmmnlyzzd

Mamsaac

La estructura que estás manejando para tu sistema no corresponde a la forma en que se manejan la POO. Tener un solo constructor sin ningún método no amerita la creación de una clase.

Te recomiendo no solamente leer el manual de PHP para POO, sino referencias completas de lo que es la POO.

Y en Java, C#, C++ y PHP (y en ningún lenguaje que conozca, aunque no son muchos) los constructores NO retornan valores.

public class Clase1 {
private int var1;

public Clase1(int var1) {
this.var1 = var1;
}

public void metodo1() {
System.out.println("var1 es: "+this.var1);
}

public int metodo2() {
return this.var1;
}
}


Como puedes ver, cuando un método no retorna nada es "void", cuando retorna algo se dice el tipo, pero en el constructor, ni siquiera hay una declaración de algún valor de retorno o algo, y tiene su por qué.

No hagas una clase que no vaya a tener solamente un constructor o un solo método, no tiene chiste.

Fireball-CH

Video en el que explico cómo instalar y configurar Apache 2.0.54, PHP 5.0.0 y MySQL 4.0.20: http://www.mediafire.com/?fevmmnlyzzd