PHP - Ayuda con mostrar productos dinamicamente con POO

 
Vista:
sin imagen de perfil

Ayuda con mostrar productos dinamicamente con POO

Publicado por Armando (5 intervenciones) el 23/12/2015 22:33:40
Buenas, Este es mi primer comentario en esta Comunidad y es que llevo algunos días intentando resolver este problema que tengo, el cual es el siguiente:

Tengo un código que hice previamente de forma estructurada y me funciona perfectamente, pero ahora estoy aprendiendo la programación orientada a objeto, la cual es algo mas compleja y no consigo mostrar los productos con sus imágenes correspondientes ni países de origen.

Codigo que me funciona de forma estructurada:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Practica de ver productos</title>
</head>
 
<body>
<section class="cuerpo">
    <h2>Productos</h2><br>
        <?php
	$conexion = mysqli_connect("localhost","armando","armando","practicas");
	mysqli_set_charset($conexion, "utf8");
	$peticion = "SELECT	* FROM productos";
	$resultado = mysqli_query($conexion, $peticion);
	while($fila = mysqli_fetch_array($resultado)){
		echo "<article>";
		echo "<div class='anuncio'>";
		$peticion2 = "SELECT * FROM imagenesproductos WHERE idproducto = ".$fila['id']." LIMIT 1";
		$resultado2 = mysqli_query($conexion, $peticion2);
		while($fila2 = mysqli_fetch_array($resultado2)) {
		echo "<img  src='media/imagenes/anuncios/productos/".$fila2['imagen']."' class='imagenanuncio' alt='".$fila2['titulo']."'>";
		}
			$peticion3 = "SELECT * FROM paises WHERE id = ".$fila['idpais']." LIMIT 1";
			$resultado3 = mysqli_query($conexion, $peticion3);
			while($fila3 = mysqli_fetch_array($resultado3)) {
			echo "<img  src='media/imagenes/banderas/".$fila3['bandera']."' class='banderas' title='".$fila3['nombre']."' alt='".$fila3['nombre']."'>";
			}
		echo "<a href='html/anuncios/productos.php?id=".$fila['id']."'><h3>".$fila['nombre']."</h3></a>";
		//echo "<p>".$fila['descripcion']."</p>";'
		//echo "<p>".$fila['precio']." €</p>";
		//echo "<input type='number' value='1' max='5' min='1' id='num".$fila['id']."'>";
 
		//echo "</br>";
		//echo "<a href='producto.php?id=".$fila['id']."'><button>Mas informacion</button></a>";
		//echo "<button value='".$fila['id']."' class='botoncompra'>Comprar ahorra</button>";
		echo "</div>";
		echo "</article>";
	}
	mysqli_close($conexion);
?>
</body>
</html>

y ahora lo que estoy intentado es hacer lo mismo pero orientado a objetos. Lo mejor que he a salido es haciéndolo de esta forma

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
class ObtenerAnuncios{
	private $anuncios;
 
 
public function ObtenerAnuncios(){
 
		$consulta = "Select productos.id AS id,
		productos.nombre AS nombreproducto,
		productos.precio AS precio, 
		productos.idpais AS paisproducto,
		imagenesproductos.idproducto AS idproductoimagen,
		imagenesproductos.titulo AS tituloimagen, 
		imagenesproductos.imagen AS imagenproducto,
		paises.id AS iddelpais,
		paises.nombre AS paisnombre,
		paises.bandera AS imagenbandera
		FROM
		productos, imagenesproductos, paises
		WHERE
		productos.id = imagenesproductos.idproducto
		AND
		productos.idpais = paises.id";
 
		$valores = null;
 
		$oConectar = new conectorDB;
		$this->anuncios = $oConectar->consultarBD($consulta,$valores);
 
		return $this->anuncios;
		}
}
		?>

De esta forma los productos se me repiten tantas veces como imágenes tenga y no logro limitarlo a una sola imagen para que no se repita el producto.

Aqui esta la imagenes de la estructura de la base de datos:

