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

SQL Procédural MySQL Discussion :

Deux requêtes simultanées avec mysql_query($req,$db)


Sujet :

SQL Procédural MySQL

  1. #1
    Membre actif Avatar de Nicomart
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 205
    Points : 210
    Points
    210
    Par défaut Deux requêtes simultanées avec mysql_query($req,$db)
    Bonjour à tous,

    j'ai un petit problème concernant la récupération du dernier id auto_increment d'une table. On m'a suggéré ici http://www.developpez.net/forums/sho...d.php?t=384059 d'utiliser la focntion last_insert_id.

    L'inconvénient de cette fonction est qu'elle doit être effectuée dans le même requête que l'insertion. En effet, si on exécute d'abord
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO matable (...) VALUES (...);"
    , puis on obtient last_insert_id =0. La solution consiste à exésuter dans la même requête SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO matable (...) VALUES (...);last_insert_id();"
    et là on récupère bien le nouvel identifiant. Testé sous phpmyadmin, ça marche.

    Le souci est que mysql_query semble perdre les pédales avec la double requête. Quand j'exécute ceci avec mysql_query, j'obtiens le message habituel :
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in monsite on line 78
    Auriez vous une solution alternative ?

    Merci

  2. #2
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 73

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 126
    Points
    126
    Par défaut
    Bonjour,
    je ne sais pas si cette solution peut vous convenir.


    1° la table qui mémorise l'id
    CREATE TABLE `memid` (
    `Table1` char(20) default NULL,
    `Id1` int(11) default NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1


    la table sur laquelle on a un champ autoincrement

    CREATE TABLE `matable` (
    `id` tinyint(4) unsigned NOT NULL auto_increment,
    `Champ1` int(4) default NULL,
    `Champ2` char(50) default NULL,
    `trois` char(10) default NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `zero` (`id`),
    UNIQUE KEY `id` (`id`),
    KEY `Deux` (`Champ2`)
    ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=latin1


    et un trigger
    delimiter //
    create trigger MyTrigger After INSERT on toto
    for each row
    Begin
    update `memid` set
    id1=new.id
    where table1=toto
    end//
    delimiter ;


    Après chaque insert dans matable il suffit de faire
    select id1 from memid where table1=matable

    Cordialement
    MS

  3. #3
    Membre actif Avatar de Nicomart
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 205
    Points : 210
    Points
    210
    Par défaut
    Cette solution semble intéressante entre-temps j'en ai trouvé une autre qui semble également fonctionner :

    En fait, la double-requête n'est pas possible avec mysql_query pour des raisons de sécurité (éviter le détournement de champs de saisie non protégés). J'ai trouvé cette info sur le manuel php.net

    En fait ma solution (trouvée sur un autre site dont j'ai déja perdu l'adresse, je n'ai rien inventé) consiste à verrouiller les tables en écriture pour toutes les autres transactions (pas de risque de concurrence d'écriture) à chaque insertion dans la base. On effectue l'insertion, puis un récupère le maximum de l'id dans la table où l'insertion vient d'être réalisée. On écrit cette valeur dans la table de stockage, puis on libère le lock :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mysql_query("LOCK TABLES art WRITE");
    $req = 'INSERT INTO matable (`cle`, `valeurs` ) VALUES (NULL, mesvaleurs);';
    mysql_query($req,$db);
    $result = mysql_query("SELECT MAX(`cle`) AS LAST_ID FROM matable");
    while ($row = mysql_fetch_array($result))
        $lastid = $row['LAST_ID'];
    $req = "UPDATE `lastinsert_ids` SET numero = ".$lastid." WHERE nom = 'leNom';";
    mysql_query($req,$db);
    mysql_query("UNLOCK TABLES");
    Finalement, ça équivaut à un trigger. En tout cas, merci de vous être penché sur mon problème.

  4. #4
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 201
    Points : 241
    Points
    241
    Par défaut
    utilise pluto mysql_insert_id()
    comme ceci...


    <?php
    $link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
    if (!$link) {
    die('Impossible de se connecter : ' . mysql_error());
    }
    mysql_select_db('mydb');

    mysql_query("INSERT INTO mytable (product) values ('kossu')");
    printf("Le dernier ID inséré dans est le id %d\n", mysql_insert_id());
    ?>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2005] Deux requêtes SQL avec un délai entre les deux
    Par janlouk dans le forum Développement
    Réponses: 4
    Dernier message: 31/12/2014, 15h10
  2. Réponses: 4
    Dernier message: 21/02/2010, 12h39
  3. [2.0] Deux requêtes avec les mêmes paramètres
    Par alband85 dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 07/07/2008, 19h28
  4. Réponses: 21
    Dernier message: 03/08/2007, 12h19
  5. Requête SELECT avec deux champs dans une colonne ??
    Par fredhali2000 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 08/06/2006, 10h41

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