IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

problème fonction php avec LAST_INSERT_ID()


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Par défaut problème fonction php avec LAST_INSERT_ID()
    Bonsoir

    J'ai un problème . J'ai une fonction php lié à un formulaire d'enregistrement dans 2 tables d'une base mysql. Normalement j'utilise le LAST_INSERT_ID() pour récupérer le numèro autoincrement creer dans la première table, et ainsi l'insérer dans la seconde table. Cette astuce a bien fonctionné. Mais je me suis aperçu que si j 'ai un grand nombre de personnes qui s'enregistrent en même temps, il y a un gros problème. En effet le num attribué à la personne crée à ce moment la ne va pas à la bonne personne. Il recoit un autre num d'une personne qui s'est enregistrée en meme temps.

    fonction.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    require('connexion.php');
    //-----------------------------------
    $a=$_POST['nom'];
    $b=$_POST['prenom'];
    $c=$_POST['login'];
    $d=$_POST['pass'];
    //-----------------------------------
    $sql = "INSERT INTO inscrit(nom,prenom)VALUES('".$a."','".$b."')";
    $exec = mysql_query($sql);
    $sql _a= "INSERT INTO ident(login,mdp)VALUES(LAST_INSERT_ID(),'".$c."','".$d."')";
    $exec_a = mysql_query($sql_a);
    ?>
    avec cela si les personnes n'enregistrent pas au même moment, cela fonctionne. Mais si il y a plusieurs personnes qui s'enregistrent en même temps, la c'est c'est gros problème.

    J'avais pensé à une solution celle la mais elle ne fonctionne pas non plus.

    fonction.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
    require('connexion.php');
    //---------------------------------------------------
    $a=$_POST['nom'];
    $b=$_POST['prenom'];
    $c=$_POST['login'];
    $d=$_POST['pass'];
    $e=md5($d);
    //---------------------------------------------------
    $sql = "INSERT INTO inscrit(pass,nom,prenom)VALUES('"$e"','".$a."','".$b."')";
    $exec = mysql_query($sql);
    //-----Selection du num auto en fonction du pass-----
    $sql_a = "SELECT num_inscr FROM inscrit WHERE pass=".$e;
    $exec_a = mysql_query($sql_a);
    $res=mysql_fetch_object($exec_a);
    //---------------------------------------------------
    $sql _b= "INSERT INTO ident(num_inscr,login,mdp)VALUES('".$res->num_inscr."','".$c."','".$d."')";
    $exec_b = mysql_query($sql_b);
    ?>
    mais la non plus cela en fonctionne pas.

    Quelqu'un à une solution ?

  2. #2
    Membre éprouvé
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Par défaut
    Tu peux faire une requete intermetidere qui récupere tous les enregistrement, classé par ordre d'id desc, et dont le nom=$nom et le login=$login.

    Avec ca, tu devrais récuperer le bon id.

    --
    Rakken

  3. #3
    NoT
    NoT est déconnecté
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 237
    Par défaut
    Ca reglera pas le soucis,
    le mieux serait d'utiliser ce qu'on apelle les transactions.

    Enfin je ne peux pas m'empecher de me demander pourquoi tu passes par 2 tables différentes au lieu d'une seule ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 188
    Par défaut
    essaye peut etre comme ceci :
    1ere requete
    $ce_que_tu_dois_mettre_2eme_req = mysql_insert_id();
    2eme requete
    INSERT......VALUES( "$ce_que_tu_dois_mettre_2eme_req" ,...)


  5. #5
    NoT
    NoT est déconnecté
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 237
    Par défaut
    Ca règle rien non plus !

  6. #6
    Membre éprouvé
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Par défaut
    Ma proposition règle le problème dans la mesure ou la requête intermediaire qui remplace le LAST_INSERT_ID est beaucoup plus discriminante que "je veux le dernier id inséré".
    L'idée c'est de prendre "Le dernier id inséré qui *matche* avec la requête actuelle".
    Alors ok, statistiquement, on peut imaginer quelques cas foireux ou ma solution ne marche pas genre, deux personnes avec le même nom et le même prénom s'inscrivent au même moment, en ayant choisis le même login et le même pass...
    Mais c'est tellement peu probable qu'on peut largement considerer que ce cas là ne se produira pas.

    Après, si vraiment, t'as envie de sécuriser encore plus, tu peux rajouter un champ varchar dans ta table qui va contenir la concaténation d'un timestamp + une chaine aléatoire de 200 caractères, et a ta requete suivante tu récupere la derniere ligne valide matchant avec la chaine que tu viens d'inserer en plus des infos citée ci-dessus. Mais là, on sombre dans la paranoia.

    Pour les transactions... je ne m'en suis jamais servi que pour faire du rollback en cas d'erreur, je ne sais même pas s'il est possible de récuperer le dernier id inseré dans une table "dans la transaction en cours" (par contre, si c'est possible, ca m'interesse de savoir comment, ca peut clairement être utile, et j'admet que ce serait éventuellement plus propre que ma solution).

    --
    Rakken

Discussions similaires

  1. problème fonction mail() avec PHP 5.2 et IIS6
    Par Aliximo dans le forum IIS
    Réponses: 0
    Dernier message: 05/06/2008, 12h19
  2. problème fonction php avec connexion postgreSQL
    Par roblescriso dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/06/2008, 18h02
  3. Problème fonction random avec linux
    Par fabetvince dans le forum C
    Réponses: 12
    Dernier message: 25/05/2006, 23h45
  4. [PHP-JS] Problème exécution fonction php avec js
    Par cokilulu dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/03/2006, 21h34
  5. [PHP-JS] une fonction php avec parametres javascript
    Par kagura dans le forum Langage
    Réponses: 1
    Dernier message: 02/03/2006, 18h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo