Foros del Web » Programando para Internet » PHP »

Opinar Sobre esta CLASS

Estas en el tema de Opinar Sobre esta CLASS en el foro de PHP en Foros del Web. Estoy haciendo un acortador de URL y voy hacer esta class para hacer las consultas. ¿Es recomendable utilizarla?¿Se puede mejorar?¿Como? Código PHP: <?php class  AcortarURL ...
  #1 (permalink)  
Antiguo 18/05/2013, 04:56
 
Fecha de Ingreso: diciembre-2012
Mensajes: 223
Antigüedad: 11 años, 4 meses
Puntos: 2
Opinar Sobre esta CLASS

Estoy haciendo un acortador de URL y voy hacer esta class para hacer las consultas.
¿Es recomendable utilizarla?¿Se puede mejorar?¿Como?

Código PHP:
<?php
class AcortarURL
{
    
    public function 
__construct()
    {
        
$this->host '.......';
        
$this->user '.......';
        
$this->pass '.....';
        
$this->db '...........';
        
$this->connect mysqli_connect($this->host,$this->user,$this->pass,$this->db);
    }
    
    public function 
Query($sql,$camp)
    {
        
$this->Query mysqli_fetch_assoc(mysqli_query($this->connect,$sql));
        if(
$this->Query):
            return 
$this->Query[$camp];
        else:
            echo 
'No existe';
        endif;
        return 
$this->Query;
    }
    
    public function 
Select($sql)
    {
        
$this->Select mysqli_query($this->connect,$sql);
        return 
$this->Select;
    }
}

$MySQL = new AcortarURL();

// Ejemplos
$MySQL->Query("SELECT * FROM url WHERE id = '1'"'id'); // Eligo el campo, y compruebo si existe o no.
if($MySQL->Query['id'] == 'noseque'): // Hago un if, y muestro si el contenido es correcto o no.
    
echo 'Correcto';
else:
    echo 
'Incorrecto';
endif;

$MySQL->Select("SELECT * FROM url"); // Hago la consulta.
while($MySQL->Select1 mysqli_fetch_assoc($MySQL->Select)){ // Hago el while.
    
echo $MySQL->Select1['id']; // Muestro el campo.
}
?>

Última edición por XD2XD2; 18/05/2013 a las 05:58
  #2 (permalink)  
Antiguo 18/05/2013, 06:03
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Opinar Sobre esta CLASS

Pues inicialmente tienes una mala concepción de OOP, dicha clase es mas bien un wrapper para ejecutar consultas que un "acortador de url".

Primero estudia las bases de OOP y luego estudia como funciona un acortador de urls, lo que tienes no se parece en lo más mínimo, no tiene sentido.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 18/05/2013, 06:05
 
Fecha de Ingreso: diciembre-2012
Mensajes: 223
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: Opinar Sobre esta CLASS

Cita:
Iniciado por pateketrueke Ver Mensaje
Pues inicialmente tienes una mala concepción de OOP, dicha clase es mas bien un wrapper para ejecutar consultas que un "acortador de url".

Primero estudia las bases de OOP y luego estudia como funciona un acortador de urls, lo que tienes no se parece en lo más mínimo, no tiene sentido.
No, eso no es una acortador de URL, es una class para hacer las consultas. El acortador de url lo are despues. eso sirve para hacer consultas.
  #4 (permalink)  
Antiguo 18/05/2013, 10:06
Avatar de bulter  
Fecha de Ingreso: enero-2008
Mensajes: 137
Antigüedad: 16 años, 3 meses
Puntos: 20
Respuesta: Opinar Sobre esta CLASS

Mmm no mola esta "clase" :|
Primero, no puedes poner le nombre AcortarURL a una clase que sera para hacer consultas, manipular db o lo que sea. Es como llamar a un gato perro :)

Código PHP:
if($this->Query):
            return 
$this->Query[$camp];
        else:
            echo 
'No existe';
        endif; 
??? usa {}

Código PHP:
if($this->Query)
{
            return 
$this->Query[$camp];
        }
        else
        {
            echo 
'No existe';
        } 
Empecemos por el constructor.

Código PHP:
public function __construct()
    {
        
$this->host '.......';
        
$this->user '.......';
        
$this->pass '.....';
        
$this->db '...........';
        
$this->connect mysqli_connect($this->host,$this->user,$this->pass,$this->db);
    } 
No tiene ni 1 comprobacion si los parametros que han sido pasados con validos y tampoco has definido la variable $this->connect simplemente la usas, ademas $this->connect es un nombre malo debe de ser $this->connection o $this->dbConnection, porque lo que contiene es un resource y no es una funciona que hara la conexion.

Código PHP:
$this->connect mysqli_connect($this->host,$this->user,$this->pass,$this->db); 
Si la conexion no se ha realizado, nada lo indica el codigo sigue su marcha , y lo correcto es que des algun error.

Código PHP:
$this->host$this->user$this->pass$this->db 
Tampoco las tienes definidas. Aparte estas variables deben de ser privadas.

Código PHP:
public function __construct() 
Ya que vas a usar clases, el usuario , el host etc los podrias pedir como parametros.

