| ||||
saber que id es en la base de datos Bueno, tengo un campo autoincrementable, quiciera que al insertar un registro obtenga cual fue su ID cone l que se inserto. muchas gracias
__________________ SEO en Medellin |
| ||||
mysql_insert_id() parece una funcion interesante, pero se comporta bien con la concurrencia multiple de varios usuarios? imaginaos esta situacion: el usuario A inserta un registro el usuario B inserta un registro el usuario A llama mysql_insert_id() (*) en el caso anterior ambos usuarios han insertado un registro con una diferencia de milesimas de segundos. justo despues el usuario A llama a la funcion mysql_insert_id para obetener el ultimo "id" insertado, con la sorpresa que ha obtenido el ultimo "id" insertado por el usuario B. la afirmacion anterior es correcta, o la funcion mysql_insert_id esta preparada para soportar concurrencia??? (tambien hay que tener mala suerta para insertar ambos registros al mismo tiempo)
__________________ Si ocurre algo importante, estamos afuera fumándonos unos cigarritos. |
| ||||
es eso lo que me preocupa Haron precisamente es lo mimso lo que mwe preocupa por eso no lo hago con un select despés de insertarlo. pueden ser diferen, y no se necesita ser demalas, solo tener muchas visitas y muchos usuarios navegando. alguien sabe como podemos evitar la cocurrencia?
__________________ SEO en Medellin |
| ||||
en principio el problema este lo soluciono de la siguiente manera: imagina que tienes una pantalla en la que se muestra una tabla con los items insertados. cuando insertas un nuevo item, en lugar de quedarte con el 'id', vuelves a la pantalla anterior y observas que aparece en primera posicion (si ordenas los items por el 'id' de forma descendiente). entonces el usuario puede 'pinchar' sobre ese nuevo elemento y editarlo, ya que ahora se conoce el 'id'. si no es esa tu situacion, puedes quitar la opcion autoincrementable y crear una funcion que te devuelva un 'id' aleatorio, de manera que la probabilidad matematica de generar dos 'ids' iguales sea muy baja (mas baja incluso que te toque la loteria). puedes probar con una funcion parecida a esta:
Código:
la funcionanterior te genera un 'id' de veinte digitos. es casi imposible que genere dos 'ids' iguales.function getNewId($size = 20) { $str = NULL; for ($i = 0; $i < $size; $i ++) { $str .= rand(0, 9); } return $str; } tendrias que hacer algo parecido a esto: $id = getNewId(); $sql = "insert into my_table(id, ...) values ($id, ...)"; $result = mysql_query($sql, $connection); // etc..., etc...
__________________ Si ocurre algo importante, estamos afuera fumándonos unos cigarritos. |
| ||||
Muchas gracias haron, pero necesito que sea autoincrementable. alguien conoce alguna función?
__________________ SEO en Medellin |
| ||||
si has hecho un insert, consecutivamente con un select obtienes el dato... es simple... mysql_db_query($db,"insert into tabla (nombre) values ('$nombre')); luego pones un mysql_db_query($db,select id from tabla where nombre='$nombre'); y fetch_array mediante ya puedes jugar con la id del insert que tu mismo has hecho...
__________________ See you... y Tolkien... mucho Tolkien... |
| |||
En los comentarios de usuarios a la función mysql_insert_id() (http://ar.php.net/mysql_insert_id), alguien comenta sobre este tema citando el manual de MySql. Cita: O sea que la función (de MySql, no de php) LAST_INSERT_ID() devuelve siempre el último valor de id del insert realizado en el servidor por el cliente (el que hace la operación). Si dos personas insertan dos registros casi simultáneamente, no hay conflicto, porque son dos clientes distintos. A cada uno le va a devolver el id de su consulta. (Al menos así dice el manual)Here's the relevant quote from the manual on LAST_INSERT_ID() which is located here: http://dev.mysql.com/doc/mysql/en/In...functions.html "The last ID that was generated is maintained in the server on a per-connection basis. This means the value the function returns to a given client is the most recent AUTO_INCREMENT value generated by that client. The value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that you can retrieve your own ID without concern for the activity of other clients, and without the need for locks or transactions." Esta referencia de arriba corresponde a MySql 5, pero busqué en otras versiones y la función LAST_INSERT_ID() también está disponible. Lo que no está del todo claro es si la función de php mysql_insert_id() se comporta también así. (Me da la impresión de que no necesariamente, por algo MySql Server debe tener mysql_insert_id() y también LAST_INSERT_ID() ) En el manual hay algunos ejemplos que explican cómo usar LAST_INSERT_ID(): Código PHP: Otra opción, del manual de MySql: (http://dev.mysql.com/doc/refman/4.1/...unique-id.html) Código PHP: Creo que sería cuestión de empezar a hacer algunos tests con LAST_INSERT_ID(), que parece más "segura". |
| ||||
pues es muy practica esa funcion y te quita muchos quebraderos de cabeza y soluciones complicadas. la usare.
__________________ Si ocurre algo importante, estamos afuera fumándonos unos cigarritos. |
| ||||
estimado califa010, Muchas gracias por tu ayuda, quizas esa es la función que muchos estabamos buscando. Si alguien tiene alguna objeción le agradeceriamos que la compartiera. UN saludo y muchas gracias
__________________ SEO en Medellin |
| |||
mysql__insert_id($id_result); Supuestamente deberia garantizar que el ultimo id que devuelve la funcion es el que corresponde a la conexion identificada con $id_result para ese cliente Suponiendo el ejemplo que comentaron arriba CLIENTE A -> $id_result id_result de A supongamos vale xxxxx_1111 (lo que sea) CLIENTE B -> $id_result id_result de B no será igual a el id_result de A Entonces si A != B significa que en una linea de tiempo dada A realiza un INSERT con su $id_result B realiza un INSERT con su $id_result A solicita mysql__insert_id($id_result) con su propio id Luego B solicita mysql__insert_id($id_result) con su propio id Entonces esto deberia cumplirse para todo A y B el utlimo insert_id solicitado por A corresponde a A y no a B y lo mismo para B |
| ||||
Holas, creo que estan tocando un tema bastante interesante, al hablar de varios inserts a la vez por varios usuarios a una misma tabla, se beria pensar hacer el uso de transacciones concurrentes, y deberia pensarse talvez en realizar el uso de de la extension mysqli de php que permite el uso de transacciones en mysql, o realizar operaciones con START TRANSACTION, COMMIT, ROLLBACK desde la base de datos, bueno es una idea pero hay que evaluar que tan necesario pueda ser para que no existan errores con la integridad de tus datos dentro de tu aplicacion, ahora otra solucion tal vez un poco mas sencilla pero no se hasta que punto sera eficiente, hacer una consulta para recuperar el ultimo id utilizando alguna condicion mas para que no te devuelva de otra conexion o de otro usuario, pienso que seria algo asi: Código PHP: ![]()
__________________ "El Conocimiento es de todos, no solo de algunos" |