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 :

mysqli_insert_id() retourne 0 après un INSERT [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club Avatar de RinaBK
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2021
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2021
    Messages : 92
    Points : 64
    Points
    64
    Par défaut mysqli_insert_id() retourne 0 après un INSERT
    Bonjour tout le monde,

    Lorsque un membre poste un message sur la messagerie de mon site, mon code envoi un email aux autres membres afin de leur prévenir qu'un nouveau message a été envoyé. Dans cet email, les membres peuvent cliquer sur un lien qui doit les diriger directement depuis le nouveau message envoyé dans la messagerie. Pour cela, j'ai besoin du dernier numéro ID du dernier message afin que les membres soit directement redirigé sur ce dernier message. Donc, j'ai utilisé la fonction mysqli_insert_id() qui devrait normalement me retourner le numéro ID (AUTO_INCREMENT) qui me servira dans le lien dans l'email. Mais voilà que je peux faire tout ce que je veux, mysqli_insert_id() me retourne continuellement 0. Pourtant je n'ai pas d'autres requètes avant mon INSERT, alors je vous avoue que je ne comprends pas trop où est le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (mySqli_query(CON_DB,'INSERT INTO message VALUES ("AUTO_INCREMENT", '.$id_user.', CURRENT_TIMESTAMP, "'.$msg.'")')) {
    	$dernierMsg = mysqli_insert_id(CON_DB);
    	echo $dernierMsg;
    }
    Quelqu'un peut m'aider à comprendre ce qui ne va pas?
    • On dit que le ridicule ne tue pas; On dit aussi que ce qui nous tue pas, nous rends plus fort; Alors pourquoi ne pas dire : Le ridicule nous rends plus fort !
    • On reproche aux gens de parler d'eux-même; C'est pourtant le sujet qu'ils traitent le mieux !

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    après chaque requête INSERT, voyez-vous bien le nouvel enregistrement dans la table ? avec un identifiant différent des autres ?

  3. #3
    Membre du Club Avatar de RinaBK
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2021
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2021
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Oui, les enregistrements fonctionnent super !
    On peut voir les messages que j'ai envoyé comme test ICI au bas de la page.
    Tout fonctionne super bien, sauf mysqli_insert_id()

    Nom : db1.jpg
Affichages : 163
Taille : 53,5 Ko
    • On dit que le ridicule ne tue pas; On dit aussi que ce qui nous tue pas, nous rends plus fort; Alors pourquoi ne pas dire : Le ridicule nous rends plus fort !
    • On reproche aux gens de parler d'eux-même; C'est pourtant le sujet qu'ils traitent le mieux !

  4. #4
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 931
    Points
    931
    Par défaut
    Citation Envoyé par RinaBK Voir le message
    Tout fonctionne super bien, sauf mysqli_insert_id()
    Et si tu passes par une variable pour ta connexion, plutôt que par une constante ?
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  5. #5
    Membre du Club Avatar de RinaBK
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2021
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2021
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par Paraffine Voir le message
    Et si tu passes par une variable pour ta connexion, plutôt que par une constante ?
    Oh ! Désolée... En effet pour l'exemple j'ai mis une consente, mais en réalité c'est une fonction. Effectivement, pour mon exemple j'aurais du mettre : cddb()
    • On dit que le ridicule ne tue pas; On dit aussi que ce qui nous tue pas, nous rends plus fort; Alors pourquoi ne pas dire : Le ridicule nous rends plus fort !
    • On reproche aux gens de parler d'eux-même; C'est pourtant le sujet qu'ils traitent le mieux !

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Bonsoir,
    On est bien sur que id est primary key dans la table ?

  7. #7
    Membre du Club Avatar de RinaBK
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2021
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2021
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Oui, voici ma table :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE XXX_tutosmsg (
    	id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    	id_tuto BIGINT UNSIGNED NOT NULL,
    	id_mbr BIGINT UNSIGNED NOT NULL,
    	edate TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    	msg TEXT NOT NULL,
    	PRIMARY KEY (id)
    );
    • On dit que le ridicule ne tue pas; On dit aussi que ce qui nous tue pas, nous rends plus fort; Alors pourquoi ne pas dire : Le ridicule nous rends plus fort !
    • On reproche aux gens de parler d'eux-même; C'est pourtant le sujet qu'ils traitent le mieux !

  8. #8
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 931
    Points
    931
    Par défaut
    Citation Envoyé par RinaBK Voir le message
    Oh ! Désolée... En effet pour l'exemple j'ai mis une constante, mais en réalité c'est une fonction. Effectivement, pour mon exemple j'aurais du mettre : cddb()
    Puisque l'insertion fonctionne, que la colonne est bien une clé primaire avec un auto-incrément, j'ai l'impression qu'il ne reste plus que cette connexion à se mettre sous la dent ; quel est le code de ta fonction ?
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  9. #9
    Membre du Club Avatar de RinaBK
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2021
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2021
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par Paraffine Voir le message
    Puisque l'insertion fonctionne, que la colonne est bien une clé primaire avec un auto-incrément, j'ai l'impression qu'il ne reste plus que cette connexion à se mettre sous la dent ; quel est le code de ta fonction ?
    Une fonction des plus basique. La voici :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function cddb() {
    	$host = 'localhost';
    	$user = 'root';
    	$pass = '';
    	$base = 'gwanda';
    	$dbc = mySqli_connect($host,$user,$pass,$base);
    	return $dbc;
    }
    Je précise juste que je ne me connecte pas en localhost mais via mon serveur en ligne.
    • On dit que le ridicule ne tue pas; On dit aussi que ce qui nous tue pas, nous rends plus fort; Alors pourquoi ne pas dire : Le ridicule nous rends plus fort !
    • On reproche aux gens de parler d'eux-même; C'est pourtant le sujet qu'ils traitent le mieux !

  10. #10
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 931
    Points
    931
    Par défaut
    Bizarre, cela devrait bien réutiliser la connexion existante.
    As-tu essayé en stockant la connexion dans une variable pour ne pas refaire appel à la fonction entre les deux instructions ?
    Au cas où le mysqli_connect réinitialiserait le dernier id...
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  11. #11
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Citation Envoyé par Paraffine Voir le message
    s ?
    Au cas où le mysqli_connect réinitialiserait le dernier id...
    Je plussoie, si il a relecture à chaque fois, la connexion se ferme et se rouvre, donc on a surement deux connexions différentes.
    Comme le dit @Paraffine, essaye en mettant une fois la connexion dans une variable, ou réutilise la classe PDO que tu as mise en place dans un autre post.

  12. #12
    Membre du Club Avatar de RinaBK
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2021
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2021
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Effectivement, en mettant la connexion dans une variable mysqli_insert_id() renvoi le dernier ID inséré
    Mais là, je ne comprends pas trop... C'est simplement le fait de passer ma connexion via ma fonction qui pose ce problème??
    Bon, de toute façon, vais devoir réviser la totalité de mes pages pour passer en mode objet Mais tout de même, c'est assez intriguant de voir qu'une simple fonction de rien du tout peu empêcher le bon fonctionnement d'une fonction PHP Je suis sur les fesses pour rester polie

    En tout cas, merci à vous deux pour m'avoir aidé à trouver la cause de ce problème
    • On dit que le ridicule ne tue pas; On dit aussi que ce qui nous tue pas, nous rends plus fort; Alors pourquoi ne pas dire : Le ridicule nous rends plus fort !
    • On reproche aux gens de parler d'eux-même; C'est pourtant le sujet qu'ils traitent le mieux !

  13. #13
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 931
    Points
    931
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    (...) s'il y a relecture à chaque fois, la connexion se ferme et se rouvre, donc on a surement deux connexions différentes.
    Ouiiii, j'avais confondu avec mysql_connect, en plus, pour le coup de la réutilisation de la connexion ! Comme mysqli_connect est l'équivalent de mysqli::__construct() on est chocolat pour le dernier id...
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  14. #14
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Citation Envoyé par Paraffine Voir le message
    Ouiiii, j'avais confondu avec mysql_connect, en plus, pour le coup de la réutilisation de la connexion ! Comme mysqli_connect est l'équivalent de mysqli::__construct() on est chocolat pour le dernier id...
    @RinaBk pour que tu comprennes.

    Quand tu mets le résultat de ta fonction cddb() dans une variable et que tu ne touches plus à cette variable, alors le contenu ne bouge plus.
    Dans ton cas tu as une connexion à la db.

    Si à chaque fois que tu as besoin de ta db, tu réutilises ta fonction cddb(), alors tu crées d'office une nouvelle connexion (ce qui n'est pas grave en soi), mais du coup, tu perds la connexion précédente et toutes ses infos, notamment le dernier id , puisque celle-ci sera réinitialisée à chaque nouvelle connexion.

    Comprends-tu le principe ?

  15. #15
    Membre du Club Avatar de RinaBK
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2021
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2021
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    @RinaBk pour que tu comprennes.

    Quand tu mets le résultat de ta fonction cddb() dans une variable et que tu ne touches plus à cette variable, alors le contenu ne bouge plus.
    Dans ton cas tu as une connexion à la db.

    Si à chaque fois que tu as besoin de ta db, tu réutilises ta fonction cddb(), alors tu crées d'office une nouvelle connexion (ce qui n'est pas grave en soi), mais du coup, tu perds la connexion précédente et toutes ses infos, notamment le dernier id , puisque celle-ci sera réinitialisée à chaque nouvelle connexion.

    Comprends-tu le principe ?
    Effectivement, je comprends mieux maintenant, merci pour cette belle explication !
    Donc, il aurait été préférable de mettre, par exemple, l'appel à ma fonction sur le haut de ma page $ddb = cddb(); et d'utiliser pour chaque requête la variable $ddb. Comme cela, j'utiliserais la même connexion et j'éviterais donc ce genre de problème.
    • On dit que le ridicule ne tue pas; On dit aussi que ce qui nous tue pas, nous rends plus fort; Alors pourquoi ne pas dire : Le ridicule nous rends plus fort !
    • On reproche aux gens de parler d'eux-même; C'est pourtant le sujet qu'ils traitent le mieux !

  16. #16
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Citation Envoyé par RinaBK Voir le message
    Effectivement, je comprends mieux maintenant, merci pour cette belle explication !
    Donc, il aurait été préférable de mettre, par exemple, l'appel à ma fonction sur le haut de ma page $ddb = cddb(); et d'utiliser pour chaque requête la variable $ddb. Comme cela, j'utiliserais la même connexion et j'éviterais donc ce genre de problème.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/07/2005, 17h37
  2. Récupération de l'id après un Insert
    Par faayy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/04/2005, 11h57
  3. Redirect de la page après un insert/update/delete
    Par mchicoix dans le forum XMLRAD
    Réponses: 5
    Dernier message: 25/02/2005, 09h31
  4. Réponses: 9
    Dernier message: 07/09/2004, 11h12
  5. [IB6] mon serveur crash apres des insert en série...
    Par Rmotte dans le forum Débuter
    Réponses: 11
    Dernier message: 27/05/2004, 14h53

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