Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Mi primer Script

Estas en el tema de Mi primer Script en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Bueno, acabo de hacer mi primer script en POO. Despues de leer la teoria y articulos sobre este tipo de programacion. Escribo aca mi codigo, ...
  #1 (permalink)  
Antiguo 23/03/2009, 20:09
 
Fecha de Ingreso: enero-2008
Ubicación: Buenos Aires
Mensajes: 305
Antigüedad: 16 años, 4 meses
Puntos: 14
Mi primer Script

Bueno, acabo de hacer mi primer script en POO. Despues de leer la teoria y articulos sobre este tipo de programacion.

Escribo aca mi codigo, busco consejos / criticas / mejoras / optimizacion / etc. Cualquier comentaario es bienvenido:

config.php
Código PHP:
<?php

/**
 * @author Lucas M. Gonzalez
 * @copyright 2009
 * @email [email protected]
 */

#Base de Datos
$dbhost='localhost'// Host de Base de Datos
$dbusuario='root'// Usuario de la base de Datos
$dbpass='root'// Contraseñia de la Base de Datos
$dbnombre='OOP'// Nombre de la Base de Datos
$dbtableuser='usuarios'// Nombre de la tabla de Usuarios

?>
class_login.php
Código PHP:
<?php

/**
 * @author Lucas M. Gonzalez
 * @copyright 2009
 * @email [email protected]
 */

class User{
    var 
$nomUsr;
    var 
$pass;
    var 
$nombre;
    var 
$apellido;
    var 
$email;
    var 
$UserID;
    
    var 
$db_HostName;
    var 
$db_UserName;
    var 
$db_PassWord;
    var 
$db_DataBaseName;
    var 
$db_TableName;
    var 
$db_ConectarError;
    var 
$db_SelectError;
    var 
$db_ConID;
    
    function 
__construct(){
        
// Datos de Configuracion General del sitio
        
require_once("includes/config.php");
        
// Tomo los datos de la BD
        
$this->db_HostName=$dbhost;
        
$this->db_UserName=$dbusuario;
        
$this->db_PassWord=$dbpass;
        
$this->db_DataBaseName=$dbnombre;
        
// Coneccion a la BD
        
$this->db_ConectarError $this->ConectarDB();
        
$this->db_SelectError $this->SelectDB();
    }
    
    function 
ConectarDB(){
            
$Retorno 0;
            
$dbcon = @mysql_connect($this->db_HostName,$this->db_UserName,$this->db_PassWord);
            if (
$dbcon) {
                
// Conectado al Srv de BD
                
$this->db_ConID $dbcon;
                
$Retorno 1;
                 }
            else{
                
// No se pudo Conectar al Srv de BD
                
$Retorno 0;
                }
   return 
$Retorno;                                           
    }

    function 
SelectDB() {
        
$Retorno 0;
        
$Con = @mysql_select_db($this->db_DataBaseName,$this->db_ConID);
        if (
$Con) {
            
// Conectado a la BD
            
$Retorno 1;
                }
        else { 
            
// No se pudo Conectar a la BD
            
$Retorno 0;
            }        
    return 
$Retorno;
    }

    function 
GetDataUser($UserID){
        
$Query "SELECT * FROM ".$this->db_TableName." WHERE id='".$UserID."'";
        
$SQLQuery=mysql_query($Query,$this->db_ConID);
        
        if (
mysql_num_rows($SQLQuery) == 1){
            while (
$row mysql_fetch_array($SQLQuery)){
                
$this->nomUsr $row['nomusr'];
                
$this->nombre $row['nombre'];
                
$this->apellido $row['apellido'];
                
$this->email $row['email'];
            }
            return 
1;
        }
        else{
            return 
0;
        }
    }
    
    function 
LogUser($Usuario,$Pass){
        
$this->nomUsr=$Usuario;
        
$this->pass=$Pass;
        
        require(
"includes/config.php");
        
        
$this->db_TableName=$dbtableuser;
        
$Retorno 0;
        
        
$Query "SELECT id FROM ".$this->db_TableName." WHERE nomusr='".$this->nomUsr."' AND password='".md5($this->pass)."'";
        
$SQLQuery=mysql_query($Query,$this->db_ConID);
        
//Tomo el ID del usuario para asi llamar a la funcion que toma los datos del usuario.
        
if (mysql_num_rows($SQLQuery) == 1){
            while (
$row mysql_fetch_array($SQLQuery)){
                
$this->UserID $row['id'];
            }
        
$_SESSION['user']=$this->nomUsr;
        
$Retorno $this->GetDataUser($this->UserID);
        }
        else{
            
$Retorno 0;
        }
        return 
$Retorno;
    }
}
?>
procesa.php
Código PHP:
<?php
    
include("class/class_login.php");
    
$oUser = new User();
    if (
$oUser->db_ConectarError == 0){
        echo 
'<p> Error de coneccion al Servidor de BD</p>';
    }
    if (
$oUser->db_SelectError == 0){
        echo 
'<p> Error de coneccion a la BD</p>';
    }
    
