Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PDO Mostrar Categorias Subcategorias Contenido

Estas en el tema de PDO Mostrar Categorias Subcategorias Contenido en el foro de PHP en Foros del Web. Hola a todos, tengo una idea clara de como quiero hacer funcionar el código: tengo una tabla de categorias de esta manera: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código ...
  #1 (permalink)  
Antiguo 04/04/2018, 06:14
 
Fecha de Ingreso: mayo-2011
Ubicación: Palma de Mallorca
Mensajes: 108
Antigüedad: 7 años, 1 mes
Puntos: 4
PDO Mostrar Categorias Subcategorias Contenido

Hola a todos,

tengo una idea clara de como quiero hacer funcionar el código:

tengo una tabla de categorias de esta manera:

Código MySQL:
Ver original
  1. ctg_id ctg_parent ctg_nom  ctg_titol
  2. 1      0          Info  Info
  3. ...
  4. 7      1          Primeros Pasos  Nuestros primeros pasos
  5. 8      1          Desarrollo    Avanzando con paso firme
  6. ..

y una tabla contenido que tiene una FK a categorias, para determinar en que categoria va el contenido.

La prueba que quiero hacer es en una página, mostrar en bucle la categoria madre, sus subcategorias y dentro de las mismas, el contenido asociado.

Tengo un código PDO para la consulta a las categorías madre:

Código PHP:
Ver original
  1. $connect = connectDB($dbconfig);
  2.     // preparar sentencia sql a ejecutar.
  3.     $sql = "SELECT ctg_id, ctg_titol FROM categories WHERE ctg_parent = 0";
  4.     $stmt = $connect->prepare($sql);
  5.     // ejecutar sentencia
  6.     $stmt->execute();
  7.     // guardamos el resultado como un array
  8.     $categories = $stmt->fetchAll(PDO::FETCH_ASSOC);

Claro, lo que yo entiendo, y como he empezado es recorrer el array y mostrar el titulo de la categoria

Código PHP:
Ver original
  1. <?php
  2.     foreach ($categories as $categoria) {
  3.         echo "<h2>".$categoria['ctg_titol']."<h2>";
  4. }
  5. ?>

y luego dentro del foreach, añadir otra consulta para las subcategorias con el id de ese momento

Código PHP:
Ver original
  1. <?php
  2.     foreach ($categories as $categoria) {
  3.         echo "<h2>".$categoria['ctg_titol']."<h2>";
  4.         $sql = "SELECT ctg_id, ctg_titol FROM categories WHERE ctg_parent = ?"
  5.         $stmt->execute($categoria['ctg_id']);
  6.     }  
  7. ?>

Pero leyendo un poco por los posts, al hacer estas llamadas en bucle puede saturar el servidor, así que estoy bastante confundido de como replantear esto, si voy bien así o debo cambiar el planteamiento de las consultas.

Gracias por vuestra atención.

Un saludo.
  #2 (permalink)  
Antiguo 04/04/2018, 07:00
Avatar de baldaweb  
Fecha de Ingreso: septiembre-2010
Ubicación: Barco pirata
Mensajes: 220
Antigüedad: 7 años, 9 meses
Puntos: 16
Respuesta: PDO Mostrar Categorias Subcategorias Contenido

Mira a ver si haciendo la consulta de las 3 tablas y agrupando por categorias y subcategorias sale lo que quieres, asi te evitas los 3 bucles.
__________________
CHOOO COOO LAAA TEEEEEEEEE
  #3 (permalink)  
Antiguo 04/04/2018, 09:00
 
Fecha de Ingreso: noviembre-2015
Mensajes: 228
Antigüedad: 2 años, 8 meses
Puntos: 83
Respuesta: PDO Mostrar Categorias Subcategorias Contenido

Prueba con JOIN http://www.dofactory.com/sql/join
  #4 (permalink)  
Antiguo 06/04/2018, 01:53
 
Fecha de Ingreso: mayo-2011
Ubicación: Palma de Mallorca
Mensajes: 108
Antigüedad: 7 años, 1 mes
Puntos: 4
Respuesta: PDO Mostrar Categorias Subcategorias Contenido

Buenas a los 2,

como bien habéis dicho, con un JOIN de las 3 tablas se consigue lo que quería en una consulta y sin hacer bucles de SELECT, con lo cual, saturaría el servidor.

Pongo el ejemplo de la query por si a alguien le sirve:

