Foro

Ayuda en programación [URGENTE]

Otros lugares, otras opciones :: Sin clasificar :: Ayuda en programación [URGENTE]

Este hilo ha sido cerrado.
19/11/2012, 17:39

Buenas, mis muy buen paisanos umbrianos.

Tengo un "ligero" error (es que es gravísim, eh?) de pogramación y por más que busco no encuentro nada que me ayude con el problema que tengo. No sé si es que no sé buscar correctamente, no he puesto las palabras correctas o es que nadie ha tenido el mismo maldito problema que yo (cosa que dudo).

A la cuestión: estoy programando una página web de créditos y tengo un problema con el número de expediente (lo que viene a ser la ID) del formulario. Al iniciar la página y entrar en el formulario, automáticamente (y una mierda, que tiro de BD y PHP) suma +1 al ID último guardado en BD (vamos, que si el anterior era el 665, cuando abras de nuevo será el 666).

Hasta ahí todo bien. El problema es que si se abre un formulario, te da el 666. Sin haber guardado el anterior formulario, vuelves a abrir otro formulario en una ventana distinta, te vuelve a dar el 666, pero debería dar el 667 ya que pueden haber diversos operadores trabajando al mismo tiempo. ¿Cómo diablos puedo solucionarlo?

El código actual del ID es este:

PHP

$select = "SELECT * FROM ___ ORDER BY ___ DESC LIMIT 1";
$exec_sel = mysql_query($select,$con);
$row = mysql_fetch_array($exec_sel);
$num = mysql_num_rows($exec_sel);

 

if ($num == 0)
{
$ID = 10150;
}else{
$ID = $row['___'];
$ID = $ID+1;
}

 


No tengo ni pajolera idea de cómo solucionarlo.

A la salud de Dios.

PD: Si alguien me ayuda correctamente, aparte de mi enorme gratitud (lo cual no es poco), se habrá ganado la sonrisa de un niño (que tampoco es poco), un vale para montarse en todo en el parque de atracciones y... (uf, me duele) dos tazos de pokemon.

19/11/2012, 17:58
Editado: 19/11/2012, 17:59

En mi opinión lo razonable es no dar el ID hasta que se grabe el formulario. En otro caso te faltaran números, ya que alguien puede no grabar el 665, y si grabar el 666. Y aún en ese caso, tu código puede tener problemas de concurrencia.

Si quieres dar el ID antes, la única solución es llevar un contador en otra tabla/variable.

Finalmente, si de algo te sirve mi experiencia, un contador visible al usuario nunca, nunca debe ser la llave maestra de la base de datos. Usa un autoincrementable, que la BBDD te gestionara de puta madre para darle el código real a las fichas, y creo otro campo, por ejemplo número para que vea el usuario.

19/11/2012, 18:12

Pues depende de como quieras afrontar el problema y de tu requerimientos.

La solucion mas facil, es cuando alguien solicite el formulario, ya crear una fila con la ID adecuada (Ej. 666), y realizar un INSERT con todo lo demas a NULL. Asi el numero de ID queda guardado, y si otra persona abre un fomulario se le asignaria el siguiente. El tema aqui es que, aparte de llenarte la BBDD con muchisimos nulls (cargas de pagina incompletas, gente que cierra el formulario, cualquier bot que abra la web), tendras que tener en cuenta que cualquier visualizacion y listado que se ignoren todas las Tablas con un valor NULL en X campo.

Estas es la solucion un poco de andar por casa. Ya la otra requiere mas trabajo (y yo en PHP ando un poco basico, asi que puedo decirte mas metodologia que codigo util XD).

Igual que en la anterior, crearas la linea en la BBDD nada mas se cargue el formulario y lo guardaras en la base de datos. La gracia esta en crear un campo mas en la BBDD, por ejemplo, EXP_STATUS, que indique el estado del expediente en cuestion del a siguiente forma. (El campo sera un numerico).

Valor 0= el campo se acaba de crear. En cuanto a logica, la ID con este status no puede ser sobreescrita, pero tampoco visualizada en ningun listado.

Valor 1= ID libre. La fila con esta ID ya ha sido creada, pero esta disponible para introducir datos, y no usada actualmente por un cliente. La gracia esta aqui, en cuando indicarle a la BBDD que tiene que pasar un valor de 0(ID ocupada) a 1(ID libre), puede hacerlo mediante variables de sesion (si el usuario pierde conexion, cambiar el valor) o incluso mediante alguna funcion en la BBDD que al final del dia (EJ, 3-5 de la madrugada) pase todos los Valores 0 a 1. Esto ya depende de lo que te permita PHP y puedas hacer tu.

Valor 3= ID ocupada y expediente correcto. Esta ID indica que el formulario esta correctamente completado y la ID ocupada permanentemente.

La querys, asi como ejemplo quedarian tal que asi.

QUERY de IDs creadas disponibles.

SELECT * FROM ___ ORDER BY ___ DESC WHERE EXP_STATUS = 1

Esto te daria un listado de ID que pueden ser sobreesquitas. En el caso de que la consulta SQL diese 0 (no hay IDs libres) puedes seguir con el bloque de codigo que has puesto. (no hay IDs libres, con lo cual la ultima ID+1 es la correcta a rellenar)

Si no da 0, se cambia el valor en la base de datos de 1(disponible) a 0(ocupada por un usuario), y ya que intruzca el cliente los datos.

Seguramente, si aparece alguna bestia de la programacion, te diga algun metodo mejor, estos son los que yo, como Programador Junior feliz de la vida crearia.

Si te parece muy lio y me aburro en casa (pero mucho XD), puedo intentar ponerte un codigo con esta funcionalidad, pero claro, tampoco se si te sirve, o si mi idea es una puñetera mierda XDDD

P.D.: acabo de ver lo que ha puesto javier. Si el codigo no ha de ser un autoincrimental en cuanto a lo que tiene que ver el cliente, una combinacion rollo fecha/nombre o algo asi te soluciona el problema XD

19/11/2012, 23:34

Muchas gracias a ambos.

Al final lo que he hecho es crear una tabla nueva donde registro el ID nada más cargarse la página. Así, si se abren distintas ventanas a la vez, se crean distintas IDs. Lo malo es que si las cierran, se queda el número pillado... pero bueno. No creo que importe. Luego, cada 500 registros vacío la tabla.

Me parece una chapucilla, pero bueno... para salir del paso creo que vale.

Gracias a ambos!

Finalmente, si de algo te sirve mi experiencia, un contador visible al usuario nunca, nunca debe ser la llave maestra de la base de datos.

Ya, aunque lo he llamado ID para la explicación, realmente en la BD tengo la ID y luego el número de expediente.

20/11/2012, 00:12

Es una buena solución, pero en vez de ir añadiendo registros y luego borrarlos, no es sencillo usar un único registro e incrementarlo.

20/11/2012, 11:16

Estoy con javier, ¿por qué necesitas el ID al abrir el formulario? Puedes configurar la tabla para que el campo ID sea autoincrement y olvidarte de él. Haces el INSERT con los datos sin pasarle el campo ID y ya te lo asigna automáticamente sin problema. Si necesitas un código para mostrar al usuario en el formulario en lugar del ID puedes asignarle un código aleatorio con la función uniqid() de PHP. Ese código no se repetiría aunque varios usuarios abran el formulario al mismo tiempo.

Suerte. Un saludo.

Este hilo ha sido cerrado.