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 :

INSERT rebond enregistre 2 fois [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 349
    Par défaut INSERT rebond enregistre 2 fois
    Hello,
    J'avais résolu ça il y a longtemps.
    Je ne retrouve pas !
    je fais une requete INSERT
    juste après la requete je fais une redirection HEADER (rapide donc)
    Et quoique j'essaie, j'ai 2 fois l'enregistrement dans la BDD ! !
    Euh, ça fait 3 H, je sature.
    Merci du coup de main

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Comment veux tu qu'on sache où se situe l'erreur si tu ne mets pas un bout de code ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 349
    Par défaut
    Tu as raison ...
    ma requête
    $sql="INSERT INTO annonces VALUES (NULL, now(), ' " .$annonce_titre. " ',' " .$annonce_contenu. " ',' " .$annonce_valide. " ',' " .$annonce_categorie. " ')";
    mysql_query($sql);
    header('location... je redirige
    je n'ai pas le problème à l'ouverture du PC.
    Mais il revient rapidement.
    vider le cache du navigateur ne change rien.

    J'ai testé un tuc trouvé sur Google
    $sql="INSERT SQL_NO_CACHE INTO annonces VALUES (NULL, now(), ' " .$annonce_titre. " ',' " .$annonce_contenu. " ',' " .$annonce_valide. " ',' " .$annonce_categorie. " ')";
    mysql_query($sql);
    Mais la requête ne s'enregistre pas (pas de message erreur)

    Au fait j'utilise Wamp

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Cela vient peut être de la condition qui initie ta requête... quelle est-elle ?

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql="INSERT INTO annonces VALUES (NULL, now(), ' " .$annonce_titre. " ',' " .$annonce_contenu. " ',' " .$annonce_valide. " ',' " .$annonce_categorie. " ')";
    mysql_query($sql);
    Fait attention, tu rajoutes des espaces (surement non volontairement) en en début et fin de chacune des 4 dernières données ($annonce_titre, etc ...).
    Par exemple :
    , '<-un espace au début ici ->" .$annonce_titre. "<-un espace à la fin ici ->',
    Ceci peu provoquer une erreur SQL dans le cas où une donnée doit être un nombre entier (un espace étant une chaine de caractère).


    As tu activé l'affichage des erreur de Php ? (display_errors du php.ini : à On)
    Pour les erreur de MySQL, mettre mysql.trace_mode du php.ini à On ou alors rajoute un mysql_error().
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query($sql) or die('Erreur : '.mysql_error());
    Puis tu peux t'aider à mieux comprendre le problème en faisant un minimum de ddébug, de rajouter toutes sorte d'info (provisoirement).
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    echo '<pre>';
    print_r($_GET);
    print_r($_POST);
    echo '</pre>';
     
    $sql = "INSERT INTO annonces VALUES (NULL, NOW(), '" .$annonce_titre. "', '" .$annonce_contenu. "', '" .$annonce_valide. "', '" .$annonce_categorie. "')";
    echo 'La requête : '.$sql.'<br />';
     
    mysql_query($sql) or die('Erreur : '.mysql_error());
     
    //header('Location: page.php'); // Mis en commentaire provisoirement
    exit();
    ?>

    Aussi, lors d'une insertion, je te conseils d'indiquer les champs dans la requête qui réclament des valeurs.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = "INSERT INTO annonces (une_date, titre, contenu, valide, categorie)
    VALUES (NOW(), '" .$annonce_titre. "', '" .$annonce_contenu. "', '" .$annonce_valide. "', '" .$annonce_categorie. "')";
    Si le 1er champ est la clé primaire et c'est un champ auto_increment, il n'est pas utile de le mettre parmi.


    Au passage, et vu que tu utilises les fonctions mysql_*, il faut protéger tes données de Bdd par mysql_real_escape_string() pour être échappées et pour éviter un éventuel SQL injection, si ce n'est pas fait.
    La doc : mysql_real_escape_string()

    Par ailleurs, il faut savoir que les fonctions mysql_* sont obsolètes et vouées à disparaitre. S'orienter vers PDO ou MySQLi serait à envisager.


    Fait le point sur tout cela.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 349
    Par défaut
    Je ne peux que te remercier pour ces longues explications.
    Mais ça ne répond pas à ma question d'origine : le fait que ma requête s'enregistre 2 fois.
    J'ai un peu avancé et je constate en ouvrant l'ordinateur que je passe 40 requêtes sans doublons !
    Ce n'était pas le cas hier soir, et je n'ai rien changé, la requête est la même.

    Alors je pense que j'ai un soucis de cache quelque part.
    - Cache du navigateur ? j'ai vidé hier le cache de FF plusieurs fois sans changement.
    - j'en viens à penser que c'est un problème de cache au niveau de Mysql (????)

    Si ça marche pour l'instant, je pense que le problème va réapparaitre sous peu...
    ------
    Pour le reste :
    mess espaces en trop, je vais corriger ça, je ne savais pas que ça pouvait poser problème.
    L'affichage erreur. Oui, j'ai négligé mais vu que mes requêtes passent... je vais gérer ça.
    La prog orientée objet ? Ah je sais je date un peu (59 ans !) et j'ai du mal à m'adapter. Ma priorité sera PHP, je n'utilise pas Mysql en production, c'est un choix. l'offre opensource répond généralement à mes besoins.
    --------
    Je vais mettre au propre en appliquant tes conseils.
    Je reviendrai ici si les doublons repointent le bout de leur nez !
    Tout cela fait partie d'exercices que je m'impose, je ne produit rien en Mysql
    Si le phénomène de rebond ou de doublons revient, je testerai sur mon serveur, je suis persuadé que le soucis est local.
    ---
    ça fait un moment que je cherche des cours sur la prog orientée objet (mysql compris).
    Je n'ai rien trouvé qui me convienne.

    Désolé pour l le roman.

    Merci du coup de main, je tiens au courant.
    Bon dimanche.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 349
    Par défaut
    Fin de journée...
    Plus d'enregistrements en double, ouf.
    J'ai appliqué le script proposé à la lettre.
    Je suppose que l'absence de doublons doit venir de exit

    Merci beaucoup

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Citation Envoyé par tremeur53 Voir le message
    Je suppose que l'absence de doublons doit venir de exit

    Merci beaucoup
    Je ne connais pas ton code en détail mais il faut toujours mettre un exit après un header de redirection, c'est d'ailleurs indiqué dans la doc :
    <?php
    header("Location: http://www.example.com/"); /* Redirection du navigateur */

    /* Assurez-vous que la suite du code ne soit pas exécutée une fois la redirection effectuée. */
    exit;
    ?>

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

Discussions similaires

  1. Insertion d'enregistrement dans un fichier XML
    Par davestar dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 02/04/2006, 17h22
  2. Réponses: 1
    Dernier message: 30/11/2005, 13h44
  3. insertion d'enregistrement avec MySQL Administrator
    Par Lady_jade dans le forum Outils
    Réponses: 1
    Dernier message: 08/09/2005, 16h04
  4. [DW MX2004] formulaire d'insertion d'enregistrement
    Par jiraya_sama dans le forum Dreamweaver
    Réponses: 2
    Dernier message: 30/12/2004, 17h54
  5. Sélectionner un même enregistrement deux fois...
    Par Manu0086 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 02/02/2004, 13h09

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