Foros del Web » Programando para Internet » PHP »

saber que id es en la base de datos

Estas en el tema de saber que id es en la base de datos en el foro de PHP en Foros del Web. Bueno, tengo un campo autoincrementable, quiciera que al insertar un registro obtenga cual fue su ID cone l que se inserto. muchas gracias...
  #1 (permalink)  
Antiguo 18/01/2006, 10:43
Avatar de mafima  
Fecha de Ingreso: abril-2003
Ubicación: Medellin-Colombia
Mensajes: 1.109
Antigüedad: 14 años, 8 meses
Puntos: 24
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
  #2 (permalink)  
Antiguo 18/01/2006, 11:03
Avatar de baklao  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Ana - Isla de Margarita
Mensajes: 482
Antigüedad: 13 años
Puntos: 0
Hola que tal Mafima utiliza el mysql_insert_id();
te devuelve el ultimo de ultima fijate en php.net en las funciones para mysql.


Salu2.
__________________
Atte. Mohamed :aplauso:
  #3 (permalink)  
Antiguo 18/01/2006, 12:05
Avatar de carlosfocus  
Fecha de Ingreso: enero-2006
Ubicación: Venezuela
Mensajes: 823
Antigüedad: 11 años, 10 meses
Puntos: 0
o has un query a la base de datos y tomas el campo ID y lo muestras...
  #4 (permalink)  
Antiguo 18/01/2006, 12:56
Avatar de haron  
Fecha de Ingreso: febrero-2004
Ubicación: Cádiz (refinitivo)
Mensajes: 632
Antigüedad: 13 años, 9 meses
Puntos: 3
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.
  #5 (permalink)  
Antiguo 18/01/2006, 13:01
Avatar de mafima  
Fecha de Ingreso: abril-2003
Ubicación: Medellin-Colombia
Mensajes: 1.109
Antigüedad: 14 años, 8 meses
Puntos: 24
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
  #6 (permalink)  
Antiguo 18/01/2006, 14:42
Avatar de haron  
Fecha de Ingreso: febrero-2004
Ubicación: Cádiz (refinitivo)
Mensajes: 632
Antigüedad: 13 años, 9 meses
Puntos: 3
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:
function getNewId($size = 20) {
	$str = NULL;
	for ($i = 0; $i < $size; $i ++) {
		$str .= rand(0, 9);
	}
	return $str;
}
la funcionanterior te genera un 'id' de veinte digitos. es casi imposible que genere dos 'ids' iguales.

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.
  #7 (permalink)  
Antiguo 18/01/2006, 20:57
Avatar de mafima  
Fecha de Ingreso: abril-2003
Ubicación: Medellin-Colombia
Mensajes: 1.109
Antigüedad: 14 años, 8 meses
Puntos: 24
Muchas gracias haron, pero necesito que sea autoincrementable.

alguien conoce alguna función?
__________________
SEO en Medellin
  #8 (permalink)  
Antiguo 18/01/2006, 21:11
Avatar de DjFaramir  
Fecha de Ingreso: febrero-2003
Ubicación: La Plata, Buenos Aires, Argentina
Mensajes: 131
Antigüedad: 14 años, 9 meses
Puntos: 0
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...
  #9 (permalink)  
Antiguo 18/01/2006, 21:11
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 11 años, 11 meses
Puntos: 5
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:
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."
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)

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:
$ultimo_id mysql_query("SELECT LAST_INSERT_ID()"); 
Así se almacenaría en una variable (suponiendo que antes hubiera efectivamente un insert).

Otra opción, del manual de MySql: (http://dev.mysql.com/doc/refman/4.1/...unique-id.html)

Código PHP:
INSERT INTO foo (auto,text)
    
VALUES(NULL,'text');              # generate ID by inserting NULL
INSERT INTO foo2 (id,text)
    
VALUES(LAST_INSERT_ID(),'text');  # use ID in second table 
El primer insert genera un id autonumérico, cuyo valor se usa en el segundo insert usando la función MySql LAST_INSERT_ID().

Creo que sería cuestión de empezar a hacer algunos tests con LAST_INSERT_ID(), que parece más "segura".
  #10 (permalink)  
Antiguo 19/01/2006, 04:38
Avatar de haron  
Fecha de Ingreso: febrero-2004
Ubicación: Cádiz (refinitivo)
Mensajes: 632
Antigüedad: 13 años, 9 meses
Puntos: 3
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.
  #11 (permalink)  
Antiguo 19/01/2006, 06:53
Avatar de mafima  
Fecha de Ingreso: abril-2003
Ubicación: Medellin-Colombia
Mensajes: 1.109
Antigüedad: 14 años, 8 meses
Puntos: 24
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
  #12 (permalink)  
Antiguo 04/02/2006, 08:45
 
Fecha de Ingreso: febrero-2006
Ubicación: Puerto Madryn - Chubut - Patagonia Argentina
Mensajes: 1
Antigüedad: 11 años, 10 meses
Puntos: 0
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
  #13 (permalink)  
Antiguo 04/02/2006, 09:13
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 12 años
Puntos: 5
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:
$sql="SELECT MAX(id) FROM tabla WHERE usuario='$usuario' ";
$sql="SELECT MAX(id) FROM tabla WHERE fecha='$fechayHoraInsert' "
bueno son sugerencias, pueden ayudar a salir del apuro, pero como dije no se que tan correcto o eficiente sea, pero la idea seria algo asi usar una condicion en tu where que lo diferencio de otras posibles inserciones de parte de otros usuarios, ahora sobre la funcion mysql_insert_id() es buena mientras el campo autoincrementable no sea bigint, ya que ahi te devolvera id's incorrectos, saludos a todos...
__________________
"El Conocimiento es de todos, no solo de algunos"
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 20:13.