Foros del Web » Programando para Internet » PHP »

Ordenar productos por categoría (MySql+php)

Estas en el tema de Ordenar productos por categoría (MySql+php) en el foro de PHP en Foros del Web. Estimados amigos, Siguiendo con la creación de mi catálogo web, me pregunto si alguien sabe cómo seleccionar productos según su categoría. Mi base de datos ...
  #1 (permalink)  
Antiguo 10/06/2013, 21:22
 
Fecha de Ingreso: junio-2013
Ubicación: Santiago
Mensajes: 10
Antigüedad: 10 años, 10 meses
Puntos: 0
Pregunta Ordenar productos por categoría (MySql+php)

Estimados amigos,

Siguiendo con la creación de mi catálogo web, me pregunto si alguien sabe cómo seleccionar productos según su categoría.

Mi base de datos es la siguiente:

Código:
CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL,
  `title` varchar(30) NOT NULL,
  `desc` text NOT NULL,
  `img` varchar(20) NOT NULL,
  `img2` varchar(20) NOT NULL,
  `price` decimal(11,3) NOT NULL,
  `price_old` decimal(11,3) NOT NULL,
  `material` varchar(20) NOT NULL,
  `size` varchar(20) NOT NULL,
  `category` varchar(20) NOT NULL,
  `item_sku` varchar(255) NOT NULL,
  `time` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
A cada producto le otorgo una categoría y la idea es que a través de un menú list linkeable (<a>) yo pueda seleccionar todos los productos existentes en su categoría.

Esto parece ser muy simple a primera vista, pero la verdad es que no sé cómo hacerlo.

Agradecido desde ya.

Selim
  #2 (permalink)  
Antiguo 10/06/2013, 21:32
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ordenar productos por categoría (MySql+php)

Asumiendo dentro de $cat tengas la categoria

Cita:
SELECT * FROM products where category='$cat'
__________________
Salu2!
  #3 (permalink)  
Antiguo 10/06/2013, 21:33
 
Fecha de Ingreso: febrero-2013
Mensajes: 163
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Ordenar productos por categoría (MySql+php)

SELECT * FROM products WHERE category

Lo del enlace lo unico que se me ocurre es: al hacer click en el enlace, enviar un formulario con ajax y actualizar una parte de tu web con el resultado.
  #4 (permalink)  
Antiguo 10/06/2013, 21:34
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ordenar productos por categoría (MySql+php)

Cita:
SELECT * FROM products where category='$cat'

Claro que tu puedes hacer la conexion a tu DB mediante funciones simples como mysql_connect() y luego usar mysql_fetch_row() y asi pero esa forma ya no se usa mas y deberias tratar de usar la clase PDO o sino usar algun framework que te facilite el SQL y te ordene el codigo de paso
__________________
Salu2!
  #5 (permalink)  
Antiguo 10/06/2013, 21:47
 
Fecha de Ingreso: junio-2013
Ubicación: Santiago
Mensajes: 10
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Ordenar productos por categoría (MySql+php)

Muchas gracias por sus respuestas.

Teniendo en cuenta que no soy muy bueno en php y MySql, ¿cómo y dónde mostraría los productos por categoría y cuál sería la url para tal efecto?

Italico76, me podrías dar un ejemplo de cómo sería?

Gracias
  #6 (permalink)  
Antiguo 10/06/2013, 23:11
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ordenar productos por categoría (MySql+php)

Cita:
Iniciado por joomscl Ver Mensaje
Muchas gracias por sus respuestas.

Teniendo en cuenta que no soy muy bueno en php y MySql, ¿cómo y dónde mostraría los productos por categoría y cuál sería la url para tal efecto?

Italico76, me podrías dar un ejemplo de cómo sería?
Ya que me preguntas......... deberias mostrar o visualizar los datos en un archivo y tener tu logica en otro. Las consultas idealmente estarian en otro archivo. A esto se llama MVC o Modelo-Vista-Controlador

Código PHP:
<?php
  
/**
   * Controlador (index.php)
   * 
   */
  
  // incluyo el Modelo
  
require_once 'model.php';

  
// conecto a la DB
  
conectar('test');
  
  
// traigo algo del modelo
  
$categorias getAll();  

  
// lo represento en la vista
  
include "vista.php";
Código PHP:
<?php
/**
 * Modelo: modelo.php
 *  
 */

define ('db_user','root');
define ('db_pass','');
define ('db_name','mi_db');

// no deberias usar idealmente variable global, sino hacer todo esto como una clase 
$db null;

   function 
conectar($dbname=db_name,$user=db_pass,$pass=db_pass)
   {    
       global 
$db;
       try 
       {
            
$db = new PDO("mysql:host=localhost;dbname=$dbname;charset=utf8",$user$pass);    
       }
       catch(
PDOException $ex)
       {
        echo 
"Algo salio mal con la conexion : ".$ex->getMessage();       
       }
    
    return 
$db;    
  }

