Re: [PHP-ES] alguien ha usado ... o s e fía de ... ( jueves de debate ;)
[email protected] (Juan Manuel Acuña Barrera)
| Newsgroups | php.general.es |
|---|---|
| Message-ID | <[email protected]> |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
El 23/06/2011, a las 13:28, Ricardo Martinez escribió:
> Hola lista!!!
>
> me gustaría saber, que pensáis de averiguar el id de un registro utilizando
> instrucciones tipo: *
>
> mysql_insert_id($link); * ( devuelve el último id introducido )
>
> Por ejemplo realizamos un insert
>
> $sql = "insert into ... "
> if(mysql_query($sql,$link) )
> {
> $id = mysql_insert_id($link)
> }
>
> en una aplicación multi-usuario, sería fiable ¿? , alguién tiene experiencia
> con este tipo de casos ¿?
>
> claro está que he intentado simplificar mucho el ejemplo anterior,
> actualmente, uso PDO.
>
> Pido vuestra opinión, porque pese a llevar muchos años programando en PHP,
> casi nunca he implementado estructuras de ese tipo, la razón desconfianza.
>
> Un saludo!!!
>
>
> --
> Ricardo
> _______________________________________________
> IT Architect
> website: http://www.pulsarinara.com
Hola, lo que preguntas se llama "condición de carrera", por lo de tener muchos usuarios simultáneamente. En mi humilde experiencia, esto se puede dar por dos situaciones: la primera, que tengas _realmente_ muchos usuarios y/o consultas simultáneas; y la segunda, cuando por alguna razón hay problemas de conexión entre tu aplicación y el mysql y entren "de golpe" muchas consultas/inserts.
Asumiendo que el "id" del que estás hablando es un auto-increment, en mi experiencia la solución que yo he aplicado y me ha funcionado bastante bien es:
1.- Crear un número pseudo-aleatorio grande (8 a 10 cifras).
2.- Incluirlo en el insert (se debe tener un campo preparado para esto (entero, not-null):
$sql = "insert into tabla values ('$valor1','$valor2',......,'$valorN','$numeroAleatorio') ";
3.- Recuperar el id, usando una consulta con los valores insertados:
$sql = "select id from tabla where (valor1='$valor1' AND valor2='$valor2' AND ..... valorN='$valorN' AND numeroAleatorio='$numeroAleatorio') order by id desc limit 1";
A reserva de lo que opinen otros compañeros de la lista, esta solución, aunque no es la más eficiente, si es una que me ha dado muy buenos resultados en materia de fiabilidad, al grado que te puedo decir que de muchos millones de inserts, nunca he tenido un problema en este sentido.
Quedo a la espera de sus comentarios.
Juan Manuel Acuña
PD me encanta la idea de "jueves de debate" :)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG/MacGPG2 v2.0.14 (Darwin)
iEYEARECAAYFAk4Dq18ACgkQTc4QiYN6hDdrPwCbBxdMMw1Cn+OY4QOpkOvVLz0b
lMEAn0rmOpjc9kKy/MQymf+KeaRO6JC9
=Z4hU
-----END PGP SIGNATURE-----