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 :

combinaison de mysqli_fetch_assoc et if [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é
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Par défaut combinaison de mysqli_fetch_assoc et if
    Bonjour.
    Je suis parti d'un problème simple.
    Je souhaite afficher une table de ma bdd mais en choisissant dans quel ordre et dans quelles cellules de mon tableau.

    La première ligne est OK.
    La seconde n'affiche pas le premier $Valeur['somme'].
    Les troisième et quatrième lignes ne sont pas affichées.

    Merci pour l'aide que vous pourrez m'apporter.

    J'ai un problème pour combiner mes if avec le while :
    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
    echo '<tr>';		
    echo '<td>Vélo</td>';			
    $Valeur = mysqli_fetch_assoc($resultat);
    $somme = 1;
    while($Valeur = mysqli_fetch_assoc($resultat))
     
    	IF ($Valeur['id'] >=1 && $Valeur['id'] < 14)
    	{
    		$S = "S".$somme;
    		$$S = $Valeur['somme'];
    		//echo $S;
    		echo '<td>'.$$S.'</td>';
    		$somme = $somme + 1;
    	}
    echo '</tr>';

    Script complet :
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    <?php
    require_once '/../CONFIG/constantes.php';
    require_once MYSQL2;
     
     
    /**
     * Génère un tableau à partir d'une requête
     * @param string $query Requête SQL
     * @param mixed $link Lien mysqli
     * @return array Tableau résultat
     */
     
    //Debut fonction requete select
    function resultats($annee){
     
    $req = 'SELECT * FROM '.$annee.'resultats ORDER BY id;';
     
    $db_link = connect(); 
     
    // Envoi de la requête
    $resultat=mysqli_query($db_link,$req) or die(mysqli_error($db_link));
     
    //affichage des données
    echo '<table id="resultat">';
    echo '<tr>';
    echo'<td>'.$annee.'</td>';			
    For ($i=1;$i<13;$i++)
    {
    	echo'<td>'.$i.'</td>';	
    }
    	echo'<td>totaux</td>';	
     
    echo '<tr>';		
    echo '<td>Vélo</td>';			
    $Valeur = mysqli_fetch_assoc($resultat);
    $somme = 1;
    while($Valeur = mysqli_fetch_assoc($resultat))
     
    	IF ($Valeur['id'] >=1 && $Valeur['id'] < 14)
    	{
    		$S = "S".$somme;
    		$$S = $Valeur['somme'];
    		//echo $S;
    		echo '<td>'.$$S.'</td>';
    		$somme = $somme + 1;
    	}
    echo '</tr>';	
     
    echo '<tr>';		
    echo '<td>CaP</td>';
     
    	IF ($Valeur['id'] >=13 && $Valeur['id'] < 27)
    	{
    		$S = "S".$somme;
    		$$S = $Valeur['somme'];
    		//echo $S;
    		echo '<td>'.$$S.'</td>';
    		$somme = $somme + 1;
    	}
    echo '</tr>';		
     
    echo '<tr>';		
    echo '<td>Natation</td>';
     
    	IF ($Valeur['id'] >=27 && $Valeur['id'] < 39)
    	{
    		$S = "S".$somme;
    		$$S = $Valeur['somme'];
    		//echo $S;
    		echo '<td>'.$$S.'</td>';
    		$somme = $somme + 1;
    	}
     
     
    echo '</tr>';
     
    echo '</table>';
    echo "\n";
     
    // Déconnexion
    disconnect();
     } 
    //Fin fonction requete select

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Pourrais-tu expliciter le résultat que tu veux obtenir ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $Valeur = mysqli_fetch_assoc($resultat);
    $somme = 1;
    while($Valeur = mysqli_fetch_assoc($resultat))
    va faire que tu vas perdre l'information de la 1ere ligne du résultat de la requête, puisque tu lis cette information, tu n'en fais rien, puis tu lis les autres lignes en boucle...
    Et il te manque les accolades liées au while. Du coup, seule la 1ere instruction juste après le while est exécutée en boucle. Le reste s'effectue une seule fois en utilisant la dernière valeur affectée à $Valeur (donc la dernière ligne retournée par ta requête)

    Revoie tes indentations et tes accolades.

    Au passage, ça nous faciliterait grandement le travail si tu nous donnais la structure de ta base et, comme l'a demandé Sab', un aperçu de ce que tu cherches à avoir et de ce que tu obtiens actuellement.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Par défaut
    Bonjour.

    Je vais essayer de préciser ce que je souhaite faire
    en espérant être plus clair.

    Nom : resultats.PNG
Affichages : 155
Taille : 5,9 Ko

    La deuxième ligne n'affiche pas la première valeur (les 12 valeurs affichées devraient être décalées vers la droite. La valeur de la Vélo, 1 n'est pas celle affichée)
    Les lignes 3 et 4 ne sont pas affichées pour la raison qu'explique Célira.

    Ma table :
    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
    74
    -- phpMyAdmin SQL Dump
    -- version 3.5.8.1
    -- http://www.phpmyadmin.net
    --
    -- Client: 127.0.0.1
    -- Généré le: Lun 02 Octobre 2017 à 17:18
    -- Version du serveur: 5.6.11-log
    -- Version de PHP: 5.4.14
     
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
     
    --
    -- Base de données: `touslesport.v2`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `2017resultats`
    --
     
    DROP TABLE IF EXISTS `2017resultats`;
    CREATE TABLE IF NOT EXISTS `2017resultats` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `sport` varchar(10) NOT NULL DEFAULT '0',
      `mois` int(2) NOT NULL DEFAULT '0',
      `somme` int(6) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=40 ;
     
    --
    -- Contenu de la table `2017resultats`
    --
     
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(1, 'V', 1, 210);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(2, 'V', 2, 154);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(3, 'V', 3, 210);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(4, 'V', 4, 154);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(5, 'V', 5, 147);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(6, 'V', 6, 112);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(7, 'V', 7, 182);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(8, 'V', 8, 42);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(9, 'V', 9, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(10, 'V', 10, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(11, 'V', 11, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(12, 'V', 12, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(13, 'V', 13, 1211);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(14, 'C', 1, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(15, 'C', 2, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(16, 'C', 3, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(17, 'C', 4, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(18, 'C', 5, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(19, 'C', 6, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(20, 'C', 7, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(21, 'C', 8, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(22, 'C', 9, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(23, 'C', 10, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(24, 'C', 11, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(25, 'C', 12, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(26, 'C', 13, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(27, 'N', 1, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(28, 'N', 2, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(29, 'N', 3, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(30, 'N', 4, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(31, 'N', 5, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(32, 'N', 6, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(33, 'N', 7, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(34, 'N', 8, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(35, 'N', 9, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(36, 'N', 10, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(37, 'N', 11, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(38, 'N', 12, 0);
    INSERT INTO `2017resultats` (`id`, `sport`, `mois`, `somme`) VALUES(39, 'N', 13, 0);

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Le code de l'enfer
    Les id de la base de données ne doivent pas être utilisés en dur dans le code PHP. Les ids sont des nombres neutres qui servent seulement a identifier une ligne, mais pas sa position ni les données.
    De plus imagine que tu ajoutes un sport, tu vas devoir modifier le code PHP. Et si tu as 200 sports tu vas mettre 2 boucles les unes à la suite des autres ?

    La règle c'est toujours de faire simple.
    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
     
    // on lit toute la table, le tri n'est pas utile
    $req = 'SELECT * FROM '.$annee.'resultats;';
     
    while($row = mysqli_fetch_assoc($resultat)) {
       // on classe les lignes par sport et par mois dans un tableau PHP :
       $data[$row['sport']][$row['mois']] = $row['somme'];
    }
     
    //ici ça serait mieux que les sports viennent d'une table dans la base de données mais bon
    $arSport = array('V'=>'Vélo', 'N'=>'Natation');
     
    // on lit notre tableau PHP bien rangé 
    foreach ($data as $sport=>$month_values) {
        $total = 0;
        echo '<tr>
                       <td>' . $arSport[$sport] . '</td>';
       // pour chaque mois on vérifie qu'on a bien la valeur dans notre tableau (il pourrait y avoir des trous) et on l'affiche.
        for ($m = 1; $m < 13; ++$m) {
               $value = (isset($month_values[$m]))  ? $month_values[$m] : 0;
               echo '<td>' . $value . '</td>';
               $total += $value;
        }
        echo '<td>' . $total . '</td>';
        echo '</tr>';
    }
    Et voilà c'est indépendant du nombre de sport (sauf la partie du libellé des sports mais ça il faudrait le traiter dans la base de données aussi).
    Au passage, avoir une table par année n'est pas non plus une bonne pratique. Ajoute plutôt une colonne année.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Par défaut
    Merci beaucoup Sabotage.
    Pour l'utilisation de l'id c'est une erreur de ma part que j'ai oublié de corriger.
    L'idée c'était d'utiliser la colonne mois.
    Pour le reste merci beaucoup.

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

Discussions similaires

  1. [Algo] Trouver un arrangement ou une combinaison d'éléments
    Par Morvan Mikael dans le forum Algorithmes et structures de données
    Réponses: 16
    Dernier message: 20/04/2013, 11h46
  2. [combinatoire] combinaisons de toutes longueur
    Par Toorop dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 16/02/2007, 16h08
  3. Combinaison de deux selects simples
    Par devtrax dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/09/2004, 14h09
  4. Somme de combinaisons
    Par phig dans le forum Mathématiques
    Réponses: 3
    Dernier message: 24/10/2003, 15h03
  5. Réponses: 2
    Dernier message: 22/07/2002, 18h02

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