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 :

Formulaire conditionné [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Par défaut Formulaire conditionné
    Salut à tous et à toutes.

    je lance une nouveauté sur mon site, je veux que les users
    puissent donner leur avis sur la news du jour mais une seule
    fois.
    donc j'ai un formulaire, dont l'affichage est conditionné par la
    présence ou non en bdd d'une réponse, et l'attribut action
    est un bout de code php qui ne devrait s'éxécuter que si submit
    il y a.
    mon soucis est le suivant:
    il n'y a pas un seul enregistrement en bdd, je me connect, et paf,
    le formulaire n'apparait pas, et je me retrouve avec un enregistrement
    en bdd,(commentaire vide).
    voila le code si vous voyez où est le soucis.

    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
    17
    18
    19
     
    <?php $query = "SELECT `rep_user` FROM `news_dujour_rep` WHERE `rep_user` LIKE '".$_SESSION['login']."';";
    include('dbconnect.php'); //connection à la bdd aucun soucis
    $a = mysql_num_rows($result);
    if($a==0){ ?>  //si pas de réponse enregistrer on affiche le form
    <div style="width:100%;text-align:center;margin-top:20px;">
    <form method="post" action="<?php $rep_contenu = htmlentities($rep_contenu, ENT_QUOTES);
    $query = "INSERT INTO `news_dujour_rep` (`rep_date`, `rep_user`, `rep_contenu`) VALUE ( NOW(), '".$_SESSION['login']."', '".$rep_contenu."');";
    include('dbconnect.php');
    header("location: home.php"); // une fois la réponse poster on rafraichit la page
    exit;?>">
    <table align="center" style="width:50%;text-align:center;">
    <tr><td>Qu'en pensez-vous?</td></tr>
    <tr><td><textarea name="rep_contenu" cols="40" rows="6"></textarea></td></tr>
    <tr><td><input type="submit" value="Envoyer"></td></tr>
    </table>
    </form>
    </div>
    <?php } ?>

  2. #2
    Membre émérite
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Par défaut
    Rassure moi, tu n'exécutes pas ta requête dans ton fichier "dbconnect.php" quand même?
    Parce que vu le nom du fichier ça veut aussi dire que tu y connectes ton script à ta bdd. Donc là il y est deux fois, ça veut dire deux connexions au serveur pour un script... j'ai peur là.

    Ah au fait, tu fais fais ton insert dans le même scope que ton affichage de formulaire si rien n'existe. A mon avis ton problème est là.

    Ah au passage. Essaie de tout mettre en php, quitte à mettre quelques echo() avec du code HTML dedans, parce que là j'ai été obligé de le faire de mon côté pour réussir à lire ce que tu y fais.
    Je comprends que t'aies pas vu le problème directement du coup

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Par défaut
    excuse moi mais j'ai du mal à te comprendre.
    mon dbconnect fait la connection à la bdd,
    execute la query et ferme la connection. d'où le fait qu'il y en ait 2(puisque 2 query).

    Ah au fait, tu fais fais ton insert dans le même scope que ton affichage de formulaire si rien n'existe. A mon avis ton problème est là.
    je pige rien à cet partie.
    je fais un test en bdd, si la bdd est vide j'affiche le formulaire qui
    une fois submité, rempli la bdd. en théorie, puisqu'ici quand je lance
    la page le formulaire ne s'affiche pas et la bdd se rempli.(coment ???)

    Perso je préfère séparé de façon nette le php du html, je trouve
    cela plus clair à lire.

  4. #4
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    $rep_contenu << pas correct, c'est un formulaire...

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // LIGNE 12 : $rep_contenu = htmlentities($rep_contenu, ENT_QUOTES);
    // A corriger par :
    $rep_contenu = htmlentities($_POST["rep_contenu"], ENT_QUOTES);

    Mais à ta place, je mettrais un PHP_SELF dans l'action du formulaire et une petite condition en haut de page pour :
    1] vérifier si l'utilisateur a déjà posté (vu que dans ton cas on peut poster qu'une fois, il faut pouvoir dire de ne pas afficher le formulaire dans ce cas-là)
    2] avoir un code plus propre

  5. #5
    Membre émérite
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Par défaut
    Ok, je reformule:
    Citation Envoyé par warwill Voir le message
    excuse moi mais j'ai du mal à te comprendre.
    mon dbconnect fait la connection à la bdd,
    execute la query et ferme la connection. d'où le fait qu'il y en ait 2(puisque 2 query).
    L'idée c'est que justement, tu te connectes, tu exécutes la requêtes et tu fermes la connexion. Et ceci plusieurs fois dans un même script. Ce n'est pas vraiment l'idéal pour aider ton serveur et surtout ne pas le surcharger... A mon avis ce n'est pas une bonne idée. Mieux vaut un script initial qui te connectes, après dans ton code tu exécutes les requêtes sur la même connexion et seulement à la fin tu fermes cette connexion unique. Tu gagneras franchement en performance à mon avis.

    Citation Envoyé par warwill Voir le message
    je pige rien à cet partie.
    je fais un test en bdd, si la bdd est vide j'affiche le formulaire qui
    une fois submité, rempli la bdd. en théorie, puisqu'ici quand je lance
    la page le formulaire ne s'affiche pas et la bdd se rempli.(coment ???)
    C'était effectivement ton idée de départ. Mais regarde, la partie que j'ai mis en gras dans ton code.

    Code php : 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
    17
    18
    <?php $query = "SELECT `rep_user` FROM `news_dujour_rep` WHERE `rep_user` LIKE '".$_SESSION['login']."';";
    include('dbconnect.php'); //connection à la bdd aucun soucis
    $a = mysql_num_rows($result);
    if($a==0){ ?>  //si pas de réponse enregistrer on affiche le form
    <div style="width:100%;text-align:center;margin-top:20px;">
    <form method="post" action="<?php $rep_contenu = htmlentities($rep_contenu, ENT_QUOTES);
    $query = "INSERT INTO `news_dujour_rep` (`rep_date`, `rep_user`, `rep_contenu`) VALUE ( NOW(), '".$_SESSION['login']."', '".$rep_contenu."');";
    include('dbconnect.php');
    header("location: home.php"); // une fois la réponse poster on rafraichit la page
    exit;?>">
    <table align="center" style="width:50%;text-align:center;">
    <tr><td>Qu'en pensez-vous?</td></tr>
    <tr><td><textarea name="rep_contenu" cols="40" rows="6"></textarea></td></tr>
    <tr><td><input type="submit" value="Envoyer"></td></tr>
    </table>
    </form>
    </div>
    <?php } ?>
    Ton traitement pour afficher le formulaire est dans le même bloc d'accolades de ta condition que l'insertion (et donc la redirection), c'est ce qu'on appelle un scope. C'est de là que vient ton erreur. En gros, si $a==0, tu affiches le début de ton formulaire et en même temps tu insères en bdd... ce que tu ne cherches pas à faire d'après ce que j'ai compris.

    Explication simpliste du concept de scope:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(condition) {
    // scope 1
    }
    else
    {
    // scope 2
    }
    Tu vois mieux ce que c'est maintenant?

    Citation Envoyé par warwill Voir le message
    Perso je préfère séparé de façon nette le php du html, je trouve cela plus clair à lire.
    Je suis parfaitement d'accord avec cette idée, le problème c'est qu'ici ta séparation n'est pas super nette je trouve. Ce qui à mon avis ne t'aide pas à repérer l'erreur dans ton code.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Par défaut
    donc si je comprend bien...:
    comme j'ai mis en explicite l'action, et que le tout est dans un seul et même
    scope, lorsque j'affiche le form il s'execute tout seul, d'où mon soucis...?

    j'ai résolu mon probleme en reprennant la méthode classic,
    2 script.merci à vous pour votre patience et pour votre aide.

  7. #7
    Membre émérite
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Par défaut
    De rien.

    En fait pour faire simple, dans le script que tu nous as mis au début, tu faisais ça:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(// pas de réponse à enregistrer)
    {
    // afficher la balise form
    // faire un INSERT en bdd
    // faire une redirection php
    // afficher la fin du formulaire
    }
    Forcément, ça ne pouvait pas t'afficher le formulaire puisque tu redirigeais après avoir fait un enregistrement vide dans ta bdd.

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

Discussions similaires

  1. conditionner l'affichage d'une zone formulaire
    Par oliviervba dans le forum Word
    Réponses: 3
    Dernier message: 01/07/2010, 15h17
  2. Réponses: 2
    Dernier message: 21/10/2007, 13h26
  3. Conditionner l'envoi d'un formulaire ou pas
    Par david71 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/03/2007, 13h53
  4. Réponses: 3
    Dernier message: 08/08/2006, 16h49
  5. Réponses: 7
    Dernier message: 24/07/2006, 15h11

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