Foros del Web » Programando para Internet » PHP »

Error DUPLICATE ENTRY

Estas en el tema de Error DUPLICATE ENTRY en el foro de PHP en Foros del Web. Saludos de nuevo Ando aun con lo de ticket number, ya tengo la manera para que me suba uno a uno los registros pero tengo ...
  #1 (permalink)  
Antiguo 22/02/2006, 12:51
Avatar de carlosfocus  
Fecha de Ingreso: enero-2006
Ubicación: Venezuela
Mensajes: 823
Antigüedad: 11 años, 10 meses
Puntos: 0
Error DUPLICATE ENTRY

Saludos de nuevo

Ando aun con lo de ticket number, ya tengo la manera para que me suba uno a uno los registros pero tengo un problema

cuando vacio la tabla me inserta el primer registro sin problemas pero cuando vuelvo a enviar el formulario me da el siguiente error

Invalid query: Duplicate entry 'tn000001-22-02-06' for key 1


mi code es este

Código PHP:


$NDAY 
strtolower(strftime("%d-%m-%y"time()));
        

$result1 mysql_query("SELECT MAX(ticketnumber)AS TNUM FROM ".$tblrequests." WHERE (((ticketnumber) LIKE '%" $NDAY "'))"mysql_error());
while (
$row mysql_fetch_array($result1MYSQL_BOTH))
   {
   if(!empty(
$row["TNUM"])){
   
$CurRef $row["TNUM"];
   list(
$start$end) = explode("-"$CurRef);
   
$start =  "00000".($start+1);

   
$GetRefNumber "tn".$start ."-"$NDAY;
   } else{
  
$GetRefNumber "tn0001-".$NDAY;
   }
}
$ticketnumber $GetRefNumber
No entiendo el por que el error
__________________
Carlos Herrera
Web Developer
www.carlos.com.ve
Para descargar archivos propios a su Teléfono Mobil? www.carlosfocus.com
  #2 (permalink)  
Antiguo 22/02/2006, 14:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Según ese error .. tienes en tu BBD ese campo de "ticketnumber" como único .. y te está avisando que para cuando pretendes ingresar ese nuevo dato .. ya existe uno igual.

Por ende puedes deducir que tu algoritmo no funciona. Calcula el mismo una y otra vez .. o repite el último, el caso es que repite o genera uno ya existente.

Un saludo,
  #3 (permalink)  
Antiguo 22/02/2006, 14:41
Avatar de carlosfocus  
Fecha de Ingreso: enero-2006
Ubicación: Venezuela
Mensajes: 823
Antigüedad: 11 años, 10 meses
Puntos: 0
Ok cluster