Bueno el constructor se podria quedar asi:

Código PHP:
<?php
class DBException extends Exception { }

class 
DB
{
    private 
$dbData = array();
    private 
$connection null;
    
    public function 
__construct(array $dbData)
    {
        if(!isset(
$dbData["host"], $dbData["user"], $dbData["pass"], $dbData["dbName"]))
        {
            throw new 
InvalidArgumentException("The passed arguments are invalid.");
        }
        
        
/// Filter all the passed data
        
$this->dbData $this->Filter($dbData);
        
        
// Connect to the database
        
$this->connection = @mysqli_connect($this->dbData["host"], $this->dbData["user"], $this->dbData["pass"], $this->dbData["dbName"]);
        
        if(!
$this->connection)
        {
            throw new 
DBException("Cannot connect to the database. " mysqli_connect_error());
        }
        
        return 
true;
    }
    
    protected function 
Filter(&$filter)
    {
        if(
$filter == "" || $filter == null)
        {
            return;
        }
        
        foreach(
$filter as &$value)
        {
            if(
is_array($value))
            {
                
$value $this->Filter($value);
            }
            else
            {
                
$value htmlspecialchars(trim(addslashes($value)));
            }
        }
        
        return 
$filter;
    }
}

try
{
    
$db = new DB(array("host"   => "localhost"
                       
"user"   => "tmpUser"
                       
"pass"   => "@t1ptron1c!"
                       
"dbName" => "test"));
}
catch(
DBException $dbExc)
{
    echo 
$dbExc->getMessage();
}                   

?>
Veamos las otras 2 funciones que tienes

Código PHP:
public function Query($sql,$camp)
    {
        
$this->Query mysqli_fetch_assoc(mysqli_query($this->connect,$sql));
        if(
$this->Query):
            return 
$this->Query[$camp];
        else:
            echo 
'No existe';
        endif;
        return 
$this->Query;
    }
    
    public function 
Select($sql)
    {
        
$this->Select mysqli_query($this->connect,$sql);
        return 
$this->Select;
    } 
Empezamos por public function Query($sql,$camp)
En ambas funciones usas mysqli_query($this->connect,$sql), y tienes una funcion que se llama Query ? Esto lo no pillo. Bueno la cuestion es que la primera funcion que la llamaste Query creo que le vendria mejor SelectRow. Y la funcion Select es la que hace en realidad el query, asi que ella es la que se deberia de llamar query. Otra cosa aparte es que no hace ningun check / vertificacion de lo que pasa dentro de la funcion, lo dejas invisible y que siga a su marcha pase lo que pase. Haces las querys sin comprobar si ya tienes una conexion abierta.

Código PHP:
$this->Select mysqli_query($this->connection$sql);
        return 
$this->Select
Porque le asignas algo a $this->Select y luego devuelves lo mismo y la variable se queda en lo vacio ? No tiene sentido. Otra cosa la funcion SelectRow (o Query en tu caso) podrias hacer que aparte de un campo pudiera devolver mas por si llegas a necesitar lo. Aun que eso no tiene mucho sentido ya que lo puedes hacer atraves del SQL, pero bueno.
La clase se podria quedar algo asi:

Código PHP:
<?php
class DBException extends Exception { }

class 
DB
{
    private 
$dbData = array();
    private 
$connection null;
    
    public function 
__construct(array $dbData)
    {
        
///
        /// Check if all the data is defined.
        ///
        
if(!isset($dbData["host"], $dbData["user"], $dbData["pass"], $dbData["dbName"]))
        {
            throw new 
InvalidArgumentException("The passed arguments are invalid.");
        }
        
        
/// Filter all the passed data
        
$this->dbData $this->Filter($dbData);
        
        
// Connect to the database
        
$this->connection = @mysqli_connect($this->dbData["host"], $this->dbData["user"], $this->dbData["pass"], $this->dbData["dbName"]);
        
        if(!
$this->connection)
        {
            throw new 
DBException("Cannot connect to the database. " mysqli_connect_error());
        }
        
        return 
true;
    }
    
    public function 
SelectRow($sql$row)
    {
        if(!
is_string($row) && !is_array($row))
        {
            throw new 
InvalidArgumentException("DB::SelectRow expects \$row to be string or array.");
        }
        
        
$query mysqli_fetch_assoc($this->Query($sql));
        
        if(
is_string($row))
        {
            if(!isset(
$query[$row]))
            {
                throw new 
DBException("The row " $row " can not be found.");
            }
            
            return 
$query[$row];
        }
        else
        {
            
$arrayToReturn = array();
            
            foreach(
$row as $value)
            {
                if(!isset(
$query[$value]))
                {
                    throw new 
DBException("The row " $value " can not be found.");
                }
                else
                {
                    
$arrayToReturn[$value] = $query[$value];
                }
            }
            
            return 
$arrayToReturn;
        }
    }
    
    public function 
Query($sql)
    {
        if(!
is_string($sql))
        {
            throw new 
InvalidArgumentException("DB::Query takes string as parameter.");
        }
        
        if(!
$this->connection)
        {
            throw new 
DBException("No Connection to the database.");
        }
        
        
$query = @mysqli_query($this->connection, (string)$this->Filter($sql));
        
        if(!
$query)
        {
            throw new 
DBException(mysqli_error($this->connection));
        }
        
        return 
$query;
    }
    
    protected function 
Filter(&$filter)
    {
        if(
$filter == "" || $filter == null)
        {
            return;
        }
        
        foreach(
$filter as &$value)
        {
            if(
is_array($value))
            {
                
$value $this->Filter($value);
            }
            else
            {
                
$value htmlspecialchars(trim(addslashes($value)));
            }
        }
        
        return 
$filter;
    }
}