Código MySQL:
Ver original
  1. SELECT ctg1.ctg_titol AS "Titulo Categoria", ctg2.ctg_titol AS "Titulo Subcategoria", cntnd_text AS "Contenido"
  2. FROM categorias ctg1 INNER JOIN (categorias ctg2 INNER JOIN contenidos USING (ctg_id))
  3. ON ctg1.ctg_id = ctg2.ctg_parent

Con esta query, si queremos dividir las categorías de manera que cada una de ellas se imprima en una página, solo tenemos que aplicar un WHERE con la id de la categoría en cuestión.

Ahora me queda hacer la impresión por pantalla de la manera que quiero. Cuando lo consiga, daré por solucionado el tema.

Un saludo.

Edito: Al querer imprimir con un foreach de prueba
Código PHP:
Ver original
  1. <?php
  2.     foreach ($categories as $categoria) {
  3.         echo "<h2>".$categoria['Titulo Categoria']."</h2>";
  4.         echo "<h4>". $categoria['Titulo Subcategoria'] . "</h4>";
  5.         echo "<p>" . $categoria ['Contenido'] . "</p>";
  6.     }
  7. ?>

me imprime de la siguiente manera que se ve en la imagen:
https://ibb.co/cuoJZx

cuando lo que yo necesito es que se vea así:
https://ibb.co/hH2qgc

¿Es un solo foreach, varios? ¿Como hago para que no se repita el mismo título cuando ya lo tengo una vez?

Un saludo.

Última edición por tonigomila1988; 06/04/2018 a las 04:15 Razón: Añadir duda
  #5 (permalink)  
Antiguo 06/04/2018, 12:14
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.796
Antigüedad: 8 años, 10 meses
Puntos: 213
Respuesta: PDO Mostrar Categorias Subcategorias Contenido

Saludo

Pues lo que podrías hacer es manejar 4 variables,
dos number y dos string.

(Digamos que podrían ser i, j, titleCategory y titleSubcategory)

Las dos numéricas arrancarán con valor 0 y las cadenas en vacío.
(Todo esto antes del foreach)

Luego, al principio del foreach iría una primera condicional
donde se pregunte si titleCategory es diferente a la posición del array
que contiene el título de la categoría, y si es así, que asigne cero a i

Después, una segunda condicional donde se pregunte si titleSubcategory
es diferente a la posición del array que contiene el título de la subcategoría,
y si es así, que asigne cero a j

Después, una tercera condición donde pregunte si i es 0,
y cuando esto se cumpla ocurran tres cosas:

1. Asigne a titleCategory el valor de la posición
del array que tiene el título de la categoría

2. Haga el echo del título de la categoría

3. Incremente i en uno

Viene una cuarta condición, que es igual a la tercera, solo que ahora
las variables involucradas son j y titleSubcategory

Y voilà, con esto ya se ajusta el tema al formato de salida que se quiere
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #6 (permalink)  
Antiguo 07/04/2018, 04:51
 
Fecha de Ingreso: noviembre-2015
Mensajes: 228
Antigüedad: 2 años, 8 meses
Puntos: 83
Respuesta: PDO Mostrar Categorias Subcategorias Contenido

Como te comentan puedes usar condicionales y la función strcomp()

Código PHP:
Ver original
  1. $v1="";
  2. $v2="";
  3. foreach ($categories as $categoria) {
  4. if(srtcomp($v1, $categoria['Titulo Categoria']) !== 0) {
  5.         echo "<h2>".$categoria['Titulo Categoria']."</h2>";
  6. $v1 = $categoria['Titulo Categoria'];
  7. }
  8. if(srtcomp($v2, $categoria['Titulo Subcategoria']) !== 0) {
  9.         echo "<h4>". $categoria['Titulo Subcategoria'] . "</h4>";
  10. $v2 = $categoria['Titulo Subcategoria'];
  11. }
  12.         echo "<p>" . $categoria ['Contenido'] . "</p>";
  13.     }
  #7 (permalink)  
Antiguo 10/04/2018, 08:02
 
Fecha de Ingreso: mayo-2011
Ubicación: Palma de Mallorca
Mensajes: 108
Antigüedad: 7 años, 1 mes
Puntos: 4
Respuesta: PDO Mostrar Categorias Subcategorias Contenido

Hola de nuevo y gracias a los 2,

Funciona perfectamente y con una cosa tan sencilla con un par de if. No lo había tenido en cuenta por el tema de ir haciendo estas comprobaciones en el foreach, pero supongo que es mucho mejor hacer los if que no hacer x consultas a la BBDD.

De nuevo, muchas gracias.



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