Foros del Web » Programando para Internet » PHP »

problemilla con mi tienda online

Estas en el tema de problemilla con mi tienda online en el foro de PHP en Foros del Web. aver os esplico webankenovi usuario de este foro y yo queremos que la tienda online que estoy asiendo me guarde los pedidos automaticamente en la ...
  #1 (permalink)  
Antiguo 14/11/2011, 04:48
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 59
Antigüedad: 20 años, 5 meses
Puntos: 0
problemilla con mi tienda online

aver os esplico

webankenovi usuario de este foro y yo
queremos que la tienda online que estoy asiendo me guarde los pedidos automaticamente en la base de datos.

Lo hemos conseguido, el problema es que los guara duplicado.
El codigo que hemos puesto pa que lo guarde automaticamente es este:

Código PHP:
<?php
 
/*seleccionamos bd*/
 
mysql_select_db ('nombre_bd') or die (mysql_error());
 if(isset(
$_SESSION['carrito'])){
 
$total=0; for($i=0;$i<=count($carrito_mio)-1;$i ++){
 if(
$carrito_mio[$i]!=NULL){$total=$total + ($carrito_mio[$i]['precio'] * $carrito_mio[$i]['cantidad']);
 
/*variables*/
 
$estado 'recibido';
 
$usuarioid $_SESSION['MM_Username'];
 
date_default_timezone_set('Europe/Madrid');
 
$fecha date('d-n-o');
 
$hora date('H:i:s',strtotime('+0hours'));
 
$nombre_productos $carrito_mio[$i]['nombre']; 
 
$precio_unidad $carrito_mio[$i]['precio'];
 
$cantidad $carrito_mio[$i]['cantidad'];
 
$precio_total $total;$pagos 'pendiente';
 
/*insertamos consulta en pedidos*/
 
$pedido "INSERT INTO pedidos(usuarioid,fecha,hora,nombre_productos,cantidad,estado,precio_total,pagos,precio_unidad)";
 
$pedido.= "VALUES ('".$usuarioid."','".$fecha."','".$hora."','".$nombre_productos."','".$cantidad."','".$estado."','".$precio_total."','".$pagos."','".$precio_unidad."')";                            
 
$pedido_query mysql_query($pedido);
 
/*verificacion nsertar datos en pedidos*/
 
if(!$pedido_query){ header("location:error2.php?error=1");
 }else{
 }
 }
 }
 }
 
?>
aver si podeis echar una mano
y gracias.
  #2 (permalink)  
Antiguo 14/11/2011, 05:49
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: problemilla con mi tienda online

Primero:

Formatea bien tu código. Así como lo tienes, es complicado seguir la lógica. Si lo pones así es mucho más sencillo:
Código PHP:
<?php
/*seleccionamos bd*/
mysql_select_db('nombre_bd') or die(mysql_error());
if (isset(
$_SESSION['carrito'])) {
    
$total 0;
    for (
$i 0$i <= count($carrito_mio) - 1$i++) {
        if (
$carrito_mio[$i] != NULL) {
            
$total     $total + ($carrito_mio[$i]['precio'] * $carrito_mio[$i]['cantidad']);
            
/*variables*/
            
$estado    'recibido';
            
$usuarioid $_SESSION['MM_Username'];
            
date_default_timezone_set('Europe/Madrid');
            
$fecha            date('d-n-o');
            
$hora             date('H:i:s'strtotime('+0hours'));
            
$nombre_productos $carrito_mio[$i]['nombre'];
            
$precio_unidad    $carrito_mio[$i]['precio'];
            
$cantidad         $carrito_mio[$i]['cantidad'];
            
$precio_total     $total;
            
$pagos            'pendiente';
            
/*insertamos consulta en pedidos*/
            
$pedido           "INSERT INTO pedidos(usuarioid,fecha,hora,nombre_productos,cantidad,estado,precio_total,pagos,precio_unidad)";
            
$pedido .= "VALUES ('" $usuarioid "','" $fecha "','" $hora "','" $nombre_productos "','" $cantidad "','" $estado "','" $precio_total "','" $pagos "','" $precio_unidad "')";
            
$pedido_query mysql_query($pedido);
            
/*verificacion nsertar datos en pedidos*/
            
if (!$pedido_query) {
                
header("location:error2.php?error=1");
            } else {
            }
        }
    }
}
?>
Segundo:

Este for
Código PHP:
 for ($i 0$i <= count($carrito_mio) - 1$i++) { 
Sería lo mismo que este:
Código PHP:
 for ($i 0$i count($carrito_mio); $i++) { 
Es más "sencillo" (almenos, para mi) de un vistazo saber lo q hace el for :) (Esto sólo es un apunte).

Tercero, ¿a q te refieres q duplica?

Por ejemplo, si insertas SÓLO un producto en el carrito, ¿te lo duplica en la BBDD?

Cuarto, ¿estás eguro que tienes un buen diseño de BBDD?
Piensa que un "pedido", puede tener muchos "productos". El pedido será el mismo...

Deberías tener, probablemente, dos tablas. Una con los datos del pedido, y otra con los productos del pedido... así no tendrías q duplicar usuario, fecha, etc del mismo pedido por producto que hagas. Algo así como:

pedidos
id | usuario | fecha | estado

productoPedidos
id | id_pedido | id_producto | id_cantidad | precio

Es sólo una sugerencia :)
__________________
>> Eleazan's Source
>> @Eleazan
  #3 (permalink)  
Antiguo 14/11/2011, 06:09
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 59
Antigüedad: 20 años, 5 meses
Puntos: 0
Respuesta: problemilla con mi tienda online

