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

WinDev Discussion :

Récupérer le dernier Id Auto généré via ODBC [WD16]


Sujet :

WinDev

  1. #1
    Membre habitué Avatar de Romanops
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 278
    Points : 165
    Points
    165
    Par défaut Récupérer le dernier Id Auto généré via ODBC
    Bonjour à tous !

    Je travaille sur une application php qui attaque une base de données HyperFileSql (© PCSoft).

    En fait, à un moment, je dois ajouter un enregistrement dans une de mes tables dont l'identifiant est auto-incrémenté.

    Mon énoncé est le suivant : comment récupérer cet identifiant sachant qu'il peut y avoir environ 500 utilisateurs connectés en même temps ? D'après mes recherches, aucune instruction php ne permet de faire ça de la même manière que mysql_insert_id.

    J'ai donc essayé de trouver une solution alternative : la transaction.

    Premièrement (en théorie) : Dans une transaction, si je fais un ajout dans ma table, puis un select max(id), le contexte de la transaction fait que personne n'aura le même id, même si l’exécution est faite en simultanée, exact ? Si ce n'est pas le cas, autant que j'arrête tout de suite de travailler sur cette solution... Qu'en pensez-vous ?

    Deuxièmement (en pratique) : Lorsque je lance un début de transaction avec la commande php odbc_autocommit(self::$Connexion, false), il me renvoie vrai (signifiant donc qu'une transaction démarre).
    Ensuite, je fais un insert, puis un select max(id).
    Enfin, je lance la fin de transaction avec la commande odbc_commit(self::$Connexion);odbc_autocommit(self::$Connexion, true); (la deuxième instruction sert à remettre l'autocommit pour mes requêtes classiques).

    Jusque là tout va bien, l'enregistrement est bien créé et je récupère bien l'identifiant voulu. Seulement, étant tout seul à travailler sur l'application pour le moment, je ne peux voir pour le moment si la transaction s'exécute bien dans un contexte particulier donc pour tester cela, j'ai essayé de faire un odbc_rollback(self::$Connexion); pour voir si l'enregistrement ne se crée pas, comme il le devrait. C'est là qu'est mon problème, la ligne dans ma table a été créé, malgré le rollback (annulation des requêtes depuis le début de la transaction).
    Et franchement, je ne comprends pas pourquoi... Avez-vous une idée ?

    Merci d'avance !!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 280
    Points : 12 971
    Points
    12 971
    Par défaut
    Bonjour,
    Je ne pense pas que le Select max(id) fonctionne. En effet, si un autre utilisateur crée un enregistrement après toi et valide sa transaction avant toi, son enregistrement est visible dans ta transaction (en tout cas dans le mode d'isolation READ COMMITED). Donc tu récupèreras l'id d'un autre enregistrement.
    Avec MaxDb, la recupération du numéro se fait avec
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
     select Matable.currval from dual
    après insertion dans MaTable.

    Mais je ne sais pas si ça fonctionne avec HF...

    Tatayo.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    C'est bien pire que ça : les transactions sur HyperFileSQL ne sont pas isolées.

    Remarque : Les transactions suivent la norme SQL 92 "READ UNCOMMITED". Pour assurer la bonne cohérence de vos données, il est nécessaire de tenir compte de ce fonctionnement.
    http://doc.pcsoft.fr/fr-FR/?3044335&...s-hyperfilesql

    ODBC + HyperFileSQL

  4. #4
    Membre habitué Avatar de Romanops
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 278
    Points : 165
    Points
    165
    Par défaut
    Ok donc, si je comprends bien, il m'est impossible de récupérer l'id auto généré... En tout cas, pas en passant par une transaction !

    Comment dois-je procéder d'après vous ?

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    La seule façon est de demander au SGBDR la dernière valeur d'auto incrément utilisée telle un SELECT SCOPE_IDENTITY() pour SQL Server. La documentation des fonctions SQL indique l’existence d'un LAST_INSERT_ID sans plus de détail :

    http://doc.pcsoft.fr/fr-FR/?2034006&...ne-requete-sql

    Priez, testez et tenez nous au courant.

    Sinon, la solution que je propose souvent est d'utiliser un vrai SGBDR.

  6. #6
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    Citation Envoyé par Romanops Voir le message
    ...Dans une transaction, si je fais un ajout dans ma table, puis un select max(id), le contexte de la transaction fait que personne n'aura le même id, même si l’exécution est faite en simultanée, exact ? Si ce n'est pas le cas, autant que j'arrête tout de suite de travailler sur cette solution... Qu'en pensez-vous ?
    Malheureusement non ! Windev utilise le read uncommited c'est bien dommage parce que à ce moment là la transaction perd beaucoup de son intérêt.

  7. #7
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 379
    Points : 4 496
    Points
    4 496
    Par défaut
    Bonjour
    Citation Envoyé par vmolines Voir le message
    La documentation des fonctions SQL indique l’existence d'un LAST_INSERT_ID sans plus de détail
    Je viens d'essayer vite fait, cette syntaxe fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT LAST_INSERT_ID() FROM MONFICHIER LIMIT 1
    Sachant que SELECT LAST_INSERT_ID() tout seul ne fonctionne pas.
    Il semble qu'on soit obligé de spécifier un fichier qui ne sert à rien (et donc une clause LIMIT). La valeur retournée est bien le dernier ID auto quelque soit le fichier.

    Je ne suis pas allé plus loin mais j'ose espérer qu'il y a une autre syntaxe ...

  8. #8
    Membre habitué Avatar de Romanops
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 278
    Points : 165
    Points
    165
    Par défaut
    Bonjour et merci à tous pour vos réponses !

    Alors que j'allais mettre un message, je viens de voir celui de hpascal, précisant qu'il faut mettre le LIMIT 1, car en effet, cela ne fonctionne pas sans : j'avais testé en mettant le FROM et sans le FROM, mais ça ne fonctionnait pas ! Bref, maintenant, cela fonctionne bien ; en effet, je récupère bien le dernier Id Auto créé dans ma table.

    Petite question liée à ça : est-ce que je peux être sûr que l'id qui me sera renvoyé ne prendra pas en compte un id auto éventuellement généré par un autre utilisateur au même moment ? Autrement dit : suis-je certain qu'il récupérera l'id auto généré par le contexte et donc pas la dernière instruction INSERT que j'ai réalisé sur la connexion en cours ?

    Merci d'avance !

    PS: voici le code que j'ai mis, si quelqu'un tombe sur le problème un jour, il le retrouvera ainsi plus facilement ^^
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $v_Sql = "SELECT LAST_INSERT_ID() as Id
    FROM $v_NomTable
    LIMIT 1";
    $rs_Requete = odbc_exec(self::$Connexion,$v_Sql);
    if($rs_Requete!=false) {
      $t_Data = odbc_fetch_array($rs_Requete,1);
      $v_IdAuto = $t_Data['Id'];
    } else {
      $v_IdAuto = null;
      debug("Erreur de requête");
    }

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Citation Envoyé par hpascal Voir le message
    Bonjour

    Je viens d'essayer vite fait, cette syntaxe fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT LAST_INSERT_ID() FROM MONFICHIER LIMIT 1
    Sachant que SELECT LAST_INSERT_ID() tout seul ne fonctionne pas.
    Il semble qu'on soit obligé de spécifier un fichier qui ne sert à rien (et donc une clause LIMIT). La valeur retournée est bien le dernier ID auto quelque soit le fichier.

    Je ne suis pas allé plus loin mais j'ose espérer qu'il y a une autre syntaxe ...


    Citation Envoyé par Romanops Voir le message
    Bonjour et merci à tous pour vos réponses !

    Alors que j'allais mettre un message, je viens de voir celui de hpascal, précisant qu'il faut mettre le LIMIT 1, car en effet, cela ne fonctionne pas sans : j'avais testé en mettant le FROM et sans le FROM, mais ça ne fonctionnait pas ! Bref, maintenant, cela fonctionne bien ; en effet, je récupère bien le dernier Id Auto créé dans ma table.

    Petite question liée à ça : est-ce que je peux être sûr que l'id qui me sera renvoyé ne prendra pas en compte un id auto éventuellement généré par un autre utilisateur au même moment ? Autrement dit : suis-je certain qu'il récupérera l'id auto généré par le contexte et donc pas la dernière instruction INSERT que j'ai réalisé sur la connexion en cours ?

    Merci d'avance !

    PS: voici le code que j'ai mis, si quelqu'un tombe sur le problème un jour, il le retrouvera ainsi plus facilement ^^
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $v_Sql = "SELECT LAST_INSERT_ID() as Id
    FROM $v_NomTable
    LIMIT 1";
    $rs_Requete = odbc_exec(self::$Connexion,$v_Sql);
    if($rs_Requete!=false) {
      $t_Data = odbc_fetch_array($rs_Requete,1);
      $v_IdAuto = $t_Data['Id'];
    } else {
      $v_IdAuto = null;
      debug("Erreur de requête");
    }
    Faites un script PHP avec deux odbc_connect et le scénario que vous décrivez. Ca ne doit pas être bien sorcier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $connection1 = odbc_connect(...);
    $connection2 = odbc_connect(...);
     
    odbc_exec($connection1, "INSERT INTO .....");
    $rs = odbc_exec($connection1, "SELECT LAST_INSERT_ID() .....");
    //fetch, debug
    $rs = odbc_exec($connection2, "SELECT LAST_INSERT_ID() .....");
    //fetch, debug

  10. #10
    Membre habitué Avatar de Romanops
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 278
    Points : 165
    Points
    165
    Par défaut
    Bon, j'ai fais le test comme vous m'avez indiqué, hé bien cela ne fonctionne pas comme je voudrais.

    Voici le test :
    Code php : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    $t_Valeurs = parse_ini_file("config.ini");
    $v_DNS = $t_Valeurs["DNS"];
    $v_Utilisateur = $t_Valeurs["Utilisateur"];
    $v_Mdp = $t_Valeurs["Mdp"];
     
    $rs_Connexion1 = odbc_connect($v_DNS,$v_Utilisateur,$v_Mdp);
    $rs_Connexion2 = odbc_connect($v_DNS,$v_Utilisateur,$v_Mdp);
     
    $v_Sql1 = "INSERT INTO Base_Utilisateurs_Web
          (Nom)
        VALUES
          ('DELECAMBRER1')";
     
    $v_Sql2 = "INSERT INTO Base_Utilisateurs_Web
          (Nom)
        VALUES
          ('DELECAMBRER2')";
     
    $rs_Requete1 = odbc_exec($rs_Connexion1,$v_Sql1);
    $rs_Requete2 = odbc_exec($rs_Connexion2,$v_Sql2);
     
    $v_SqlSelect1 = "SELECT LAST_INSERT_ID() as Id
          FROM Base_Utilisateurs_Web
          LIMIT 1";
     
    $v_SqlSelect2 = "SELECT LAST_INSERT_ID() as Id
          FROM Base_Utilisateurs_Web
          LIMIT 1";
     
    $rs_RequeteSelect1 = odbc_exec($rs_Connexion1,$v_SqlSelect1);
    $rs_RequeteSelect2 = odbc_exec($rs_Connexion2,$v_SqlSelect2);
     
    $t_Data1 = odbc_fetch_array($rs_RequeteSelect1,0);
    $t_Data2 = odbc_fetch_array($rs_RequeteSelect2,0);
     
    print("t_Data1 ");
    print_r($t_Data1);
     
    print("t_Data2 ");
    print_r($t_Data2);

    Et voici le résultat :
    t_Data1 Array
    (
    [Id] => 32
    )
    t_Data2 Array
    (
    [Id] => 32
    )
    Il me renvoie le même résultat, il n'y a donc pas de "contexte" comme je l'aurais voulu...

    Citation Envoyé par vmolines
    Sinon, la solution que je propose souvent est d'utiliser un vrai SGBDR.
    Par expérience, je suis à 1000% d'accord avec vous, malheureusement je n'ai pas le choix

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Pouvez vous vérifier que les deux connexions ne sont pas les mêmes du fait de l'utilisation éventuelle du pooling de connexions ?

    Si oui désactivez le pooling et refaites des essais.

  12. #12
    Membre habitué Avatar de Romanops
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 278
    Points : 165
    Points
    165
    Par défaut
    Je viens de vérifier et, en effet, les deux connexions sont les même.

    Par contre, vous me parlez de pooling de connexion, ce qui est pour le moment un mystère pour moi car je ne connais pas ce mode de fonctionnement. J'ai entamé quelques recherches sur google, j'ai cru comprendre que c'était lié au php.ini. Pouvez-vous m'en dire plus ? Et si possible comment configurer pour désactiver le pooling, comme vous me l'avez indiqué ?

    Merci d'avance.

    PS: voici ce que j'ai au niveau d'ODBC lorsque je fais un phpinfo();
    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
    ODBC Support	enabled
    Active Persistent Links 	0
    Active Links 	0
    ODBC library 	Win32
     
    Directive	Local Value	Master Value
    odbc.allow_persistent	On	On
    odbc.check_persistent	On	On
    odbc.default_cursortype	Static cursor	Static cursor
    odbc.default_db	no value	no value
    odbc.default_pw	no value	no value
    odbc.default_user	no value	no value
    odbc.defaultbinmode	return as is	return as is
    odbc.defaultlrl	return up to 4096 bytes	return up to 4096 bytes
    odbc.max_links	Unlimited	Unlimited
    odbc.max_persistent	Unlimited	Unlimited

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    A la limite pour être sûr et faire simple, vous pouvez déclarer deux connexions ODBC sur votre système et utiliser les deux pour votre test. Au moins vous aurez deux chaînes de connexion différente et ça devrait éviter la réutilisation d'une même connexion pour vos deux requêtes.

  14. #14
    Membre habitué Avatar de Romanops
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 278
    Points : 165
    Points
    165
    Par défaut
    J'ai tenté à plusieurs reprise de déclarer un nouveau pilote ODBC pour HFCS, malheureusement, cela ne fonctionne pas... je n'ai aucun message d'erreur, mais à mon avis, c'est parce qu'il détecte que cette connexion existe déjà... (les joies de l'utilisation de Windev...)

    Donc j'ai pensé à autre chose : faire deux scripts php, un qui fait l'insert, puis attend une dizaine de secondes avant de faire le select, le temps que je lance le second, qui lui fait le insert puis le select dans la foulée. Qu'en pensez-vous ? ça pourrait fonctionner ?

    Je fais le test de ce pas !

  15. #15
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Désactivez odbc.allow_persistent pour voir si vous pouvez avoir deux connexions distinctes.

  16. #16
    Membre habitué Avatar de Romanops
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 278
    Points : 165
    Points
    165
    Par défaut
    Je viens de faire le test.

    Mon premier script (avec temporisation) :
    Code php : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    $t_Valeurs = parse_ini_file("config.ini");
    $v_DNS = $t_Valeurs["DNS"];
    $v_Utilisateur = $t_Valeurs["Utilisateur"];
    $v_Mdp = $t_Valeurs["Mdp"];
     
    $rs_Connexion1 = odbc_connect($v_DNS,$v_Utilisateur,$v_Mdp);
     
    print("rs_Connexion1 <br />");
    print_r($rs_Connexion1);
    print("<br />");
    print("<br />");
    $v_Sql1 = "INSERT INTO Base_Utilisateurs_Web
          (Nom)
        VALUES
          ('DELECAMBRER1')";
     
    $rs_Requete1 = odbc_exec($rs_Connexion1,$v_Sql1);
     
    sleep(10);
     
    $v_SqlSelect1 = "SELECT LAST_INSERT_ID() as Id
          FROM Base_Utilisateurs_Web
          LIMIT 1";
     
    $rs_RequeteSelect1 = odbc_exec($rs_Connexion1,$v_SqlSelect1);
     
    $t_Data1 = odbc_fetch_array($rs_RequeteSelect1,0);
     
    print("t_Data1 <br />");
    print_r($t_Data1);


    Mon deuxième script (le même mais sans temporisation) :
    Code php : 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
    21
    22
    23
    24
    25
    26
    27
    28
    $t_Valeurs = parse_ini_file("config.ini");
    $v_DNS = $t_Valeurs["DNS"];
    $v_Utilisateur = $t_Valeurs["Utilisateur"];
    $v_Mdp = $t_Valeurs["Mdp"];
     
    $rs_Connexion1 = odbc_connect($v_DNS,$v_Utilisateur,$v_Mdp);
     
    print("rs_Connexion1 <br />");
    print_r($rs_Connexion1);
    print("<br />");
    print("<br />");
    $v_Sql1 = "INSERT INTO Base_Utilisateurs_Web
          (Nom)
        VALUES
          ('DELECAMBRER1')";
     
    $rs_Requete1 = odbc_exec($rs_Connexion1,$v_Sql1);
     
    $v_SqlSelect1 = "SELECT LAST_INSERT_ID() as Id
          FROM Base_Utilisateurs_Web
          LIMIT 1";
     
    $rs_RequeteSelect1 = odbc_exec($rs_Connexion1,$v_SqlSelect1);
     
    $t_Data1 = odbc_fetch_array($rs_RequeteSelect1,0);
     
    print("t_Data1 <br />");
    print_r($t_Data1);

    D'après moi, les résultats ont l'air concluants. Le premier script renvoie bien l'id généré et le second le deuxième id généré, indépendamment donc !
    Citation Envoyé par premier script
    rs_Connexion1
    Resource id #2

    t_Data1
    Array ( [Id] => 37 )
    Citation Envoyé par deuxième script
    rs_Connexion1
    Resource id #2

    t_Data1
    Array ( [Id] => 38 )
    Pensez-vous que le résultat est concluant ?

    Si c'est le cas, mon problème est donc résolu !!

  17. #17
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Ca a l'air concluant en effet mais je ne m'explique pas l'utilisation d'une même connexion lorsque vous avez fait deux odbc_connect dans le même script

  18. #18
    Membre habitué Avatar de Romanops
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 278
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par vmolines
    mais je ne m'explique pas l'utilisation d'une même connexion lorsque vous avez fait deux odbc_connect dans le même script
    J'ai essayé de changer les paramètres du fichier php.ini pour désactiver la persistance des connexion odbc, mais sans succès, je n'ai pas les droits d'écritures dans le dossier IIS sur le serveur de mon entreprise. xD
    => Ça peut paraitre étonnant, mais je ne suis ici que depuis peu, et tout n'a pas été configuré comme je le voudrais par mon responsable et mal tombé, il n'est pas là ce matin :\

    J'essayerai de faire des tests cet après midi - après avoir reçu les droits à ce niveau - afin de répondre à votre interrogation, même si de mon côté, je n'ai pas besoin de ce genre de chose, puisque j'utilise toujours la même connexion, déclarée en static sur la classe bdd de mon projet.

    Merci encore pour votre aide ! Vous m'avez été d'un grand secours ! m(___)m

    Je vous tiens tout de même au courant dans l'après midi pour vous dire si ça fonctionne ou pas lorsque je retirerai la persistance que vous m'avez indiqué !

  19. #19
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Super merci.

    Pensez à tagger Résolu.

  20. #20
    Membre habitué Avatar de Romanops
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 278
    Points : 165
    Points
    165
    Par défaut
    Bonjour Vmolines !

    Désolé pour hier, mon responsable est rentré trop tard pour que je puisse faire les tests que je vous avais promis, cela dit, je ne vous ai pas oublié !

    Je viens de faire le test en désactivant la persistance : cela ne fonctionne toujours pas comme nous le souhaitions hier, lors d'un test avec deux connexions déclarées dans le même script !

    Code php : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?php
     
     
    $t_Valeurs = parse_ini_file("config.ini");
    $v_DNS = $t_Valeurs["DNS"];
    $v_Utilisateur = $t_Valeurs["Utilisateur"];
    $v_Mdp = $t_Valeurs["Mdp"];
     
    $rs_Connexion1 = odbc_connect($v_DNS,$v_Utilisateur,$v_Mdp);
    $rs_Connexion2 = odbc_connect($v_DNS,$v_Utilisateur,$v_Mdp);
     
    print("rs_Connexion1 <br />");
    print_r($rs_Connexion1);
    print("<br /><br />");
     
    print("rs_Connexion2 <br />");
    print_r($rs_Connexion2);
    print("<br /><br />");
     
    $v_Sql1 = "INSERT INTO Base_Utilisateurs_Web
          (Nom)
        VALUES
          ('DELECAMBRER1')";
     
    $v_Sql2 = "INSERT INTO Base_Utilisateurs_Web
          (Nom)
        VALUES
          ('DELECAMBRER2')";
     
    $rs_Requete1 = odbc_exec($rs_Connexion1,$v_Sql1);
    $rs_Requete2 = odbc_exec($rs_Connexion2,$v_Sql2);
     
    $v_SqlSelect1 = "SELECT LAST_INSERT_ID() as Id
          FROM Base_Utilisateurs_Web
          LIMIT 1";
     
    $v_SqlSelect2 = "SELECT LAST_INSERT_ID() as Id
          FROM Base_Utilisateurs_Web
          LIMIT 1";
     
    $rs_RequeteSelect1 = odbc_exec($rs_Connexion1,$v_SqlSelect1);
    $rs_RequeteSelect2 = odbc_exec($rs_Connexion2,$v_SqlSelect2);
     
    $t_Data1 = odbc_fetch_array($rs_RequeteSelect1,0);
    $t_Data2 = odbc_fetch_array($rs_RequeteSelect2,0);
     
    print("t_Data1 <br />");
    print_r($t_Data1);
    print("<br /><br />");
     
    print("t_Data2 <br />");
    print_r($t_Data2);
    print("<br /><br />");
     
     
    ?>

    Citation Envoyé par Le résultat
    rs_Connexion1
    Resource id #2

    rs_Connexion2
    Resource id #2

    t_Data1
    Array ( [Id] => 44 )

    t_Data2
    Array ( [Id] => 44 )
    J'espère avoir répondu à vos interrogations, même si le résultat n'a pas l'air d'être celui attendu

    bonne journée ! et n'hésitez pas ^^

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Etats & Requêtes] Récupérer le dernier auto incrément sur base SQL Server
    Par droliprane dans le forum WinDev
    Réponses: 6
    Dernier message: 25/05/2013, 16h16
  2. [AC-2007] Comment récupérer la valeur du dernier numéro auto inséré dans une table ?
    Par marot_r dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2010, 17h17
  3. Récupérer données dans Lotus Notes via ODBC/Talend
    Par tempsdescerises dans le forum Lotus Notes
    Réponses: 1
    Dernier message: 11/03/2010, 10h50
  4. Récupérer un entier auto-généré
    Par mavina dans le forum JDBC
    Réponses: 3
    Dernier message: 25/11/2008, 05h49
  5. Réponses: 6
    Dernier message: 25/04/2008, 10h29

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