try
{
    
$db = new DB(array("host"   => "localhost"
                       
"user"   => "tmpUser"
                       
"pass"   => "@t1ptron1c!"
                       
"dbName" => "test"));
    
    
print_r($db->SelectRow("SELECT * FROM user", array("name""email")));    
}
catch(
DBException $dbExc)
{
    echo 
$dbExc->getMessage();
}                   

?>
Eso esta lejos del perfecto solo te digo como podria ser algo mejor. Le faltan muchas cosas para llegar a ser util.

Saludos
  #5 (permalink)  
Antiguo 18/05/2013, 10:38
 
Fecha de Ingreso: diciembre-2012
Mensajes: 223
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: Opinar Sobre esta CLASS

Cita:
Iniciado por bulter Ver Mensaje
[php]
Primero, no puedes poner le nombre AcortarURL
Por ponerle eso nombre no quiere decir que este mal. Yo quiero opinion sobre si se puede mejorar, da igual un nombre u otro.

Cita:
Iniciado por bulter Ver Mensaje
[php]
??? usa {}
Los : ahorran mas.

Estas diciendo que cambie los nombres, pero esque eso no tiene nada que ver. Como si lo quiero llamar prublic function EliminarTabla(){ y que haga un update o un select.
  #6 (permalink)  
Antiguo 18/05/2013, 11:14
Avatar de bulter  
Fecha de Ingreso: enero-2008
Mensajes: 137
Antigüedad: 16 años, 3 meses
Puntos: 20
Respuesta: Opinar Sobre esta CLASS

LoL has dicho que opinemos y te di mi opinión. Los nombres tienen mucho que ver.
Lee algo sobre High-Quality Programming Code es algo imprescindible el en OOP

Cita:
Los : ahorran mas.
Ahorran que ? oO
La sintaxis alternativa de las estructuras de control las usan para Templates si llegas a hacer templates con PHP mezclado con HTML. Pero lo que haces , no se hace.
Te dimos nuestras opiniones si no te gustan o no vas a hacer caso por que te molestas en preguntar. Y si los nombres de los metodos las clases y las variables son importantisimos, aun que tengas toda la clase bien implementada y al final la cagas con los nombre, la clase ya no vale. Dejame citar a un Software Engineer llamado Svetlin Nakov, acerca del Quality Programming Code.

Cita:
Why We Need Methods? Methods are important in software development Reduce complexity Divide and conquer: complex problems can be split into composition of several simple ones Improve code readability Small methods with good method names make the code self-documenting Avoid duplicating code Duplicating code is hard to maintain.

...

7. Using Methods: Fundamentals Fundamental principle of correct method usage: Methods should do exactly what their names say Nothing less Nothing more
Aparte de los nombres, te dije que no haces ninguna comprobacion, sacas variables y las usas de la nada, defines variables que no son utiles y no se usan, simplemente estan por estar ...
No te lo tomes a mal pero si dices

Cita:
Como si lo quiero llamar prublic function EliminarTabla(){ y que haga un update o un select.
no sabes lo que es el OOP y cual es su proposito, no hagas algo que no entiendes y aun menos lo discutas. A que no molaria esto:

Código PHP:
<?php
function RestarValores($a$b)
{
    return ((
$a $b) * 10 ) ^ 2;
}

$saldoEnLaCuenta 100;
$dineroRetirado 50;
$nuevoSaldoEnLaCuenta RestarValores($saldoEnLaCuenta$dineroRetirado);

printf("Su saldo es de: %d"$nuevoSaldoEnLaCuenta);
?>
Imaginate que trabajas en una gran empresa y le das a tu colega un archivo con funciones y el ve la funcion RestarValores y la usa... Pues la caga y sera culpa tuya. Mientras que si le das esto

Código PHP:
<?php
function RestarValores($a$b)
{
    return (int)
$a - (int)$b;
}

$saldoEnLaCuenta 100;
$dineroRetirado 50;
$nuevoSaldoEnLaCuenta RestarValores($saldoEnLaCuenta$dineroRetirado);

printf("Su saldo es de: %d"$nuevoSaldoEnLaCuenta);
?>
Ya es otra cosa.
Una de las ideas del OOP es el code reuse...http://en.wikipedia.org/wiki/Code_reuse Lee lo que es

Última edición por bulter; 18/05/2013 a las 11:34

Etiquetas: class, mysql, opinar, select, sql
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




La zona horaria es GMT -6. Ahora son las 15:52.