Cita:
Iniciado por Eleazan Ver Mensaje
Por ejemplo, si insertas SÓLO un producto en el carrito, ¿te lo duplica en la BBDD?
A eso mismo me refiero.


Por cierto en la BD tengo las tablas:

productos dentro de ella tengo:

productoid
nombre_producto
categoriaid
descripcion
precio
imagen
disponible
activo

Luego tengo otra
pedidos
en la cual hay tengo:

pedidosid
nombre_producto
usuarioid
precio_total
cantidad
precio_unidad
fecha
hora
estado
pagos

Lo que yo quiero saber es porque me duplica los pedidos en la BD.
pidiendo un solo producto.

Lo que quiero hacer es mostrarselo al cliente en su panel de control
los pedidos que ha echo desde la fecha. Por eso guardo los pedidos del usuario en la BD.

Gracias por contestar.
  #4 (permalink)  
Antiguo 14/11/2011, 06:25
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: problemilla con mi tienda online

Supongo q será pq, cada vez q recargas la página, comprueba esto:
Código PHP:
if (isset($_SESSION['carrito'])) { 
Si sigue "dada de alta", te entrará otra vez... y volverá a crear el registro. Puede q ande por ahí el fallo :)

Básicamente, en el else que tienes vacio, tendrías q poner alguna forma para "marcar" ese carrito como pasado a la bbdd (o borrarlo de alguna forma!)
Código PHP:
 if (!$pedido_query) {
                
header("location:error2.php?error=1");
            } else {
                
//Anular el item del carrito que ya se ha procesado
            

Creo q van por ahí los tiros
__________________
>> Eleazan's Source
>> @Eleazan
  #5 (permalink)  
Antiguo 14/11/2011, 06:43
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 59
Antigüedad: 20 años, 5 meses
Puntos: 0
Respuesta: problemilla con mi tienda online

Cita:
Iniciado por Eleazan Ver Mensaje
Supongo q será pq, cada vez q recargas la página, comprueba esto:
Código PHP:
if (isset($_SESSION['carrito'])) { 
Si sigue "dada de alta", te entrará otra vez... y volverá a crear el registro. Puede q ande por ahí el fallo :)

Básicamente, en el else que tienes vacio, tendrías q poner alguna forma para "marcar" ese carrito como pasado a la bbdd (o borrarlo de alguna forma!)
Código PHP:
 if (!$pedido_query) {
                
header("location:error2.php?error=1");
            } else {
                
//Anular el item del carrito que ya se ha procesado
            

Creo q van por ahí los tiros
Podria ser asi?

Código PHP:
<?php
if(isset($_SESSION['carrito'])){
//todo el codigo anterior
}else{
$carrito_mio=NULL;
}
?>
  #6 (permalink)  
Antiguo 14/11/2011, 06:47
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: problemilla con mi tienda online

No, sólo deberías hacerlo en caso de éxito en la query (si tienes cualquier problema al insertar el carrito, no te interesa borrarlo)

Y sería algo así como:
Código PHP:
 if (!$pedido_query) { 
                
header("location:error2.php?error=1"); 
            } else { 
                
//Anular el item del carrito que ya se ha procesado 
                
$carrito_mio[$i] == NULL;
            } 
Y esto te lo digo sin tener ni idea de dónde sacas $carrito_mio xD
__________________
>> Eleazan's Source
>> @Eleazan
  #7 (permalink)  
Antiguo 14/11/2011, 06:53
(Desactivado)
 
Fecha de Ingreso: noviembre-2003
Mensajes: 59
Antigüedad: 20 años, 5 meses
Puntos: 0
Respuesta: problemilla con mi tienda online

$carrito_mio la saco del codigo dde la pagina carrito de compras que es este:


Código PHP:
<?php
if(isset($_SESSION['carrito']) || isset($_POST['nombre'])){
    if(isset(
$_SESSION['carrito'])){
        
$carrito_mio=$_SESSION['carrito'];
        if(isset(
$_POST['nombre'])){
            
$nombre=$_POST['nombre'];
            
$precio=$_POST['precio'];
            
$cantidad=$_POST['cantidad'];
            
$donde=-1;
            for(
$i=0;$i<=count($carrito_mio)-1;$i ++){
               if(
$nombre==$carrito_mio[$i]['nombre']){
                   
$donde=$i;
               }
            }
            if(
$donde != -1){
                
$cuanto=$carrito_mio[$donde]['cantidad'] + $cantidad;
                
$carrito_mio[$donde]=array("nombre"=>$nombre,"precio"=>$precio,"cantidad"=>$cuanto);
            }else{
                
$carrito_mio[]=array("nombre"=>$nombre,"precio"=>$precio,"cantidad"=>$cantidad);
            }
        }
    }else{
        
$nombre=$_POST['nombre'];
        
$precio=$_POST['precio'];
        
$cantidad=$_POST['cantidad'];
        
$carrito_mio[]=array("nombre"=>$nombre,"precio"=>$precio,"cantidad"=>$cantidad);    
    }
    if(isset(
$_POST['cantidad2'])){
        
$id=$_POST['id'];
        
$cuantos=$_POST['cantidad2'];
        if(
$cuantos<1){
            
$carrito_mio[$id]=NULL;
        }else{
            
$carrito_mio[$id]['cantidad']=$cuantos;
        }
    }
    if(isset(
$_POST['id2'])){
        
$id=$_POST['id2'];
        
$carrito_mio[$id]=NULL;
    }
    
    
$_SESSION['carrito']=$carrito_mio;
}

?>

Etiquetas: mysql, sql, variables, usuarios, tiendas
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 08:08.