¿La mejor práctica cuando se trata de múltiples resultados de una consulta/varias consultas?

Esta es la primera vez que crearé una aplicación PHP que tendrá acceso a muchos usuarios, así que antes no tenía que preocuparme por las velocidades de carga, pero ahora sí.

Estas son las formas en que he pensado en hacerlo, pero todas parecen ser un poco "hack-ish" y estoy seguro de que hay una mejor manera.

Para la página de índice podría tener esto:

<h1><?php $job->getTitle($id); ?></h1>
<p><?php $job->getDescription($id); ?></p>
<p><?php $job->getSomethingElse($id); ?></p>

Y la clase como:

function getTitle($id) {
    $query = "SELECT title FROM table WHERE id = $id";
    $result = $db->query($query);

    $row = $result->fetch_array(MYSQLI_ASSOC);
    echo $row['title'];
}

function getDescription($id) {
    $query = "SELECT description FROM table WHERE id = $id";
    $result = $db->query($query);

    $row = $result->fetch_array(MYSQLI_ASSOC);
    echo $row['description'];
}

etc ...

O podría tener una función, llamar a todos los resultados a una matriz. Guárdelos como una Cadena y explótelos cuando los necesite.

Mi otra idea era similar a la anterior, excepto que hago todo en la clase y hago eco del html.

¿Cuál es la mejor manera en términos de velocidad para generar lo que quiero?

preguntado el 12 de junio de 12 a las 11:06

¡Si es posible, intente obtener todos los datos de la base de datos una vez! -

Eso es lo que pensé, simplemente no estaba seguro del mejor enfoque y quería demostrar que había pensado en todas mis opciones. Mi conocimiento de OOP proviene de Java y nunca lo he usado con conexiones de base de datos. Entonces, mezcle esto con mi conocimiento limitado de PHP procesal. ¿Podría la persona que votó negativamente explicar por qué? Traté de seguir las reglas con respecto a hacer una pregunta. Con respecto a las respuestas, parece que todas funcionarán bien para lo que quiero, así que las probaré y marcaré como mejor respuesta después de eso. -

3 Respuestas

Jee, ¿alguna vez has escuchado sobre el patrón de diseño MVC (Model-View-Controller)?

Aunque no quiero que reescribas toda tu aplicación, aún puedes acostumbrarte a usar modelos... De esta manera (de manera muy simple) creas un class Model eso tiene un __construct($id) método que consulta la base de datos para cargar todos los datos necesarios y almacenarlos dentro de propiedades privadas/publicadas/protegidas (lo que sea que te haga sentir bien).

Entonces llamas a estos getXYZ() métodos en ese modelo que solo devuelve sus valores de propiedad ...

Me gusta:

artículo de clase {private $título; $descripción privada; privado $algoMás;

    public function __construct($id) {
        $query = "SELECT title, description, somethingElse FROM table WHERE id = $id";
        $result = $db->query($query);

        $row = $result->fetch_array(MYSQLI_ASSOC);
        $this->title = $row['title'];
        $this->description = $row['description'];
        $this->somethingElse = $row['somethingElse'];
    }

    public function getTitle() {
        return $this->title;
    }

    public function getDescription() {
        return $this->description;
    }

    public function getSomethingElse() {
        return $this->somethingElse;
    }

Eso es todo... Solo una consulta para recuperar todos los datos...

En caso de que desee editar también este modelo, puede crear también un setXYZ($value) métodos que establecerán $this->XYZ = $value; y save() método que actualizará esta fila muy concreta en la base de datos...

Estos métodos (get y set) se llaman getters y setters...

Respondido el 12 de junio de 12 a las 16:06

¿No es una mala práctica en sí misma seleccionar todas las columnas en lugar de solo las que necesita? - Alex l

@AlexL Sí, lo es, solo estaba demostrando los métodos getter, no la consulta en sí ... Pero lo cambiaré :-) - sombreado

Esto funciono perfecto gracias. Votaría a favor, pero mi pregunta ha sido rechazada. Si gano la reputación, volveré y lo votaré. - Alex l

¿Qué tiene Votar por una respuesta con Votar por su pregunta? - deshecho

Mi representante estaba por debajo de 15 en ese momento porque mi pregunta fue rechazada. Por lo tanto, no tuve suficiente representante para votar. De todos modos, como lo hago ahora, he votado tu respuesta. Gracias de nuevo. - Alex l

Creo que es mejor ejecutar la consulta una vez... Así que busca todos los detalles de lo que quieras y úsalo cuando quieras.

 function getDetails($id){
     $query = "SELECT title,description FROM table WHERE id = $id";
     $result = $db->query($query);

     return $result->fetch_array(MYSQLI_ASSOC);

 }

Y puedes usar como

 <?php  $details = $job->getDetails($id); ?>
 <h1><?php echo $details['title']; ?></h1>
 <p><?php echo $details['description']; ?></p>

no se mas de esto....

Respondido el 12 de junio de 12 a las 11:06

Cree un getter y setter para cada propiedad, ejecute 1 consulta, configure todas las variables y use los captadores para obtener el valor real.

Algo como esto debería funcionar:

    private $name;
    private $street;
    private $number;

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setNumber($number)
    {
        $this->number = $number;
    }

    public function getNumber()
    {
        return $this->number;
    }

    public function setStreet($street)
    {
        $this->street = $street;
    }

    public function getStreet()
    {
        return $this->street;
    }


    public function getUser()
    {
        $query = "SELECT * FROM users WHERE x = y";

        $this->setName($result['name']);
        $this->setStreet($result['street']);
        $this->setName($result['number']);

    }

Respondido el 12 de junio de 12 a las 11:06

No me ahorra escribir nada. Si usa un IDE decente, casi no funciona. Genero todos los getters y setters en 10 segundos. Los getters y setters mágicos nunca brindan una buena representación del objeto con el que está tratando y le impiden escribir código específico de propiedad. - Sherlock

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.