function 
getAll() {
    global 
$db;
    
$sql "SELECT * FROM products WHERE 1";
    return 
$db->query($sql);
}

function 
getCategory($cat) {
    global 
$db;
    
$sql "SELECT * FROM products WHERE category='$cat'";
    return 
$db->query($sql);
}
?>
Código PHP:
<html><!-- Vista -->
    <head>
       <title>$titulo</title>
    </head>
    <body>
        <ul>
            <?php foreach ($categorias as $cat): ?>
                <li><?php echo $cat['title']; ?></li>
            <?php endforeach; ?>     
        </ul>     
    </body>
</html>

ACLARACIONES:

En el modelo colocas toda la logica que te trae y lleva cosas a la DB (te defini dos funciones de traida de datos solamente y te falta investigar como hacer inserciones, editar, borrar)

En la vista va todo lo que es HTML

Tu tabla tiene un problema y es que el ID debe ser AUTOINCREMENTAL y tu CLAVE PRIMARIA o PRIMARY KEY

Logicamente el INDEX.php deberia ser mas parecido a un 'Front controller' el cual recibe los parametros de $_GET por ejemplo y en base a eso decide que controlador cargar. En este caso se hizo con un solo controlador.


Si quieres limitar el problema de variable global $db, puedes hacerlo tambien usando namespace:

Código PHP:
<?php
/**
 * Modelo: modelo.php
 *  
 */
namespace MVCmodel;

define ('db_user','root');
define ('db_pass','');
define ('db_name','mi_db');

// no deberias usar idealmente variable global, sino hacer todo esto como una clase 
$db null;

   function 
conectar($dbname=db_name,$user=db_pass,$pass=db_pass)
   {    
       global 
$db;
       try 
       {
            
$db = new PDO("mysql:host=localhost;dbname=$dbname;charset=utf8",$user$pass);    
       }
       catch(
PDOException $ex)
       {
        echo 
"Algo salio mal con la conexion : ".$ex->getMessage();       
       }
    
    return 
$db;    
  }

function 
getAll() {
    global 
$db;
    
$sql "SELECT * FROM products WHERE 1";
    return 
$db->query($sql);
}

function 
getCategory($cat) {
    global 
$db;
    
$sql "SELECT * FROM products WHERE category='$cat'";
    return 
$db->query($sql);
}
?>
Código PHP:
<?php
  
/**
   * Controlador (index.php)
   * 
   */

  
namespace MVCcontroller;
  
  
// incluyo el Modelo
  
require_once 'model.php';

  
// conecto a la DB  
  
MVCmodelconectar('test');
  
  
// traigo algo del modelo
  
$categorias MVCmodel    getAll();  

  
// lo represento en la vista
  
include "vista.php";
__________________
Salu2!

Última edición por Italico76; 11/06/2013 a las 00:48
  #7 (permalink)  
Antiguo 11/06/2013, 09:44
 
Fecha de Ingreso: junio-2013
Ubicación: Santiago
Mensajes: 10
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Ordenar productos por categoría (MySql+php)

Muchas gracias amigo por tan dedicadas respuestas, pero la verdad es que no me resulta.
Al abrir el archivo index.php en el browser me aparece lo siguiente:

Código HTML:
Algo salio mal con la conexion : SQLSTATE[42000] [1044] Access denied for user ''@'localhost' to database 'joomscl'
Fatal error: Call to a member function query() on a non-object in Z:\home\joomscl\www\products\modelo.php on line 32
Luego al abrir el archivo vista.php me aparece el siguiente error:

Código HTML:
Warning: Invalid argument supplied for foreach() in Z:\home\joomscl\www\products\vista.php on line 7
Alguna idea?]

Saludos
  #8 (permalink)  
Antiguo 11/06/2013, 09:49
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ordenar productos por categoría (MySql+php)

Claro, es que debes configurar los parametros para la conexion a la base de datos en el archivo modelo.php

Cita:
define ('db_user','root');
define ('db_pass','');
define ('db_name','mi_db');
Ahi coloque valores cualquiera,... usuario 'root', pass lo deje vacio y como nombre de la DB le puse que 'mi_db' pero esos valores los debes poner correctamente


Luego que te funcione no te emociones mucho porque es un mero ejemplo y esta lejos de ser algo que deba usarse tal cual
__________________
Salu2!
  #9 (permalink)  
Antiguo 11/06/2013, 10:19
 
Fecha de Ingreso: junio-2013
Ubicación: Santiago
Mensajes: 10
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Ordenar productos por categoría (MySql+php)

