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 :

Insertion d'une comparaison avant itération dans boucle foreach


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2018
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2018
    Messages : 25
    Points : 16
    Points
    16
    Par défaut Insertion d'une comparaison avant itération dans boucle foreach
    Bonjour ,

    Je sollicite votre aide car je dois complexifier un script php avec une requête sql .

    Je vous mets le code et les explications en dessous

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    <?php
        if (!empty($_POST))
        {
     
     
            include 'bsd.php';
            include 'index.php';
            $date = $_POST['date'];
            $activiteComment = " ";
            $encadrant = $_SESSION['Prenom'];
            $activite = $_POST['activite'];
            $eleve = $_POST['elevesValidatActi'];
            $req = $bdd->prepare('INSERT INTO activitedone(activiteNom , datework , eleveNom) VALUES(:activiteNom , :datework , :eleveNom)');
     
            $req->execute(array(
                    'activiteNom' => $activite,
                    'datework'=> $date,
                    'eleveNom' => $eleve
     
        ));
     
     
     
            $requete = "SELECT activiteAttente1,activiteAttente2,activiteAttente3,activiteAttente4,activiteAttente5,activiteAttente6,activiteAttente7,activiteAttente8,activiteAttente9,activiteAttente10 FROM activite WHERE activiteNom = :activite";
            $stmt = $bdd ->prepare($requete);
            $stmt->bindValue('activite',$_POST['activite']);
            $stmt->execute();
            $dataActiviteAttente = $stmt->fetch(PDO::FETCH_ASSOC);
            $stmt->closeCursor();
     
            $avancement = $bdd->query("SELECT * FROM attenteswork WHERE attentesNom = 'activiteAttente1' AND eleveNom = '$eleve'");
            $donnees = $avancement->fetch();
            // Voici mon probleme
            if (empty($donnees)){
            $essai = "1";
             }else
            {
            $essai = $donnees['essai'] + '1';
            }
     
     
            $stmt = $bdd->prepare('INSERT INTO attenteswork(eleveNom, attentesNom, essai, datework , comments , encadrant , activiteID) VALUES(:eleves, :attentes,:essai ,:datework ,:comments ,:encadrant ,:activiteID)');
     
            //Maintenant on boucle sur les résultats:
            foreach ($dataActiviteAttente AS $activiteAttente)
            {
                $stmt->execute(array(
                    'eleves' => $_POST['elevesValidatActi'],
                    'attentes' => $activiteAttente,
                    'essai' => $essai,
                    'datework' => $date,
                    'comments' =>  $activiteComment,
                    'encadrant' => $encadrant,
                    'activiteID' => $_POST['activite'],
                    ));
            $avancement->closeCursor();
                if ($stmt->rowCount() != 1) 
                {
                    echo 'Erreur insertion : '.$_POST['elevesValidatActi'].' / '.$activiteAttente.' / '.$date;
                }
            }
     
            include 'footer.php';
            echo '<script>alert("L\'\activité a bien été validée !");
            document.location.href="validation2.php";
            </script>';
     
        } 
     
        else {
            echo 'Formulaire vide';
        }
    Ce script se compose de deux parties :

    La première est l'insertion de l’activité dans une table activitedone avec les différents renseignements dont j'ai besoin ( Aucun problème de fonctionnement )
    La deuxième partie est l'insertion du détail de l'activité dans une table attenteswork , sachant que chaque activité que je rentre peut avoir entre 1 à 10 attentes ( représenter par les activiteAttente 1 , 2 ... )
    A l'heure actuelle , quand je valide ce script , la première partie fonctionne et la deuxième m'insère chaque activiteAttente dans cette table .

    Seulement voilà , c'est pas bon

    Il y a une variable $essai auquel je souhaiterais donner une valeur progressive , je m'explique :

    Quand je valide une activiteAttente , je souhaiterais que sa valeur $essai augmente par rapport à la valeur la plus haute enregistré pour son nom dans la table attenteswork ( Je ne sais pas si je suis clair ) et ce pour chaque activiteAttente(1,2,3 ... ) que j'insère via la boucle foreach .

    J'avais pensé à un update seulement voila , je dois garder toutes les attentes que je valide et je ne peux pas en avoir juste une dans la table avec une valeur qui s’incrémente ( Il s'agit d'un suivi d'enseignement )
    J'ai également pu trouver une requête sql Max() que je n'ai pas tester .
    La partie ci-dessous présente dans le code ci-dessus est un test que j'avais fait , mais qui ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            $avancement = $bdd->query("SELECT * FROM attenteswork WHERE attentesNom = 'activiteAttente1' AND eleveNom = '$eleve'");
            $donnees = $avancement->fetch();
            // Voici mon probleme
            if (empty($donnees)){
            $essai = "1";
             }else
            {
            $essai = $donnees['essai'] + '1';
            }

    Si quelqu'un peut me donner une solution ou du moins m’aiguiller sur la piste , ce serait génial !

    Merci d'avance !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- A partir du moment où tu écris toi-même :
    ...( Je ne sais pas si je suis clair )...
    Tu te doutes bien que "non, tu n'es pas clair".

    2- Et "c'est pas bon" n'aide pas non plus...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2018
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2018
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    1- A partir du moment où tu écris toi-même :
    ...
    Tu te doutes bien que "non, tu n'es pas clair".
    Je vais essayer de reformuler plus clairement .

    Mes attentes sont triées dans une table avec comme critères essai , nom etc ... ( J'énumère juste les deux là pour pas rajouter du superflu )
    Quand je valide une activité composée d'attente , ces attentes sont insérées dans la table avec une date indiquée par l'utilisateur .
    Chaque attente doit être conservée individuellement dans la BDD .
    Exemple :

    • Fait du vélo le 12/03/2019 Coordination (Essai 1)
    • Test d'équilibre le 13/03/2019 Coordination ( Essai 1 )
    • Fait du vélo le 14/03/2019 Coordination ( Essai 2 )
    • Accrobranche le 14/03/2019 Coordination ( Essai 1 )
    • Test d'équilibre le 17/03/2019 Coordination ( Essai 2 )


    Si une attente a déjà été validée par le passé , celle - ci ( Et c'est justement mon problème ) devrait avoir une valeur d'essai qui ne serait pas un mais essai ++ par rapport à la plus haute valeur présente à son nom dans la BDD .
    Et je voudrais que dans la boucle de mes insertions d'attentes , pour chaque attente qui s’insère un comparatif soit établit :

    Est ce présent oui , non ?
    • Si oui -> Prendre valeur Max associé au nom dans la table -> définir $essai = Valeur Max ++
    • Si non -> $ essai = '1'


    2- Et "c'est pas bon" n'aide pas non plus...
    C'est juste une expression , ça ne fait rien avancer on est bien d'accord !
    J'ai essayé de détailler si ca parle mieux

    Merci d'avance

  4. #4
    Invité
    Invité(e)
    Par défaut
    OK.
    C'est toujours plus clair avec un exemple

    1- Déjà, il faut faire la recherche du "MAX" DANS la boucle, à chaque tour.
    2- Il faut utiliser une requête préparée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            $avancement = $bdd->prepare("SELECT MAX(essai) AS essaiMAX FROM attenteswork WHERE attentesNom = 'activiteAttente1' AND eleveNom = :eleve");
            $avancement->execute(array( ':eleve' => $eleve ));
    • Par contre, je ne vois pas à quoi correspond 'activiteAttente1' * dans cette requête ?
    • Et je suppose que $activiteAttente vaut "Fait du vélo", "Test d'équilibre", ... ?

    Un EXTRAIT (significatif) des tables SQL serait bienvenu.


    * D'autant que tu parles plus haut de activiteAttente1, activiteAttente2,... activiteAttente10.
    Je ne suis pas persuadé que tes tables soient idéalement conçues.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2018
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2018
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Alors dans ma table attenteswork , les différents champs sont :

    progressionID ( Ma clé primaire ) Int
    eleveNom ( Varchar )
    attentesNom ( text )
    essai ( int )
    datework ( date )
    comments ( text )
    encadrant ( varchar )
    activiteID ( text )

    Quand aux activites dans ma table activite :

    activiteID ( Clé Primaire )
    activiteNom ( varchar )
    activiteAttente1 à 10 ( text )
    activiteComment ( text )
    activiteLevel ( int )

    Je me doute bien que la table ne doit pas être optimisé . Au départ du projet , je n'avais que 3 champs d'activiteAttente donc c'était gérable mais la je suis passé à 10 et du coup j'ai gardé ( à tort ? ) la même structure de table .

    Dans l'exemple que j'avais fait , j'essayais un test juste sur la première valeur de mon activité mais il faudrait que cela soit une requête préparée sur chaque activiteAttente et pas seulement sur la première ...
    Quel paramètre je pourrais mettre dans ma requête à la place de activiteAttente 1 pour qu'elle itère chaque activiteAttente jusqu’à 10 avec la requête Max () ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2018
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2018
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Petit UP

    J'ai essayé de cette manière mais je n'arrive toujours pas à faire comparer/itérer la variable 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
            $requete = "SELECT activiteAttente1,activiteAttente2,activiteAttente3,activiteAttente4,activiteAttente5,activiteAttente6,activiteAttente7,activiteAttente8,activiteAttente9,activiteAttente10 FROM activite WHERE activiteNom = :activite";
            $stmt = $bdd ->prepare($requete);
            $stmt->bindValue('activite',$_POST['activite']);
            $stmt->execute();
            $dataActiviteAttente = $stmt->fetch(PDO::FETCH_ASSOC);
            $stmt->closeCursor();
     
     
            $stmt = $bdd->prepare('INSERT INTO attenteswork(eleveNom, attentesNom, essai, datework , comments , encadrant , activiteID) VALUES(:eleves, :attentes,:essai ,:datework ,:comments ,:encadrant ,:activiteID)');
     
            //Maintenant on boucle sur les résultats:
            foreach ($dataActiviteAttente AS $activiteAttente)
            {
                $essai = " ";
                $req = $bdd->prepare('SELECT MAX(essai) FROM attenteswork WHERE attentesNom = ? AND eleveNom = ?');
                $req->execute(array($activiteAttente, $eleve));
                $donnees = $req->fetch();
                $essai = $donnees['essai'];
                ++$essai;
     
     
                $req->closeCursor();
     
                $stmt->execute(array(
                    'eleves' => $_POST['elevesValidatActi'],
                    'attentes' => $activiteAttente,
                    'essai' => $essai,
                    'datework' => $date,
                    'comments' =>  $activiteComment,
                    'encadrant' => $encadrant,
                    'activiteID' => $_POST['activite'],
                    ));
    Si je donne une valeur à $essai en le définissant simplement ( $essai = "3" par exemple ) , j'ai bien toutes mes attentes qui ont la valeur 3 , je pense que cela vient de ma req Select Max et de ma redéfinition de la variable $essai ...

    Si quelqu'un à une solution , je suis preneur !!

    Merci d'avanc e

Discussions similaires

  1. Insertion d'une fenêtre de code dans un post
    Par Momo46 dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 4
    Dernier message: 18/11/2006, 22h23
  2. erreur pour une insertion d'une chaine de caractere dans une cellule
    Par amel95140 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/10/2006, 09h09
  3. [MFC] Insertion d'une chaine de caractère dans une BD
    Par julien.nasser dans le forum MFC
    Réponses: 2
    Dernier message: 20/04/2006, 15h19
  4. [HTML] Problème insertion d'une image de fond dans cellule
    Par LE NEINDRE dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 31/03/2006, 11h56
  5. Réponses: 7
    Dernier message: 14/12/2005, 09h53

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