$Retorno $oUser->LogUser($_POST['usuario'],$_POST['pass']);
    if (
$Retorno == 0){
        echo 
'<p>Usuario o contraseña invalido';
    }
    else{
        echo 
$oUser->nomUsr.'<br />';
        echo 
$oUser->nombre.'<br />';
        echo 
$oUser->apellido.'<br />';
        echo 
$oUser->email;
    }
?>
index.html
Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Iniciar Sesion</title>
</head>

<body>
<form id="InicioSesion" method="post" action="procesa.php">
    <p><label>Usuario</label>
      <input type="text" name="usuario" id="usuario" />
     </p>
    <p><label>Contrase&ntilde;a</label>
      <input type="text" name="password" id="password" />
     </p>
     <input type="submit" value="Enviar" />
</form>
</body>
</html> 
  #2 (permalink)  
Antiguo 24/03/2009, 10:39
Avatar de juamd  
Fecha de Ingreso: marzo-2009
Ubicación: Bogotá
Mensajes: 285
Antigüedad: 15 años, 2 meses
Puntos: 8
Respuesta: Mi primer Script

Que tal!!!!!!!!

podrias crear una clase para la conexion a la base de datos y los procedimientos como consultar, insertar etc. Es una buena practica porque esta clase es la que guardaria relacion con la base de datos, dejando los demas scripts independientes .

saludos
  #3 (permalink)  
Antiguo 24/03/2009, 20:57
isra00
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mi primer Script

Muy mal!!! Como dice juamd podrías... mejor dicho DEBERÍAS usar diferentes clases para el acceso a la base de datos. Es una cuestión de lógica: la POO se inventó para reutilizar el código (te suena el principio abierto-cerrado?). Así que si quieres mantener en tu programa objetos de tipo "persona" (piensa en una persona en la realidad), no tiene sentido que en el concepto de "persona" vaya implícita su forma de almacenamiento.

Debes dotar de arquitectura tu script. Un error que mucha gente comete al pasarse a POO es no diseñar bien sus clases y, en general, la arquitectura de su programa. En programación no orientada a objetos es necesario hacerlo, pero las estructuras del lenguaje (includes y "gotos" modernos) permiten ciertas chapuzas. Gracias a Dios, esas chapuzas muchas veces en POO no se pueden mantener.

Para tu caso, te recomiendo implementar el patrón DAO (Data Access Object), que establecería un modelo de tres capas: almacenamiento, manejo del almacenamiento y lógica de negocio. Esto se traduce como BD MySQL, una o varias clases que accedan a la BD y trabajen con objetos, y los objetos en sí. Además, para facilitar el acceso a la BD por parte del DAO, puedes crear una clase Mysql. Si quieres ten envío por MP un par de clases (Conexion y Consulta) que estoy usando para un proyecto, aunque seguramente PEAR::DB o la que tú mismo hagas resulte igual o más útil.

Objeto de negocio "User":

Código PHP:
class User{
    var 
$nomUsr;
    var 
$pass;
    var 
$nombre;
    var 
$apellido;
    var 
$email;
    var 
$UserID
   
