Partage
  • Partager sur Facebook
  • Partager sur Twitter

Retourner le champ d'une entrée après création

Pour la création des topics d'un forum

Sujet résolu
    23 novembre 2010 à 21:27:19

    Bonjour,

    Pour l'ébauche de forum que je viens de concevoir, j'ai un petit problème concernant la création des sujets.
    Je prévois de créer une entrée par topic dans la table topics et dans la table posts lier les messages aux topics par l'id de ces derniers.

    Voilà le bout de code concerné (lorsque la page s'apprête à créer un topic et a y poster le premier message) :
    if (isset($_GET['act'])) { // pour l'instant la valeur du param get m'indiffère
    	$topicCreate = $db->prepare('INSERT INTO topics(name, autor, date) VALUES(?, ?, ?)');
    	$topicCreate->execute(array($_POST['topicName'], $_POST['pseudoTemp'], date()));
    	// je veux return id de l'entrée !!! $topicId
    	$topicCreate->closeCursor();
    	
    	$topicFirstPost = $db->prepare('INSERT INTO posts(topic, autor, message, date) VALUES(?, ?, ?, ?)');
    	$topicFirstPost->execute(array($topicId, $_POST['pseudoTemp'], $_POST['firstPost'], date()));
    	// il me faut l'id du topic que je viens de créer pour éviter d'avoir à faire une requête qui récupère l'entrée que je viens de créer !
    	
    	header('view_topic.php?id=' . $topicId);
    
    	// NOTE : ce code est une ébauche vite faite et contient trèèès certainement des erreurs.
    }
    


    Comme vous le voyez, lorsque je crée une entrée pour le nouveau topic, je n'ai aucun moyen de récupérer l'id de celui-ci (si vous pouvez me donner une solution j'en serai fort ravi).

    La seule possibilité serait de faire immédiatement après et avant la création du premier post de ce topic une requête qui récupère le dernier topic de l'auteur qui vient de poster... SELECT id FROM topics WHERE autor= $_POST['pseudoInput'] ODER BY date
    Et à ce moment je fais un fetch et je récupère le premier élément...

    Mais vous en conviendrez, c'est horriblement peu ergonomique, potentiellement sujet à bugs, etc etc...
    J'imaginais une requête de ce genre (qui remplacerait la première du code) : INSERT INTO topics(name, autor, date) VALUES(?, ?, ?) RETURN id .

    Je vous remercie d'avance de votre aide, c'est le seul blocage que j'ai rencontré pour l'instant !
    • Partager sur Facebook
    • Partager sur Twitter
      24 novembre 2010 à 0:01:57

      salut,

      apparemment tu utilises PDO, donc je ne peux que te renvoyer vers la doc

      PHP.NET

      immediatement après l'insert tu appelle cette fonction et ça te retourne le dernier id inséré, mais je te laisse voir des exemples par toi même...
      • Partager sur Facebook
      • Partager sur Twitter
        24 novembre 2010 à 13:37:40

        Ah merci à vous deux. ^^
        J'utilise en effet PDO.

        mastache, dans la page que tu me donnes je trouve cette ligne de code dans un exemple :
        // Issue a compound command, 2nd part outputs the inserted Id 
            $strQuery = 
            'INSERT INTO t1 (f1,f2) VALUES(v1,v2); SELECT @@IDENTITY AS mixLastId';
        


        Ici deux requêtes seront exécutées en même temps ?
        Il y aurait alors possibilité de faire les deux requêtes de la sorte : mauvaise idée.
        $topicCreate = $db->prepare('INSERT INTO topics(name, autor, date) VALUES(?, ?, ?)');
        $topicCreate->execute(array($_POST['topicName'], $_POST['pseudoTemp'], date()));
        
        $topicFirstPost = $db->prepare('INSERT INTO posts(topic, autor, message, date) VALUES(?, ?, ?, ?)');
        $topicFirstPost->execute(array($topicCreate->lastInsertId().ID, $_POST['pseudoTemp'], $_POST['firstPost'], date()));
        


        Je ne pense pas que ce soit bon... ($topicCreate->lastInsertId().ID .
        Voilà, je ne sais comment obtenir la valeur du champs ID de l'entrée $topicCreate->lastInsertId().
        Et dans les exemples je vois surtout des : $lastId = $dbh->lastInsertId();</code>, ou encore <minicode>echo 'Last inserted ID: ' $dbh->lastInsertId();
        • Partager sur Facebook
        • Partager sur Twitter
          24 novembre 2010 à 15:12:46

          Ah d'accord, c'est sur l'objet $db que j'exécute la méthode et non sur $topicCreate.

          Seulement dois-je faire $db->lastInsertId().ID dans ma requête ?

          Cette méthode retournerait-elle en fait ce champ ID ??
          • Partager sur Facebook
          • Partager sur Twitter
            24 novembre 2010 à 15:27:11

            Ah ok, la méthode détecte automatiquement le champ id qui s'incrémente...

            Je te remercie. ^^
            Je teste et si ça marche je met le sujet en "résolu".
            • Partager sur Facebook
            • Partager sur Twitter

            Retourner le champ d'une entrée après création

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown