¿Cómo hacer un filtro de productos en una web con PHP?

  • Autor Autor Die Katze
  • Fecha de inicio Fecha de inicio
D

Die Katze

Curioso
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Estoy haciendo un proyecto de tienda virtual con PHP y HTML en el que quiero poner un filtro con el que ordenar los productos en base al precio y al orden alfabético. Tengo el siguiente código (he quitado cosas que no interesan para lo que quiero hacer, como el menú o el footer):

HTML:
<div class="productos">
	<div class="filtro">
		Ordenar por:
		<form  method="post">
			<select name="ordenar">
				<option value="1">Orden alfabético (A-Z)</option>
				<option value="2">Orden alfabético inverso</option>
				<option value="3">Precio más bajo a más alto</option>
				<option value="4">Precio más alto a más bajo</option>					
			</select> 
			<button type="submit">Aplicar</button>
		</form>
	</div>
 
	<div class="mostrar_productos>
		<?php 
			$conexion = mysqli_connect($servidor, $usuario_BD, $contrasena_BD, $basedatos);
			mysqli_set_charset($conexion, "utf8");

			$peticion = "SELECT * FROM producto WHERE categoria = 'cuerda'";
			$resultado = mysqli_query($conexion, $peticion);

			while ($fila = mysqli_fetch_array($resultado)) {
				echo "<div class='col-md-3 producto_individual'>";
				$peticion2 = "SELECT * FROM producto WHERE id_producto = " .$fila["id_producto"] . " ";
				$resultado2 = mysqli_query($conexion, $peticion2);

				echo "<h2>" . $fila['nombre_producto'] . "</h2>";
				echo "<img src='imagenes/" .$fila["imagen"] . "' width = 100px>";
				echo "<p>" . $fila['descripcion_corta'] . "</p>";
				echo "<p>Precio: " . $fila['precio'] . " €</p>";
				echo "<a class='btn btn-danger' href='producto_individual.php?id_producto=" .$fila["id_producto"]. "'><strong>Ver más</strong></a></p></div>";
						
			}

			mysqli_close($conexion);
	        ?>	       		
        </div>
</div>

Entonces, mi pregunta es cuál es el código PHP que tengo que usar para que al seleccionar la opción que quiero en el select option me aplique las acciones que le indico. Sé que la consulta a la base de datos sería con "SELECT * FROM productos ORDER BY nombre_producto/precio ASC/DESC" con las diferentes opciones dentro de un switch, pero es que llevo unos días intentando hacerlo y tengo ya un bloqueo mental importante porque no sé cómo ponerlo para que me saque los productos tal y como los quiero. He hecho esto y lo he puesto al principio del todo fuera de las etiquetas html, pero no hace nada.

HTML:
<?php 
	if(isset($_POST['ordenar'])){
		switch($_POST['ordenar']){
			case "1":
				$consulta = "SELECT nombre_producto FROM producto ORDER BY ASC;";
				break;
			case "2":
				$consulta = "SELECT nombre_producto FROM producto ORDER BY DESC;";
				break;
			case "3":
				$consulta = "SELECT precio FROM producto ORDER BY ASC;";
				break;
			case "4":
				$consulta = "SELECT precio FROM producto ORDER BY DESC;";
				break;
			
			}
		}else{
		$consulta = "SELECT * FROM producto;";
	}
?>

Seguro que es una cosa tontísima, pero caigo en cómo ponerlo.
 
Prueba a usar esta consulta haber si es lo que buscas.

$ejemplo = "SELECT * FROM producto WHERE id_producto = '$fila[id_producto]' ORDER BY '$fila[precio]' DESC";

Cambia $ejemplo por la variable que estes usando.

Saludos
 
Si pongo eso me sale "Notice: Undefined variable: fila"

- - - Actualizado - - -

Prueba a usar esta consulta haber si es lo que buscas.

$ejemplo = "SELECT * FROM producto WHERE id_producto = '$fila[id_producto]' ORDER BY '$fila[precio]' DESC";

Cambia $ejemplo por la variable que estes usando.

Saludos

Si pongo eso me sale "Notice: Undefined variable: fila"
 
Especificame cuales son los nombres de los campos de la tabla que queres hacer la consulta.
 
Te esta pidiendo que definas la variable fila para poder usarla.
 
La forma en que lo planteas con el switch case está bien, lo que tienes que hacer es colocarle un action al formulario que recargue la página. Por cierto, te dejaste una comilla sin cerrar en el div de clase mostrar_producto.

Insertar CODE, HTML o PHP:
<div class="productos">
	<div class="filtro">
		Ordenar por:
		<form  action="PAGINA_ACTUAL.php" method="post">
			<select name="ordenar">
				<option value="1">Orden alfabético (A-Z)</option>
				<option value="2">Orden alfabético inverso</option>
				<option value="3">Precio más bajo a más alto</option>
				<option value="4">Precio más alto a más bajo</option>					
			</select> 
			<button type="submit">Aplicar</button>
		</form>
	</div>
 
	<div class="mostrar_productos">
		<?php 
			$conexion = mysqli_connect($servidor, $usuario_BD, $contrasena_BD, $basedatos);
			mysqli_set_charset($conexion, "utf8");
			if(isset($_POST['ordenar'])){
				switch($_POST['ordenar']){
				case "1":
					$consulta = "SELECT nombre_producto FROM producto ORDER BY ASC;";
					break;
				case "2":
					$consulta = "SELECT nombre_producto FROM producto ORDER BY DESC;";
					break;
				case "3":
					$consulta = "SELECT precio FROM producto ORDER BY ASC;";
					break;
				case "4":
					$consulta = "SELECT precio FROM producto ORDER BY DESC;";
					break;
				
				}
				} else {
					$consulta = "SELECT * FROM producto;";
				}

			$resultado = mysqli_query($conexion, $consulta);

			while ($fila = mysqli_fetch_array($resultado)) {
				echo "<div class='col-md-3 producto_individual'>";
				echo "<h2>" . $fila['nombre_producto'] . "</h2>";
				echo "<img src='imagenes/" .$fila["imagen"] . "' width = 100px>";
				echo "<p>" . $fila['descripcion_corta'] . "</p>";
				echo "<p>Precio: " . $fila['precio'] . " €</p>";
				echo "<a class='btn btn-danger' href='producto_individual.php?id_producto=" .$fila["id_producto"]. "'><strong>Ver más</strong></a></p></div>";
						
			}

			mysqli_close($conexion);
	        ?>	       		
        </div>
</div>

prueba el código así y si tienes errores muéstralos completos para poder ayudarte.
 
Atrás
Arriba