Foros del Web » Programando para Internet » PHP »

Entrada duplicada

Estas en el tema de Entrada duplicada en el foro de PHP en Foros del Web. Buenas,tengo un problema. Tengo una web donde se puede comprar productos. Pues bien, ahora resulta que solo puedo rellenar el formulario del pedido 1 sola ...
  #1 (permalink)  
Antiguo 16/05/2006, 02:58
 
Fecha de Ingreso: septiembre-2005
Mensajes: 379
Antigüedad: 18 años, 7 meses
Puntos: 0
Entrada duplicada

Buenas,tengo un problema. Tengo una web donde se puede comprar productos. Pues bien, ahora resulta que solo puedo rellenar el formulario del pedido 1 sola vez. Cuando vuelvo a entrar en la pagina y relleno otra vez el formulario me lanza este error:
Error de query: Entrada duplicada '' para la clave 3

Se me ocurrió quitar mi base de datos (productos.sql) y como la tengo guardada en otro sitio como seguridad(backup)....la volví a cargar en el phpmyadmin. Entonces cuando vuelvo a intentar rellenar el formulario y aceptar el pedido SI QUE FUNCIONA, pero solo 1 vez.
Resumiendo....que cada vez ke kiero demostrar a alguien ke la web funciona...tengo ke eliminar la base de datos y volver a cargarla de nuevo para que me funcione al menos 1 vez.

A que puede deberse eso? Que es lo que puedo haber tocado para que me salga eso?? Muchas gracias.
  #2 (permalink)  
Antiguo 16/05/2006, 03:17
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Es posible que, al insertar un nuevo pedido, estes asignando un valor a algún campo de clave única (primaria). Estos valores, normalmente, se rellenan solos (autonuméricos).
Sería bueno que nos mostraras el insert que se hace y la definición de la tabla de la base de datos. Un saludo.
  #3 (permalink)  
Antiguo 16/05/2006, 03:29
 
Fecha de Ingreso: septiembre-2005
Mensajes: 379
Antigüedad: 18 años, 7 meses
Puntos: 0
Hola jerkan.Mi tabla de pedidos tiene una clave primaria llamada "pedidoid" que es autonumerico. Te pongo el insertar pedido(bastante largo) y la tabla de pedidos para que veas el codigo.

Código PHP:
function insertar_pedido($detalles_pedido)
{
  global 
$HTTP_SESSION_VARS;

   
//extraer detalles_pedido como variables
  
extract($detalles_pedido);


  
//poner la direccion de envio y su direccion normal
  
if(!$nombre_envio&&!$direccion_envio&&!$ciudad_envio&&!$provincia_envio&&!$cp_envio&&!$usuario_envio)
  {
    
$nombre_envio $nombre;
    
$direccion_envio $direccion;
    
$ciudad_envio $ciudad;
    
$provincia_envio $provincia;
    
$cp_envio $cp;
    
$usuario_envio $usuario;
  }

  
$con conexion_bd();
 
  
//inserta los datos de la direccion del cliente
  
$query "select clienteid from clientes where  
            nombre = '$nombre' and direccion = '$direccion' 
            and ciudad = '$ciudad' and provincia = '$provincia' 
            and cp = '$cp' and usuario = '$usuario'"
;
  
$result mysql_query($query);
  if(
mysql_numrows($result)>0)
  {
    
$cliente_id mysql_result($result0'clienteid');
  }
  else
  {
    
$query "insert into clientes values
            ('','$nombre','$direccion','$ciudad','$provincia','$cp','$usuario','','','','','','')"
;
    
$result mysql_query($query) or die('Error de query: '.mysql_error());
    if (!
$result)
       return 
false;
  }
  
$query "select clienteid from clientes where  
            nombre = '$nombre' and direccion = '$direccion' 
            and ciudad = '$ciudad' and provincia = '$provincia' 
            and cp = '$cp' and usuario = '$usuario'"
;
  
$result mysql_query($query);
  if(
mysql_numrows($result)>0)
    
$clienteid mysql_result($result0'clienteid');
  else
    return 
false
  
$fecha date('Y-m-d');
  
$query "insert into pedidos values
            ('', $clienteid, "
.$HTTP_SESSION_VARS['precio_total'].", '$fecha', 'Pendiente', '$nombre_envio',
             '$direccion_envio','$ciudad_envio','$provincia_envio','$cp_envio',
              '$usuario_envio')"
;
  
$result mysql_query($query);
  if (!
$result)
    return 
false;

  
$query "select pedidoid from pedidos where 
               clienteid = $clienteid and 
               importe > "
.$HTTP_SESSION_VARS['precio_total']."-.001 and
               importe < "
.$HTTP_SESSION_VARS['precio_total']."+.001 and
               fecha= '$fecha' and
               estado_pedido = 'Pendiente' and
               nombre_envio = '$nombre_envio' and
               direccion_envio = '$direccion_envio' and
               ciudad_envio = '$ciudad_envio' and
               provincia_envio = '$provincia_envio' and
               cp_envio = '$cp_envio' and
               usuario_envio = '$usuario_envio'"
;
  
$result mysql_query($query);
  if(
mysql_numrows($result)>0)
    
$pedidoid mysql_result($result0'pedidoid');
  else
    return 
false


  
// inserta todos los vinos
  
foreach($HTTP_SESSION_VARS['carro'] as $vinosid => $cantidad)
  {
    
$detalles info_vinos($vinosid);
    
$query "delete from articulos_pedido where  
              pedidoid = '$pedidoid' and vinosid =  '$vinosid'"
;
    
$result mysql_query($query);
    
$query "insert into articulos_pedido values
              ('$pedidoid', '$vinosid', "
.$detalles['precio'].", $cantidad)";
    
$result mysql_query($query);
    if(!
$result)
      return 
false;
  }

  return 
$pedidoid;
}

?> 


TABLA PEDIDOS:

CREATE TABLE `pedidos` (
`pedidoid` int(10) unsigned NOT NULL auto_increment,
`clienteid` int(10) unsigned NOT NULL default '0',
`importe` float(6,2) default NULL,
`fecha` date NOT NULL default '0000-00-00',
`estado_pedido` varchar(10) default NULL,
`nombre_envio` varchar(40) NOT NULL default '',
`direccion_envio` varchar(40) NOT NULL default '',
`ciudad_envio` varchar(20) NOT NULL default '',
`provincia_envio` varchar(20) default NULL,
`cp_envio` varchar(10) default NULL,
`usuario_envio` tinytext NOT NULL,
PRIMARY KEY (`pedidoid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=132 ;


A ver si damos con la solucion. Antes funcionaba perfectamente. GRACIAS
  #4 (permalink)  
Antiguo 16/05/2006, 03:53
 
Fecha de Ingreso: noviembre-2004
Mensajes: 7
Antigüedad: 19 años, 5 meses
Puntos: 0
He mirado tu codigo y lo tienes un poco lioso... cosilla para simplificar..
despues del insert, en vez de buscar el pedidoid mediante un select.. pueds hacer simplemente mysql_insert_id y te dara el idpedido sin hacerte tanto codigo. (te pongo abajo como hacerlo).

Yo miraria lo que te da el pedidoid y lo contrastaria con la bd. Tambien puede ser que se te haya llenado el int10 de pedido id ( subele a un bigint) y prueba.. yo creo que es eso por lo que dices


$query = "insert into pedidos values
('', $clienteid, ".$HTTP_SESSION_VARS['precio_total'].", '$fecha', 'Pendiente', '$nombre_envio',
'$direccion_envio','$ciudad_envio','$provincia_env io','$cp_envio',
'$usuario_envio')";
$result = mysql_query($query);
if (!$result)
return false;

/* A partir de aqui lo podrias substituiir por : pedidoid=mysql_insert_id($result)


$query = "select pedidoid from pedidos where
clienteid = $clienteid and
importe > ".$HTTP_SESSION_VARS['precio_total']."-.001 and
importe < ".$HTTP_SESSION_VARS['precio_total']."+.001 and
fecha= '$fecha' and
estado_pedido = 'Pendiente' and
nombre_envio = '$nombre_envio' and
direccion_envio = '$direccion_envio' and
ciudad_envio = '$ciudad_envio' and
provincia_envio = '$provincia_envio' and
cp_envio = '$cp_envio' and
usuario_envio = '$usuario_envio'";
$result = mysql_query($query);
if(mysql_numrows($result)>0)
$pedidoid = mysql_result($result, 0, 'pedidoid');
else
return false;
  #5 (permalink)  
Antiguo 16/05/2006, 03:55
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Prueba a hacer el insert de la siguiente manera:
Código PHP:
<?php
  $query 
"insert into pedidos (clienteid, importe, fecha, estado_pedido, nombre_envio, ciudad_envio, provincia_envio, cp_envio, usuario_envio) values
            ($clienteid, "
.$HTTP_SESSION_VARS['precio_total'].", '$fecha', 'Pendiente', '$nombre_envio',
             '$direccion_envio','$ciudad_envio','$provincia_envio','$cp_envio',
              '$usuario_envio')"
;
?>
  #6 (permalink)  
Antiguo 16/05/2006, 04:05
 
Fecha de Ingreso: septiembre-2005
Mensajes: 379
Antigüedad: 18 años, 7 meses
Puntos: 0
Hola powerpulpo. El numero de pedidoid no puede haber llegado a su fin ya que va por el numero 132 y está especificado ese campo con un INT(10).

Jerkan he probado hacer el INSERT como me has dicho, epro sigue dando el mismo problema. No se a que puede deberse ese error que me tira.
  #7 (permalink)  
Antiguo 16/05/2006, 09:42
 
Fecha de Ingreso: septiembre-2005
Mensajes: 379
Antigüedad: 18 años, 7 meses
Puntos: 0
He estado trasteando esto un poco y me he dado cuenta de que cuando llega el pedidoid al 132 es cuando lanza ese error de Error de query: Entrada duplicada '' para la clave 3.
No se a que puede deberse eso. En mi tabla pedidos...el campo pedidoid es un INT(10).
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 09:11.