    public 
__construct($nomUsr$pass$nombre$apellido$email$UserID=null) {
       
$this->nomUsr $nomUsr;
       
$this->pass $pass;
       
$this->nombre $nombre;
       
$this->apellido $apellido;
       
$this->email $email;
       
$this->UserID $UserID
    } 
Funciones de acceso a la base de datos para usuarios

Código PHP:
class DaoUser {
   
//Es estática ya que son funciones no instanciables. Podrías utilizarlas sin POO, pero meterlas en una clase ayuda a organizar el código y facilita su lectura
   
public static function GetDataUser($UserID){
        
$Query "SELECT * FROM users WHERE id='".$UserID."'";
        
$SQLQuery=mysql_query($Query,$this->db_ConID);
        
        if (
mysql_num_rows($SQLQuery) == 1) {
            
$row mysql_fetch_array($SQLQuery);
            return new 
User($row['nomusr'], null$row['nombre'], $row['apellido'], $row['email']);
        }

    
//Otra función podría ser, por ejemplo, cambiar clave
    
public static CambiarClave($UserID$newPassword) {
         
$query mysql_query("UPDATE users SET password='$newPassword' WHERE id = $UserID");
    }


Seguramente estés pensando "este tío qué me está diciendo...??". La POO añade complejidad a los sistemas, pero también una estructura sostenible y escalable. Por muy sencillo que sea tu script, debes armar una estructura de clases decente. Aunque ojo, la POO no es perfecta, a veces es mejor desarrollar scripts al estilo tradicional.

En fin, espero que hayas entendido un poco la metodología que intento transmitirte, es un modelo básico que hoy en día se usa muchísimo, y facilita la reutilización del código y la posibilidad de extender los programas de forma ordenada. Si tienes cualquier duda estaré encantado de ayudarte.

Saludos.

Última edición por jpinedo; 24/03/2009 a las 21:47 Razón: Remover firma del cuerpo del mensaje
Advertencia Recibida
  #4 (permalink)  
Antiguo 25/03/2009, 05:36
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 5 meses
Puntos: 6
Respuesta: Mi primer Script

hola, estoy comenzando a pasar mis cosas a POO pero estoy muy noaton en esto jeje

seria posible que alguien ponga la forma correcta de este ejemplo ?


desde ya muchas gracias.
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #5 (permalink)  
Antiguo 26/03/2009, 10:57
 
Fecha de Ingreso: noviembre-2008
Mensajes: 67
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Mi primer Script

No soy un Dios en esto pero creo que te puedo tirar unas...

Usa 'comillas simples' en vez de "comillas dobles". Las comillas dobles reelentizan tu script ya que php va a buscar si el srting contiene variables, etc. Solo te combiene utilizar comillas dobles cuando necesites usar "\n", etc.
Es mas rapido 'require' que 'require_once'.
Trata de no utilizar '@' para suprimir los errores ya que te hace todo mas lento... utiliza 'mysql_connect... or ...'
Cuando puedas, utiliza metodos y variables como estaticas...
Y obviamente no definas varialbes q no uses, y cuando ya no te sirva una variable, destruila con unset() ya que las variables siempre consumen mucha memoria...

Y trata de utilizar HTML fuera de PHP...

si keres largar un error... ej.

Código:
<?php

if ($name != $user) {
    $error['name'] = '&iexcl;Usuario incorrecto!';
}

?>
y mas abajo en el html.... separado de todo el php... donde kieras largar el error seria algo asi:

Código:
<span><?=$error['name']?$error['name']:''?></span>
Bueno, ando medio apurado... despues te sigo comentando... espero que te sea util...

saludos.

pd: yo tambien soy nuevo en php :D
  #6 (permalink)  
Antiguo 26/03/2009, 11:33
isra00
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mi primer Script

Para thepancher:

En primer lugar, los consejos del tipo "no uses comillas dobles" o "require en vez de require_once" son nimiedades en comparación con la optimización real en aplicaciones web importantes: cachés de servidor, de base de datos, compartición de conexiones a la BD, escalabilidad horizontal, etc. Ahorrar unos milisegundos en la ejecución de un script no es muy útil. Aunque tengas que ejecutar ese scripts miles de veces. No vale la pena preocuparse por eso.

En segundo lugar, las etiquetas <? y <?= están depreciadas y no se recomienda su uso. La forma tradicional <?php es más adecuada, más legible y más interoperable.

Y para kokoou:

Uno de los principios más importantes de la POO es la independencia de clases y la reutilización del código. Eso significa que, si tienes una clase para conexión a Mysql, debes poder coger esa clase y llevártela a otra aplicación totalmente distinta, en un entorno potencialmente diferente, y que funcione. Si dentro de la clase de conexión a BD cargas un archivo de configuración, estás rompiendo este principio, porque no sabes si en una nueva aplicación utilizarás ese archivo de configuración, o si esos datos los introducirá el usuario, etc.

Por ello debes independizar y "atomizar" las clases: que hagan una sóla cosa y que la hagan bien, como la filosofía de UNIX. Hablando en PHP, deberías pasarle al constructor de la clase BD los datos de conexión. De este modo, el entorno en el que ubiques la clase deberá pasarle a esta los datos, consiguiendo independizar la clase BD del resto de la aplicación.

Básicamente, esa es una de las grandes ventajas de la POO, aunque también añade complejidad, lo que la hace algo confusa al principio.
  #7 (permalink)  
Antiguo 26/03/2009, 12:00
 
Fecha de Ingreso: noviembre-2008
Mensajes: 67
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Mi primer Script

toda la razon... mucho no te puedo discutir ya que soy mas o menos nuevo en esto... pero yo no he dicho nada de cargar en archivo de configuracion dentro de una clase, por que es algo obvio lo que de decis de que cada clase se independiente y haga una sola cosa, y que la hagan bien... yo mismo estoy tratando de hacer una clase para manejarme con mysql.... y me esta costando ya que cada dia que leo al respecto, cambio cosas completamente, o agrego o saco... no se si hago bien, pero en las cosas que hago, trato de separar los valores, con el proceso... es decir, que los valores sean introducidos desde afuera desde la clase, y no desde adentro, sino no valdria la pena... no se si me explico.

Y con el tema de las etiquetas... no sabia eso que me decis...pero yo igualmente siempre utilizo <?php ?>... ya que nunca me senti seguro usando <? ?> o <?= ?>
  #8 (permalink)  
Antiguo 26/03/2009, 17:38
isra00
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mi primer Script

Antes me daba pereza buscar el enlace pero aquí lo tienes: http://en.wikibooks.org/wiki/Program...ping_from_HTML

Transcribo: "Deprecated now due to required use of short tags (which causes unescaped <? or ?> segments in XML to conflict)".

No obstante, la forma <?php también produce conflictos con XML, a mí me pasaba hace unos días generando un RSS, pero se soluciona poniendo echo "<?xml"... o utilizando motores de plantillas.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:46.