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 :

fonction PHP pour une requête sql et afficher le dernier ID si je le met en argument de la fonction [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut fonction PHP pour une requête sql et afficher le dernier ID si je le met en argument de la fonction
    Bonjour la communauté.

    A l'appel de ma fonction insertIP() une inscription se fait pour stocker la date et le IP dans la bdd.
    A la 6e ligne, c'est pour afficher le dernier ID mais je veux pouvoir l'afficher que si j'en ai besoin.
    Il se pourrait bien que j'aie besoin de ce ID pour une commande select qui sera dans une autre
    fonction pour une requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function insertIP(){
        global $dbConn;
        $query = $dbConn->prepare("INSERT INTO flood(ip, ladate) VALUES(:ip, NOW())");
        $query->bindvalue(':ip', detectIP());
        $query->execute();
        return $dbConn->lastInsertId();
    }
    Ma question est en rapport avec la syntaxe à utiliser dans ma fonction et à son utilisation.
    Comment?

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    J'avoue ne pas comprendre le problème.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $dernierID = insertIP();

  3. #3
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Principalement ma fonction enregistre le IP et la date dans la base de données.
    En appelant insertIP(), c'est ce que ça va faire.

    Cependant, si je souhaite que le dernier ID soit affiché qui confirme l'enregistrement,
    c'est le rôle de ce bout de code mis tout de suite après la requête pour faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dbConn->lastInsertId();
    Comme j'ai mis à la suite de la requête Insert, il va s'afficher dès que je vais appeler
    ma fonction insertIP() et aussi insérer l'enregistrement.

    Ce que je souhaite, faire, c'est que ça soit optionnel l'affichage du dernier ID inséré.
    Mais que je puisse l'afficher. J'avais penser à l'appel via un argument comme ceci:
    insertIP(afficher)
    (en exemple pour illuster ma demande.)

    NOTE: je vais exprimer autrement:
    Si j'indique quelque chose en argument de la fonction, ça va afficher le retour de lastInsertId
    si non ne l'affiche pas.

    Citation Envoyé par badaze Voir le message
    J'avoue ne pas comprendre le problème.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $dernierID = insertIP();

  4. #4
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Mettre un echo ou print dans la fonction ne me semble pas très propre. En effet tu peux faire tes inserts à des "endroits" dans ton script où tu n'as pas forcément quelque chose à afficher. De plus avec cette façon tu ne sépares pas l'affichage de la manipulation des données.

  5. #5
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    La seule chose que j'ai trouvé par hasard par des tests, c'est ceci d'ajouter un echo:
    Mais, il peut arriver qu'on veuille ajouter des commandes dans une fonction sans vouloir
    les utiliser tout de suite comme c'est le cas avec ma fonction. Il se peut bien que je souhaite
    seulement effectuer l'enregistrement sans afficher le dernier ID entré.

    ci-haut, ça va afficher le dernier ID après avoir effectué l'enregistrement.

    Je ne considère pas ça comme une solution viable puisqu'il doit surement exister une autre
    solution pour les autres commandes.

    On parle souvent d'argument facultatif mais dans ma fonction, c'est une commande qui est
    facultative pas un argument à la fonction.

  6. #6
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Il serait alors souhaitable d'afficher le dernier ID en dehors de la fonction. Mais comment quand c'est LastInsertId?

  7. #7
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Tu sauvegardes la valeur.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $dernierID = insertIP();

  8. #8
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Au finale, ça ne fonctionne pas.
    J'arrive à enregistrer le IP et la date, mais pas afficher le dernierID.

    Peut-être que ça peut vous indiquer si je mets la source d'essai:
    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
    //---------------------------------------------
    // enregister le IP flood
    function insertIP(){
      global $dbConn;
        $query = $dbConn->prepare("INSERT INTO flood(ip, ladate) VALUES(:ip, NOW())");
        $query->bindvalue(':ip', detectIP());
        $query->execute();
        return $dbConn->lastInsertId();
    }
     
    include_once('config.php');
    insertIP();
     
    $dernierID = insertIP();
     
    echo $dernierID;

  9. #9
    Membre émérite
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 381
    Par défaut
    Et en supprimant la ligne 12 ?

    Cette ligne appelle la fonction mais sa valeur de retour est ignorée, si le echo affiche quelque chose, ce devrait être l'id créé par l'appel fait à la ligne 14 et pas celui créé par l'appel de la ligne 12.

  10. #10
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Bonjour xdelatour; entre les lignes 11 et 16, si j'écris la ligne 14, ça exécute la requête sans afficher le ID.

    En passant, l'insertion de la date via NOW(), j'ai remarqué que ce n'était pas nécessaire de l'ajouter avec INSERT
    puisque dans ma base de donnée, j'ai une commande SQL de mis pour la date directement dans le champ
    via DATE.

    Pour les fonctions PHP comme je voulais faire, je vais m'attarder à faire de quoi un peu plus «portable».
    Si quelqu'un a une idée où je pourrais plus avoir de l'information la dessus.


    Citation Envoyé par xdelatour Voir le message
    Et en supprimant la ligne 12 ?

    Cette ligne appelle la fonction mais sa valeur de retour est ignorée, si le echo affiche quelque chose, ce devrait être l'id créé par l'appel fait à la ligne 14 et pas celui créé par l'appel de la ligne 12.

  11. #11
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Au risque de me répéter afficher le dernier id dans la fonction qui fait l'insert est une fausse bonne idée.

  12. #12
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    Salut
    Badaze a totalement raison. Tu as encore un niveau ou tu ne t'apperçois pas qu'il existe deux types de fonctions/méthodes. Il y a celles qui travaillent (calculent, manipulent,...) et celle qui affichent.

    Apres faire plusieurs appel à lastInsertID() ça augmente le risque qu'une autre transaction ait fini une autre transaction et donc changé cet id (et là si ya des connexions persistantes...). Moi je suis partisant de la plus grande méfiance avec cette méthode. On l'appelle le plus vite possible apres l'insert et on stoque le retours dans une variable php.

    Vous remarquez que le manuel ne garantie pas que cette fonction est idempotente

  13. #13
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $test = insertIP();
    insertIP();
    echo insertIP();
    Les 3 va effectuer l'enregistrement.
    Le dernier va l'afficher en plus.

    Ça va être embêtant si je veux conserver un peu plus loin la variable $test ou faire un echo sur insertIP sans effectuer l'enregistrement.

    Comme dans le cas suivant:

    J'insert le IP et la date et un peu plus loin, je récupère le ID qui a fait l'objet de l'enregistrement.

  14. #14
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Je ne comprends pas ton souci. Tu sauvegardes le résultat de insertIP() dans une variable et tu utilises cette variable quand tu en as besoin si tu en as besoin. Si tu en fais un echo tu auras toujours le dernier id inséré sauf si tu le fais avant le premier appel à inserIP().

  15. #15
    Membre émérite
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 381
    Par défaut
    Est-ce-que le code suivant répond à la problématique ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function insertIP($flag=null){
        global $dbConn;
        $query = $dbConn->prepare("INSERT INTO flood(ip, ladate) VALUES(:ip, NOW())");
        $query->bindvalue(':ip', detectIP());
        $query->execute();
        if ($flag == "afficher")  
                     echo $dbConn->lastInsertId(); 
        return $dbConn->lastInsertId();
    }
     
    insertIP();
    insertIP("afficher");
    Par contre, l'insertion se fait à chaque appel de la fonction, dans tous les cas et l'ID créé est renvoyé, seul l'affichage dépendra de la présence ou non de l'argument lors de l'appel.

  16. #16
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Oui je comprends.

    Ayant vu les fonctions, je regarde maintenant du côté des objets pour tenter de faire mieux dans la portée
    des requêtes. ici. Mais, je maitrise pas totalement le sujet un coup extentié. Je marque résolu.

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

Discussions similaires

  1. [PostgreSQL] Utiliser une fonction PHP dans une requête SQL
    Par Toiine dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/11/2014, 12h16
  2. problème de syntaxe delphi pour une requête sql
    Par socooooool dans le forum Bases de données
    Réponses: 12
    Dernier message: 07/07/2006, 16h53
  3. Besoin d'aide pour une requête SQL
    Par Borami dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2005, 10h33
  4. Réponses: 3
    Dernier message: 18/06/2005, 00h31
  5. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56

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