coloque el codigo original y si me funciona lo hace 1,2,3,4,5 N cantidad de veces, lo que necesito es agragrle al campo que se genera dinamico las letras TN y no me permite ingresar mas de uno :( como haria?
__________________
Carlos Herrera
Web Developer
www.carlos.com.ve
Para descargar archivos propios a su Teléfono Mobil? www.carlosfocus.com
  #4 (permalink)  
Antiguo 22/02/2006, 14:50
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
No entiendo tu algorítmo .. describe en que variable tienes ese n° que generas correlativo.

De todas formas .. se supone que es aquí donde lo generas:
$GetRefNumber = "tn".$start ."-". $NDAY;

pero también tienes un "if()" por ahí que si no se cumple deja fijo tu:
$GetRefNumber = "tn0001-".$NDAY;
(con propositos supongo de "iniciarlizar" ese "código"?)

Intenta explicar tu algorítmo, tus variables, que contienen .. date cuenta que se ven muchos campos con no sabemos que datos entregan .. en fin, es complicado así hacer una "ingenería inversa" (intentar entender) que hace el código, preguntarte que "debería hacer" y despues dar alguna solución.

Un saludo,
  #5 (permalink)  
Antiguo 22/02/2006, 15:00
Avatar de carlosfocus  
Fecha de Ingreso: enero-2006
Ubicación: Venezuela
Mensajes: 823
Antigüedad: 11 años, 10 meses
Puntos: 0
ok cluster, el codigo lo que hace es generar registros por dia, si hoy hay 20 solicitudes el generaria esto

0001-22-02-2006
.
.
.
0020-22-02-2006

Si mañana hay 3 solicitudes nada mas el generaria esto:

0001-23-02-2006
0002-23-02-2006
0003-23-02-2006

Me entiendes la funcion del script? el de esta manera lo hace perfecto talcual comom lo quiero, pero a mi jefe se le ocurrio añadir un TN antes del codigo 000X, me entiendes?

Eso es lo que no me permite hacer o mejor dicho insertar..................

El codigo original es este

Código PHP:

$NDAY 
strtolower(strftime("%d-%m-%y"time()));
        

$result1 mysql_query("SELECT MAX(ticketnumber)AS TNUM FROM ".$tblrequests." WHERE (((ticketnumber) LIKE '%" $NDAY "'))"mysql_error());
while (
$row mysql_fetch_array($result1MYSQL_BOTH))
   {
   if(!empty(
$row["TNUM"])){
   
$CurRef $row["TNUM"];
   list(
$start$end) = explode("-"$CurRef);
   
$start =  "00000".($start+1);

   
$GetRefNumber $start ."-"$NDAY;
   } else{
  
$GetRefNumber "0001-".$NDAY;
   }
}
$ticketnumber $GetRefNumber

Yo lo unico que hice fue esto:

Código PHP:

$NDAY 
strtolower(strftime("%d-%m-%y"time()));
        

$result1 mysql_query("SELECT MAX(ticketnumber)AS TNUM FROM ".$tblrequests." WHERE (((ticketnumber) LIKE '%" $NDAY "'))"mysql_error());
while (
$row mysql_fetch_array($result1MYSQL_BOTH))
   {
   if(!empty(
$row["TNUM"])){
   
$CurRef $row["TNUM"];
   list(
$start$end) = explode("-"$CurRef);
   
$start =  "00000".($start+1);

   
$GetRefNumber "tn".$start ."-"$NDAY//Aqui colque "tgn"
   
} else{
  
$GetRefNumber "tn0001-".$NDAY// Aqui igual...... coloque el "tn"
   
}
}
$ticketnumber $GetRefNumber
Pero yo vacio mi tabla y me inserta el primer registro bien, pero para el segundo registro no lo hace :S y no entiendo,.............


Gracias por tanta molestia :D
__________________
Carlos Herrera
Web Developer
www.carlos.com.ve
Para descargar archivos propios a su Teléfono Mobil? www.carlosfocus.com
  #6 (permalink)  
Antiguo 22/02/2006, 15:54
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Deberías postear la parte del código donde haces la inserción del registro.
Además es buena idea que separes la sentencia SQL en otra variable, así la puedes imprimir con "echo" y ver si se está generando lo que esperas.
Código PHP:
<?
//...
$sql "INSERT INTO...";
mysql_query($sql) or die("El sql generado fue <strong>$sql</strong> y dio el error: ".mysql_error());
  #7 (permalink)  
Antiguo 22/02/2006, 15:56
Avatar de carlosfocus  
Fecha de Ingreso: enero-2006
Ubicación: Venezuela
Mensajes: 823
Antigüedad: 11 años, 10 meses
Puntos: 0
El problema no esta en el Inset into si no es la parte del codigo donde verifico si existe un registro del dia, si no existe inyecto 0001 si existe inyecto el siguiente es decir si ya esta 0001 que genere el 0002 y asi sucesivamente
__________________
Carlos Herrera
Web Developer
www.carlos.com.ve
Para descargar archivos propios a su Teléfono Mobil? www.carlosfocus.com
  #8 (permalink)  
Antiguo 22/02/2006, 15:57
Avatar de carlosfocus  
Fecha de Ingreso: enero-2006
Ubicación: Venezuela
Mensajes: 823
Antigüedad: 11 años, 10 meses
Puntos: 0
Gracias :D
__________________
Carlos Herrera
Web Developer
www.carlos.com.ve
Para descargar archivos propios a su Teléfono Mobil? www.carlosfocus.com
  #9 (permalink)  
Antiguo 22/02/2006, 16:00
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Algo más:

Revisa la parte donde haces el select... le estás concatenando el error de mysql (no te dio problemas porque no hay errores de mysql previos a la ejecución de la sentencia).
Código PHP:
<?
$result1 
mysql_query("SELECT MAX(ticketnumber)AS TNUM FROM ".$tblrequests." WHERE (((ticketnumber) LIKE '%" $NDAY "'))"mysql_error());

// Debe haber un condicional
// Y también queda mejor si sacas el SQL en una variable
$sql "SELECT MAX(ticketnumber) AS TNUM FROM ".$tblrequests." WHERE (((ticketnumber) LIKE '%" $NDAY "'))"
$result1 mysql_query($sql);
if(
$result == false){
    die(
"Error en la consulta:: <strong>$sql</strong> ::"mysql_error());
}

// O su equivalente simplificado
$sql "SELECT MAX(ticketnumber) AS TNUM FROM ".$tblrequests." WHERE (((ticketnumber) LIKE '%" $NDAY "'))"
$result1 mysql_query($sql) or die("Error en la consulta:: <strong>$sql</strong> ::"mysql_error());
Saludos
  #10 (permalink)  
Antiguo 22/02/2006, 16:03
Avatar de carlosfocus  
Fecha de Ingreso: enero-2006
Ubicación: Venezuela
Mensajes: 823
Antigüedad: 11 años, 10 meses
Puntos: 0
Gracias verificare eso mañana ya me tebgo que ir
__________________
Carlos Herrera
Web Developer
www.carlos.com.ve
Para descargar archivos propios a su Teléfono Mobil? www.carlosfocus.com
  #11 (permalink)  
Antiguo 22/02/2006, 16:09
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Ok.. ya entendí.. el problema es que tienes un "tn" ya guardado y que no debes volver a leer:
Código PHP:
<?
list($start$end) = explode("-"$CurRef);
$start substr($start2); // Aqui sacamos el primer "tn"
$start =  "00000".($start+1);
  #12 (permalink)  
Antiguo 22/02/2006, 16:43
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Bueno... tampoco es la mejor manera de hacer lo que pretendes.
Por ejemplo:
- ¿Usas la variable $end?
- ¿Todos los números deben tener 5 ceros delante? O sea 000001, 000002, ... 00000157, ..., 0000015884... Me parece que si es un código, debería mantenerse el número en 6 cifras. O sea 000001, 000002, ... , 000157, 015884.

Acá te dejo un ejemplo un poco más sencillo:
Código PHP:
<?
$CurRef 
"tn00029-23-02-2006";

// Si no usas la variable $end, no la definas
list($start) = explode("-"$CurRef); 

// Le quitamos el "tn" para que quede sólo el número
$numero_actual = (int)substr($start2); 

// Le sumamos 1 
$numero_que_sigue $numero_actual 1;

// Le agregamos suficientes ceros para que siempre tenga 5 cifras
$numero_con_ceros sprintf("%05s"$numero_que_sigue );

// Rearmamos la cadena
$GetRefNumber "tn".$numero_con_ceros ."-"."23-02-2006";

echo 
$GetRefNumber;
Obvio que el "23-02-06" que agrego al final, deberás cambiarlo por $NDAY (ya que la tienes).

Y esto lo desmenucé para poder explicarlo línea a línea con mayor facilidad... hay líneas que podrían juntarse.

Saludos

Última edición por jpinedo; 23/02/2006 a las 01:23
  #13 (permalink)  
Antiguo 23/02/2006, 06:38
Avatar de carlosfocus  
Fecha de Ingreso: enero-2006
Ubicación: Venezuela
Mensajes: 823
Antigüedad: 11 años, 10 meses
Puntos: 0
Wow Muchisimas gracias JPINEDO acabo de llegar a mi oficina, en un rato pruebo esto gracia.
__________________
Carlos Herrera
Web Developer
www.carlos.com.ve
Para descargar archivos propios a su Teléfono Mobil? www.carlosfocus.com
  #14 (permalink)  
Antiguo 23/02/2006, 07:23
Avatar de carlosfocus  
Fecha de Ingreso: enero-2006
Ubicación: Venezuela
Mensajes: 823
Antigüedad: 11 años, 10 meses
Puntos: 0
Me funciono perfecto muchas gracias por tu ayuda :D
__________________
Carlos Herrera
Web Developer
www.carlos.com.ve
Para descargar archivos propios a su Teléfono Mobil? www.carlosfocus.com
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 17:29.