tabla_productos
tabla_imagenesproductos
tabla_paises
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Ayuda con mostrar productos dinamicamente con POO

Publicado por xve (6935 intervenciones) el 24/12/2015 11:25:24
Hola Armando, entiendo que el problema no esta el pasar tu código a POO, sino mas bien en la consulta SQL, no?

Creo que lo estas haciendo mal, ya que no vinculas las tablas, sino que las juntas, por eso te aparecen tantas veces...

Tienes que utilizar JOIN en tu consulta... algo así:
1
2
3
4
5
6
7
8
9
10
11
12
$consulta = "Select productos.id AS id,
	productos.nombre AS nombreproducto,
	productos.precio AS precio, 
	productos.idpais AS paisproducto,
	imagenesproductos.idproducto AS idproductoimagen,
	imagenesproductos.titulo AS tituloimagen, 
	imagenesproductos.imagen AS imagenproducto,
	paises.id AS iddelpais,
	paises.nombre AS paisnombre,
	paises.bandera AS imagenbandera
FROM productos LEFT JOIN imagenesproductos ON productos.id = imagenesproductos.idproducto
WHERE productos.idpais = paises.id";

comentanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Dorean

Ayuda con mostrar productos dinamicamente con POO

Publicado por Dorean (1 intervención) el 24/12/2015 14:05:20
Como dice xve, para que la el resultado dependa de los productos que tienes en la bd, yo traería la imagen y país con un left join, muy parecido a lo que dice xve, pero agregue la relación con el país y cambie un poco el select

1
2
3
4
5
6
7
8
9
10
11
12
13
Select pro.id AS id,
	pro.nombre AS nombreproducto,
	pro.precio AS precio,
	pro.idpais AS paisproducto,
	ima.idproducto AS idproductoimagen,
	ima.titulo AS tituloimagen,
	ima.imagen AS imagenproducto,
	pai.id AS iddelpais,
	pai.nombre AS paisnombre,
	pai.bandera AS imagenbandera
FROM productos pro
LEFT JOIN imagenesproductos ima ON productos.id = imagenesproductos.idproducto
LEFT JOIN paises pai ON pro.idpais = pai.id
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ayuda con mostrar productos dinamicamente con POO

Publicado por Armando (5 intervenciones) el 24/12/2015 14:59:11
Buenas gracias por ayudarme. Los select que me indicaron funcionan perfectamente lo que no logra es hacer es lo que realmente quería, que es que solo me salga un producto aunque tenga 10 imágenes, de esta manera si tuviera 10 imágenes me saldrían el mismo producto 10 veces


resultado_select

lo que intento lograr es que solo me seleccione la primara imagen que hubiera en la tabla de imágenes y así no se me repetirán los productos.

No se si me he explicado bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda con mostrar productos dinamicamente con POO

Publicado por Armando (5 intervenciones) el 24/12/2015 17:40:56
Hola de nuevo, creo que ya di con la solución, bueno por ahora me funciona.

Con las consulta de Dorean conseguía esto

resultado_select

y para que los productos no se repitieran tenia que agruparlos por id_producto que es la clave en la tabla imagenesproductos.

1
2
3
4
5
6
7
8
9
10
11
12
13
Select pro.id AS id,
	pro.nombre AS nombreproducto,
	pro.precio AS precio,
	pro.idpais AS paisproducto,
	ima.id_producto AS idproductoimagen,
	ima.titulo AS tituloimagen,
	ima.imagen AS imagenproducto,
	pai.id AS iddelpais,
	pai.nombre AS paisnombre,
	pai.bandera AS imagenbandera
FROM productos pro
LEFT JOIN imagenesproductos ima ON pro.id = ima.id_producto
LEFT JOIN paises pai ON pro.idpais = pai.id GROUP by ima.id_producto

Quedando de esta manera los resultados:

resultado_agrupado

Bueno así es como lo he salvado, lo que no se si estará del todo bien porque después de ejecutar la consulta me salta una ventana con:
Error: no coinciden un <<token>>

Bueno muchas gracias por la ayuda y a seguir aprendiendo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar