Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Fireball-CH en 27 Mayo 2008, 03:40 am



Título: Problema con regreso de valores usando clases (no me regresa lo que yo espero)
Publicado por: Fireball-CH en 27 Mayo 2008, 03:40 am
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:
Código:
<?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:
Código:
<?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:
Código:
$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?


Título: Re: Problema con regreso de valores usando clases (no me regresa lo que yo esper
Publicado por: Hans el Topo en 27 Mayo 2008, 10:50 am
haces cosas raras xD

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

Código:
$login->comprobarUsuario()



Título: Re: Problema con regreso de valores usando clases (no me regresa lo que yo esper
Publicado por: alone-in-the-chat en 28 Mayo 2008, 00:18 am
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¡¡



Título: Re: Problema con regreso de valores usando clases (no me regresa lo que yo esper
Publicado por: Fireball-CH en 28 Mayo 2008, 01:08 am
Jajaja...

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

Hans el Topo, según yo, ésto:
Código:
$login = new Login($lowerUser, $password);

es lo mismo que ésto:
Código:
$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í:
Código:
private function comprobarUsuario($usuario, $clave) {


Título: Re: Problema con regreso de valores usando clases (no me regresa lo que yo esper
Publicado por: Hans el Topo en 28 Mayo 2008, 11:03 am
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?


Título: Re: Problema con regreso de valores usando clases (no me regresa lo que yo esper
Publicado por: Fireball-CH en 28 Mayo 2008, 18:53 pm
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
Código:
<?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
Código:
<?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";
  }

}
?>


Título: Re: Problema con regreso de valores usando clases (no me regresa lo que yo esper
Publicado por: alone-in-the-chat en 29 Mayo 2008, 02:46 am
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




Título: Re: Problema con regreso de valores usando clases (no me regresa lo que yo esper
Publicado por: Fireball-CH en 29 Mayo 2008, 04:31 am
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.


Título: Re: Problema con regreso de valores usando clases (no me regresa lo que yo espero)
Publicado por: Mamsaac en 30 Junio 2008, 09:42 am
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.
Código:
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.


Título: Re: Problema con regreso de valores usando clases (no me regresa lo que yo esper
Publicado por: Fireball-CH en 1 Julio 2008, 05:40 am
Todo eso que escribiste, Mamsaac, ya lo se.