Gracias Italico76, sí, lo había modificado, al igual que en el archivo index.php cambié model.php por modelo.php, pero no resulta.

Código HTML:
define ('db_user','root');
define ('db_pass','');
define ('db_name','joomscl');
También en index.php escribí la bd

Código HTML:
// conecto a la DB
  conectar('joomscl');
  #10 (permalink)  
Antiguo 11/06/2013, 10:31
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ordenar productos por categoría (MySql+php)

Pues tienes algo mal... por ejemplo... ese USUARIO 'root' o no existe o su password esta mal o bien no tiene FULL ACCESS o no tiene acceso a esa DB

Normalmente que parametros colocas para conectar ? usa los mismos!!! --es un problema de 'privilegios'--


Probe ese codigo y a mi SI me funciona
__________________
Salu2!
  #11 (permalink)  
Antiguo 11/06/2013, 11:08
 
Fecha de Ingreso: junio-2013
Ubicación: Santiago
Mensajes: 10
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Ordenar productos por categoría (MySql+php)

mmm, estoy trabajando en un servidor local por lo general estos son los datos de conexión:

Cita:
<?php
mysql_pconnect("localhost","root","");
mysql_select_db("joomscl");
?>
Quizás en otro lado estoy mal :(
  #12 (permalink)  
Antiguo 12/06/2013, 08:55
 
Fecha de Ingreso: junio-2013
Ubicación: Santiago
Mensajes: 10
Antigüedad: 10 años, 10 meses
Puntos: 0
Pregunta Respuesta: Ordenar productos por categoría (MySql+php)

Quizás este método no es la solución a mi problema. Quizás alguien sabe cómo realizar la idea de una mejor manera, Aquí explíco nuevamente mi solicitud, pero con más detalles:

Estoy creando un catálogo web, el cual por ahora consta de los siguientes archivos y códigos:

index.php - Este archivo muestra los productos en un Grid de miniaturas

Código PHP:
<?php
   session_start
();
   include(
"connect.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="generator" content="Notepad++" />
    <title>Inicio</title>
</head>
<body>

<?php
    $sql 
mysql_query("SELECT * FROM `products`") or die(mysql_error());
    
    if ( 
mysql_num_rows($sql) == ) {
      echo 
"<h6>Pronto estará la sección disponible con todos nuestros productos.</h6>";
    } else {
      
$sql mysql_query ("SELECT * FROM `products` ORDER BY `time` ASC") or die(mysql_error());
      
      while ( 
$row mysql_fetch_assoc($sql) ) {

        echo 
"<a href=\"view.php?id=".$row['id']."\"><img src='items/"$row['img']."' border='0' alt='' /></a>";

        echo 
"<div><a href=\"view.php?id=".$row['id']."\">".$row['title']."</a></div>";
        
        echo 
$row['price_old'];
        
        echo 
$row['price'];
        
        echo 
$row['desc'];
      
      }
    }
?> 

</body>
</html>
Luego tengo el archivo view.php - Éste muestra el detalle de los productos en una página nueva y es llamado a través del link: <a href=\"view.php?id=".$row['id']."\">".$row['title']."</a>

Código PHP:
<?php
  $id 
mysql_escape_string($_GET['id']);
  include(
"connect.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="generator" content="Notepad++" />
    <title>Detalle de Producto</title>
</head>
<body>

<?php

  $sql 
mysql_query("SELECT * FROM `products` WHERE id = $id") or die(mysql_error());
  
  if ( 
mysql_num_rows($sql) == ) {
      echo 
"<h6>El producto que busca no existe.</h6>";
    } else {
  
$sql mysql_query ("SELECT * FROM `products` WHERE id = $id") or die(mysql_error());
      
  while ( 
$row mysql_fetch_assoc($sql) ) {
        
        echo 
"<div class='slide'><img src='items/"$row['img']."' width='550' height='500' alt='' /></div>";
        
        echo 
$row['title'];
        
        echo 
$row['price'];
        
        echo 
$row['price_old'];
        
        echo 
$row['desc'];
        
        echo 
"Material: "$row['material']."<br />";
        
        echo 
"Tamaño: "$row['size']."<br />";
        
        echo 
"SKU: "$row['item_sku']."";
        
      }
    }
?>
</body>
</html>

connect.php - conexión con base de datos

Código PHP:
<?php   
   mysql_pconnect
("localhost","root","");
   
mysql_select_db("joomscl");
?>

BD
Código:
-- Table structure for table `products`
--

CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(30) NOT NULL,
  `desc` text NOT NULL,
  `img` varchar(20) NOT NULL,
  `img2` varchar(20) NOT NULL,
  `price` decimal(11,3) NOT NULL,
  `price_old` decimal(11,3) NOT NULL,
  `material` varchar(20) NOT NULL,
  `size` varchar(20) NOT NULL,
  `category` varchar(20) NOT NULL,
  `item_sku` varchar(255) NOT NULL,
  `time` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- Dumping data for table `products`
Hasta aquí, todo funciona a la perfección.

Bueno, luego de esta detallada información, en donde tengo un catálogo, el cual me permite ver una lista de productos y al hacer clic en ellos, puedo ver cada uno de ellos en una página nueva, me pregunto: ¿Qué debo hacer para crear un menú lateral linkeable con los nombres de cada una de las categorías que voy incluyendo manualmente en la BD mysql (campo category)?

Espero por favor que alguien me pueda ayudar.
Como es un desafío personal y no comercial, no puedo ofrecer dinero :(

Gracias
  #13 (permalink)  
Antiguo 12/06/2013, 10:00
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ordenar productos por categoría (MySql+php)

Recuerda que todo lo que sea consultas y trabajos con registros o sea BASE DE DATOS va en el archivo del modelo o sea tu "connect.php"

En 'archivo view.php' no deberias hacer eso

Luego conectas a tus funciones para manejo de DB desde tu controller y dejas esa informacion disponible para las vistas asi:

Código PHP:
<?php
// en el Modelo !!
function getProductosPorId($id){

 
$q mysql_query("SELECT * FROM `products` WHERE id = $id") or die(mysql_error()); 
   
  if ( 
mysql_num_rows($q) == )      return false// o devuelves cero
         
  
return $rows mysql_fetch_assoc($q);
}
// en el controlador (o en tu index)
Código PHP:
$rows getProductosPorId($id); 
// en tu Vista
Código PHP:
if (!$rows)
     echo 
"<h6>El producto que busca no existe.</h6>";         

foreach (
$rows as $row){
         
        echo 
"<div class='slide'><img src='items/"$row['img']."' width='550' height='500' alt='' /></div>"
         
        echo 
$row['title']; 
         
        echo 
$row['price']; 
         
        echo 
$row['price_old']; 
         
        echo 
$row['desc']; 
         
        echo 
"Material: "$row['material']."<br />"
         
        echo 
"Tamaño: "$row['size']."<br />"
         
        echo 
"SKU: "$row['item_sku'].""
         

__________________
Salu2!
  #14 (permalink)  
Antiguo 12/06/2013, 13:26
 
Fecha de Ingreso: junio-2013
Ubicación: Santiago
Mensajes: 10
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Ordenar productos por categoría (MySql+php)

No sé, quizás soy such a loser, pero no me resulta nada :(
  #15 (permalink)  
Antiguo 12/06/2013, 18:53
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ordenar productos por categoría (MySql+php)

Venis bien... si empezastes a separar las cosas....te falta seguir por ese camino

ABSTRAE... no te centres en cortar y pegar... puede que algo no funcione pero tu entiendes la idea y lo haces a tu manera ;)

Lee sobre MVC y fijate que en las Vistas casi no va PHP... solo algun IF, algun FOREACH y ya
__________________
Salu2!
  #16 (permalink)  
Antiguo 13/06/2013, 18:51
 
Fecha de Ingreso: junio-2013
Ubicación: Santiago
Mensajes: 10
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Ordenar productos por categoría (MySql+php)

Please help!!!
Al parecer estoy muy, pero muy cerca de lograr mi objetivo, pero al pinchar el nombre de la categoría en el menú, me muestra todas las categorías y no la deseada.

Aquí dejo el código, favor ayudar!!!!

Código PHP:
<?
// INDEX.PHP - ESTE CÓDIGO ME ENTREGA UN MENÚ LINKEABLE CON LA LISTA DE CATEGORÍAS EN LA BD SIN REPETIR
if(!isset($_POST['category']))
$sql "SELECT DISTINCT category FROM `products`";
$res mysql_query($sql);
while(
$row mysql_fetch_array($res)) {
$link="<li><a href=category.php?id=$row[category]>$row[category]</a></li>";
echo 
$link
;
}
?>
Código PHP:
<?php 
//CATEGORY.PHP - ESTE ES EL ARCHIVO QUE SE ABRE AL PINCHAR EL LINK DEL CÓDIGO ANTERIOR. EL PROBLEMA ES QUE ME MUESTRA TODAS LAS CATEGORÍAS Y NO LA SOLICITADA
   
$sql=mysql_query("SELECT * FROM products",$link);
        
$row=mysql_fetch_array($sql);

        do{
        
$category=$row['category'];
                     
        echo 
"<li>$category</li>";
        }
        while(
$row=mysql_fetch_array($sql));
?>
Por favor, algún gurú de la programación que me ayude. Yo sin saber de programación, pero muchas horas tratando de lograrlo, ya casi lo soluciono.

Gracias de antemano

Etiquetas: productos
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 20:21.