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 :

Affichage sous plusieurs conditions


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut Affichage sous plusieurs conditions
    Bonjour,

    Je travaille sur un site web dédié aux séries télévisées.

    Le site affiche des fiches descriptives des différentes séries.

    L'affichage de la distribution se fait comme suit:

    Affichage normal:
    ACTEUR : ROLE

    Si un acteur est remplacé par un ou plusieurs autres dans son rôle:
    ACTEUR remplacé par ACTEUR remplacé par ... : ROLE

    Exemple

    Pour cet affichage, Séb. m'a déjà aidé ici;

    Par contre, dans le cas ci-dessous, je ne parviens vraiment à rien.

    Dans certain cas, la distribution est affichée par périodes :

    Affichage normal:
    PERIODE
    ACTEUR : ROLE

    Si un acteur est remplacé par un ou plusieurs autres dans son rôle:
    PERIODE
    ACTEUR remplacé par ACTEUR remplacé par ... : ROLE

    Exemple

    J'utilise une base de données pour afficher mes fiches.

    Voici ma requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $castQuery = $conn->prepare('SELECT seriesTitle, characterName AS charName, personName, appearanceOrder AS appOrder, period FROM CASTING AS C
                    JOIN SERIES AS S ON S.seriesId = C.seriesId
                    JOIN PERSON AS P ON P.personId = C.personId
                    JOIN CHAR_PLAYED AS CP ON CP.characterId = C.characterId
                    WHERE S.seriesId = '.$_GET['series'].'
                    ORDER BY appearanceOrder');
    $castQuery->execute();
    $castResult = $castQuery->get_result();

    Si une âme charitable pouvait m'aider...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Bien, j'ai fini par trouver une solution à mon problème:

    Mon code PHP:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    <?php
    	$row = $castResult->fetch_assoc();
    		if ($row['period'] == '') {
    			while ($row = $castResult->fetch_assoc()) {
    		            // Grouping actors by character
    			    $cast[$row['charName']][] = $row['personName'];
    			}
    			foreach ($cast as $char => $persons) {
    			    echo '<p class="castAndCrew">', implode(' > ', $persons), " : {$char}</p>";
    			}				
    		}
    		else {
    			if (($row['period']) == "0") {
    				echo '<p class="castAndCrew">'.$row['personName'].' : '.$row['charName'].'</p>';
    			}
    			while($row = $castResult->fetch_assoc()) {
    			    // Grouping actors by period, then character
    			    $cast[$row['period']][$row['charName']][] = $row['personName'];
    			}
    			foreach($cast as $period=>$chars) {
    				echo '<span class="castAndCrew">'.$period . '</span>';
    				foreach($chars as $char=>$persons)
    				{
    					echo '<p class="castAndCrew">', implode(' > ', $persons), " : {$char}</p>";
    				}
    			}
    		}
    ?>

    Ma requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $castQuery = $conn->prepare('SELECT S.seriesId, CP.characterId AS charId, P.personId, seriesTitle, characterName AS charName, personName, appearanceOrder AS appOrder, period FROM CASTING AS C
    JOIN SERIES AS S ON S.seriesId = C.seriesId
    JOIN PERSON AS P ON P.personId = C.personId
    JOIN CHAR_PLAYED AS CP ON CP.characterId = C.characterId 
    WHERE S.seriesId = '.$_GET['series'].'
    ORDER BY period, appOrder');
    $castQuery->execute();
    $castResult = $castQuery->get_result();

    Mais il me reste un problème, et ce, avec une seule série. Je me retrouve avec un écart entre "DISTRIBUTION" et la liste du casting.
    Nom : Capture d’écran_2023-06-20_09-41-10.png
Affichages : 106
Taille : 315,1 Ko

    Alors que pour les autres série, tout va bien:
    Nom : Capture d’écran_2023-06-20_09-41-56.png
Affichages : 106
Taille : 225,9 Ko Nom : Capture d’écran_2023-06-20_09-42-29.png
Affichages : 111
Taille : 99,5 Ko

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Je pense avoir cerné le problème.

    Je pense que c'est cette portion du code, qui provoque l'affichage d'un span supplémentaire:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach($cast as $period=>$chars) {
    	echo '<span class="castAndCrew">'.$period. '</span>';
    	foreach($chars as $char=>$persons)
    	{
    		echo '<p class="castAndCrew">', implode(' > ', $persons), " : {$char}</p>";
    	}
    }

    En effet, le but est d'afficher l'intitulé de la période, puis le casting qui la compose.
    Et le foreach qui sert à afficher l'intituler des périodes, allez savoir pourquoi, ajoute un span au-dessus de l'intitulé de la première période.

    Quelqu'un aurait-il une idée pour remédier à ça ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut Boucle avec requête SQL- Première ligne de résultats manquante
    Bonjour,

    Afin d'afficher tous les résultats d'une requête SQL, j'utilise le code suivant :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    $row = $castResult->fetch_assoc();
    if ($row['period'] == '') {
    	while ($row = $castResult->fetch_assoc()) {
    	    // Grouping actors by character
    	    $cast[$row['charName']][] = $row['personName'];
    	}
    	foreach ($cast as $char => $persons) {
    	    echo '<p class="castAndCrew">', implode(' -> ', $persons), " : {$char}</p>";
    	}				
    }
    else {
     
    	if ($row['period'] == '0') {
    		echo '<p class="castAndCrew">'.$row['personName'].' : '.$row['charName'].'</p>';
    	}
    	while($row = $castResult->fetch_assoc()) {
      	    // Grouping actors by period, then character
    	    $cast[$row['period']][$row['charName']][] = $row['personName'];
    	}
    	foreach($cast as $period=>$chars) {
    		echo '<span class="castAndCrew">'.$period.'</span>';
    		foreach($chars as $char=>$persons) {
    	   	    echo '<p class="castAndCrew">', implode(' -> ', $persons), " : {$char}</p>";
    		}
    	}
    }

    Or, il me manque une ligne de résultat.
    Je pense que c'est à cause de la ligne "$row = $castResult->fetch_assoc();"

    Problème, si je la supprime, je ne peux plus définir ma condition...

    Je pense également que c'est en rapport avec mon problème du sujet précédent.

  5. #5
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 370
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 370
    Billets dans le blog
    17
    Par défaut
    Je pense que c'est à cause de la ligne "$row = $castResult->fetch_assoc();"
    Exactement.

    Avec PDO tu peux faire $result->rowCount() pour connaître le nombre de lignes du résultat, ça évite de manger une ligne pour rien.
    Regarde si tu as l'équivalent avec la classe que tu utilises.

    Tu peux aussi mettre préalablement toutes tes lignes de ton résultat dans un tableau ($pdo->query($sql)->fetchAll() avec PDO) et agir selon le nombre d'éléments du tableau, voir count().

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Je te remercie pour ton aide. J'ai trouvé l'équivalent, m'ai je ne vois pas trop à
    quoi ça doit me servir de plus.

    Je patauge, là. Je suis débutant.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Bien, je suis maintenant passé à PDO, mais je n'arrive à rien de plus pour autant.

  8. #8
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 370
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 370
    Billets dans le blog
    17
    Par défaut
    Donne ton dernier script à date.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Bonsoir Séb, voici le dernier script:

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    // Cast Query
    $castQuery = $pdo->query('SELECT S.seriesId, CP.characterId AS charId, P.personId, seriesTitle, characterName AS charName, personName, appearanceOrder AS appOrder, period FROM CASTING AS C
    JOIN SERIES AS S ON S.seriesId = C.seriesId
    JOIN PERSON AS P ON P.personId = C.personId
    JOIN CHAR_PLAYED AS CP ON CP.characterId = C.characterId 
    WHERE S.seriesId = '.$_GET['series'].'
    ORDER BY period, appOrder');
    $row = $castQuery->fetch();
    if ($row['period'] == '') {
    	while ($row = $castQuery->fetch()) {
    	    // Grouping actors by character
    	    $cast[$row['charName']][] = $row['personName'];
    	}
    	foreach ($cast as $char => $persons) {
    	    echo '<p class="castAndCrew">', implode(' -> ', $persons), " : {$char}</p>";
    	}				
    }
    else {
            if ($row['period'] == '0') {
                 echo '<p class="castAndCrew">'.$row['personName'].' : '.$row['charName'].'</p>';
    	}
    	while($row = $castQuery->fetch()) {
    	    // Grouping actors by period, then character
    	    $cast[$row['period']][$row['charName']][] = $row['personName'];
    	}
    	foreach($cast as $period=>$chars) {
    		echo '<span class="castAndCrew">'.$period.'</span>';
    		foreach($chars as $char=>$persons)
    		{
    			echo '<p class="castAndCrew">', implode(' -> ', $persons), " : {$char}</p>";
    		}
    	}
    }
    ?>

  10. #10
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 370
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 370
    Billets dans le blog
    17
    Par défaut
    Tu n'appliques pas mes conseils

    Ci-dessous l'équivalent avec la 1re ligne non mangée par un test.

    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
    <?php
     
    // Pour une meilleure lisibilité
    // Syntaxe HereDoc avec <<<
    $sql = <<<SQL
        SELECT S.seriesId, CP.characterId AS charId, P.personId, seriesTitle, characterName AS charName, personName, appearanceOrder AS appOrder, period FROM CASTING AS C
        JOIN SERIES AS S ON S.seriesId = C.seriesId
        JOIN PERSON AS P ON P.personId = C.personId
        JOIN CHAR_PLAYED AS CP ON CP.characterId = C.characterId
        WHERE S.seriesId = {$_GET['series']}
        ORDER BY period, appOrder
        SQL;
     
    $castQuery = $pdo->query($sql);
     
    $rows = $castQuery->fetchAll();
     
    if ($rows[0]['period'] == '') {
        foreach ($rows as $row) {
            $cast[$row['charName']][] = $row['personName'];
        }
        foreach ($cast as $char => $persons) {
            echo '<p class="castAndCrew">', implode(' -> ', $persons), " : {$char}</p>";
        }
    } else {
        if ($rows[0]['period'] == '0') {
            echo "<p class='castAndCrew'>{$rows[0]['personName']} : {$rows[0]['charName']}</p>";
        }
        foreach ($rows as $row) {
            $cast[$row['period']][$row['charName']][] = $row['personName'];
        }
        foreach ($cast as $period => $chars) {
            echo "<span class='castAndCrew'>{$period}</span>";
            foreach ($chars as $char => $persons) {
                echo '<p class="castAndCrew">', implode(' -> ', $persons), " : {$char}</p>";
            }
        }
    }
    Attention, je doute du bienfondé de l'algo à déterminer le traitement de tout un jeu de résultat à partir d'un seul test sur la 1re ligne.

    Et il faudra voir l'échappement de $_GET['series'] dans le SQL => $pdo->quote()

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    C'est toujours le même problème, le premier $row = $castQuery->fetch(); a pour effet de consommer la première ligne retournée.

    Il faut bien lire la doc, la méthode rowCount ne garantit pas de renvoyer le bon résultat, cela dépend notamment du type de base de données, du curseur etc.

    Autre chose qui n'a rien à voir mais qui doit être dit:
    Si vous ne validez pas de façon stricte le paramètres series, alors ce genre de code est une injection SQL dont l'exploitation est enfantine !!! En clair votre site sera hacké en un rien de temps.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     WHERE S.seriesId = '.$_GET['series'].'
    On est en 2023. On ne code plus comme ça, on fait des requêtes paramétrées.

    En fait non, même pas.
    Aujourd'hui on travaille plutôt avec des frameworks et des ORM.
    Et pour créer les pages web on utilise de préférence un template engine comme Twig. D'ailleurs, il peut être utilisé seul, sans le framework Symfony.
    Ce serait un bon début de séparer la présentation (pages) de la logique (traitement PHP).

    Bon, maintenant que je vous ai cassé le moral et je m'en excuse mais c'est plus fort que moi, car je sais que vous êtes débutant et ce que vous faites à une valeur éducative certaine. Mais je pense qu'il faudra monter en puissance afin de créer du code plus robuste, qui vous donnera moins de soucis par la suite.

    Pour en revenir à nos moutons, je pense que le problème est que vous essayer de faire du group by sans faire du group by.
    Soit vous réécrivez votre requête ou bien vous faites deux requêtes séparées en utilisant les boucles.
    Examinez le jeu de données que vous renvoie cette requête, car moi je ne peux pas le visualiser, je peux juste le deviner.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Merci Séb,

    Effectivement, du coup, toutes mes lignes s'affichent, saut que, mon affichage n'est plus correct.
    Je renvoie donc le nouveau script, plus commenté qu'auparavant, histoire de bien expliquer le résultat que
    souhaite obtenir.

    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
    <?php
    	// Cast Query
    	$sql = <<<SQL
    		SELECT S.seriesId, CP.characterId AS charId, P.personId, seriesTitle, characterName AS charName, personName, appearanceOrder AS appOrder, period FROM CASTING AS C
    		JOIN SERIES AS S ON S.seriesId = C.seriesId
    		JOIN PERSON AS P ON P.personId = C.personId
    		JOIN CHAR_PLAYED AS CP ON CP.characterId = C.characterId
    		WHERE S.seriesId = :seriesId
    		ORDER BY period, appOrder
    		SQL;
     
    		$castQuery = $pdo->prepare($sql);
    		$castQuery->bindParam(':seriesId', $_GET['series'], PDO::PARAM_INT);
    		$castQuery->execute();
    		$rows = $castQuery->fetchAll();
     
    		if ($rows[0]['period'] == '') {   // On vérifie si la colonne 'period' est vide
       		        foreach ($rows as $row) {   // Si la colonne 'period' est vide, la série n'a pas de périodes, on affiche la distribution normalement
    			       $cast[$row['charName']][] = $row['personName'];
    			}
    			foreach ($cast as $char => $persons) {
    			        echo '<p class="castAndCrew">', implode(' -> ', $persons), " : {$char}</p>";
    			}
    	} else {   // Ici, la série à des périodes
    	    if ($rows[0]['period'] == '0') {   // On vérifie si un acteur est présent sur la totalité des périodes
    	        echo "<p class='castAndCrew'>{$rows[0]['personName']} : {$rows[0]['charName']}</p>";   // C'est le cas, alors, on l'affiche en tête de la distribution, avant le premier en-tête de période
    	    }   // Ce n'est pas le cas, alors on affiche l'en-tête de période, suivi de la distribution pour cette période
    	    foreach ($rows as $row) {
    	        $cast[$row['period']][$row['charName']][] = $row['personName'];
    	    }
    	    foreach ($cast as $period => $chars) {
    	        echo "<span class='castAndCrew'>{$period}</span>";
    	        foreach ($chars as $char => $persons) {
    	            echo '<p class="castAndCrew">', implode(' -> ', $persons), " : {$char}</p>";
    	        }
    	    }
    	}
    ?>
    Je joins également le jeu de données récupéré pour la requête.

    Pour une série sans périodes:
    Nom : bugs.jpg
Affichages : 104
Taille : 29,9 Ko

    Pour une série avec des périodes:
    Nom : heat.jpg
Affichages : 104
Taille : 32,4 Ko

    Pour une série avec périodes, et un acteur présent sur toutes les périodes:
    Nom : avengers.jpg
Affichages : 110
Taille : 78,9 Ko

    Citation Envoyé par Séb.
    Et il faudra voir l'échappement de $_GET['series'] dans le SQL => $pdo->quote()
    Citation Envoyé par binarygirl
    Autre chose qui n'a rien à voir mais qui doit être dit:
    Si vous ne validez pas de façon stricte le paramètres series, alors ce genre de code est une injection SQL dont l'exploitation est enfantine !!! En clair votre site sera hacké en un rien de temps.
    J'ai modifié mon code en conséquence, cela est-il correct.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Bon, j'ai fini par régler mon problème d'affichage en ajoutant une colonne à la table casting.

    Et voici le code actuel
    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
    $sql = <<<SQL
    SELECT S.seriesId, CP.characterId AS charId, P.personId, seriesTitle, characterName AS charName, personName, appearanceOrder AS appOrder, period, periodNumber AS periodNum FROM CASTING AS C
    JOIN SERIES AS S ON S.seriesId = C.seriesId
    JOIN PERSON AS P ON P.personId = C.personId
    JOIN CHAR_PLAYED AS CP ON CP.characterId = C.characterId
    WHERE S.seriesId = :seriesId
    ORDER BY periodNum, appOrder
    SQL;
     
    $castQuery = $pdo->prepare($sql);
    $castQuery->bindParam(':seriesId', $_GET['series'], PDO::PARAM_INT);
    $castQuery->execute();
    $rows = $castQuery->fetchAll();
     
    if ($rows[0]['period'] == '') {
        foreach ($rows as $row) {
            $cast[$row['charName']][] = $row['personName'];
        }
             foreach ($cast as $char => $persons) {
    	        echo '<p class="castAndCrew">', implode(' -> ', $persons), " : {$char}</p>";
    	}
    } else {
    	if ($rows[0]['appOrder'] == 0) {
    	     //echo "<p class='castAndCrew'>{$rows[0]['personName']} : {$rows[0]['charName']}</p>";
    	}
    	foreach ($rows as $row) {
    	        $cast[$row['period']][$row['charName']][] = $row['personName'];
    	}
    	foreach ($cast as $period => $chars) {
    	        echo "<span class='castAndCrew'>".$period."</span>";
    	        foreach ($chars as $char => $persons) {
    		            echo '<p class="castAndCrew">', implode(' -> ', $persons), " : {$char}</p>";
    	        }
    	}
    }
    Il mer reste juste un petit problème, je me retrouve avec un écart entre "DISTRIBUTION" et la liste des acteurs, et ce, uniquement
    pour les séries à périodes :
    Nom : Capture d’écran_2023-06-22_11-57-36.png
Affichages : 103
Taille : 200,9 Ko

    Une idée mes amis ?

  14. #14
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Citation Envoyé par Neelix57 Voir le message
    J'ai modifié mon code en conséquence, cela est-il correct.
    C'est déjà mieux. Ainsi, vous évitez l'injection SQL mais votre code peut quand même planter si on envoie un paramètre qui n'est pas numérique. Je vous laisse faire le test.
    Normalement, on doit valider toutes les données reçues du client, que ce soit en GET ou en POST.
    Transmettre les données brutes au code sous-jacent sans contrôle est toujours risqué.

    Quant à ce problème d'écart, je vous suggère de regarder dans le browser le code HTML qui a été généré.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Effectivement, il me génère une ligne
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <span class="castAndCrew"> </span> == $0

    Cette ligne apparaît également dans le code de certaines pages séries, qui n'ont pas de périodes... Mais pas pour toutes.

    Si quelqu'un y comprend quelque chose...

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Ca se comprend, et vous pouvez même identifier d'où ça vient dans votre code.
    Apparemment, au début de votre boucle foreach il y a encore un print superflu.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Ca se comprend, et vous pouvez même identifier d'où ça vient dans votre code.
    Je ne vois pas comment, je vous rappelle que je débute complètement, du coup, si vous pouvez être plus explicite...

    Apparemment, au début de votre boucle foreach il y a encore un print superflu.
    En principe tous mes print sont nécessaires. Du reste, ce sont les mêmes que dans mon code d'origine. Mis à part
    le problème des premières lignes qui n'apparaissaient pas, ils ne posaient aucun problème.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Bien après une petite séance de bidouillage, il semble que le problème soit résolu pour les séries qui n'ont pas de périodes.
    J'ai remplacé dans ma table CASTING la valeur par défaut '' par '-'.

    Mon script devient donc:
    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
    $sql = <<<SQL
    SELECT S.seriesId, CP.characterId AS charId, P.personId, seriesTitle, characterName AS charName, personName, appearanceOrder AS appOrder, period, periodNumber AS periodNum FROM CASTING AS C
    JOIN SERIES AS S ON S.seriesId = C.seriesId
    JOIN PERSON AS P ON P.personId = C.personId
    JOIN CHAR_PLAYED AS CP ON CP.characterId = C.characterId
    WHERE S.seriesId = :seriesId
    ORDER BY periodNum, appOrder
    SQL;
     
    $castQuery = $pdo->prepare($sql);
    $castQuery->bindParam(':seriesId', $_GET['series'], PDO::PARAM_INT);
    $castQuery->execute();
    $rows = $castQuery->fetchAll();
     
    if ($rows[0]['period'] == '-') {
        foreach ($rows as $row) {
            $cast[$row['charName']][] = $row['personName'];
        }
        foreach ($cast as $char => $persons) {
            echo '<p class="castAndCrew">', implode(' -> ', $persons), " : {$char}</p>";
        }
    } else {
        foreach ($rows as $row) {
            $cast[$row['period']][$row['charName']][] = $row['personName'];
        }
        foreach ($cast as $period => $chars) {
            echo "<span class='castAndCrew'>".$period."</span>";
            foreach ($chars as $char => $persons) {
                echo '<p class="castAndCrew">', implode(' -> ', $persons), " : {$char}</p>";
            }
        }
    }
    Pour les séries à périodes, je continue d'avoir mon écart, mais, cette fois, pas de ligne supplémentaire dans le code généré.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Bonjour,

    Après avoir retourné le problème dans tous les sens et cherché partout sur le net, j'en viens à la conclusion que mon dernier problème n'est
    ni plus, ni moins que du au CSS. Je passe donc ce post en résolu.

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

Discussions similaires

  1. sommer sous plusieurs conditions
    Par matlabation dans le forum R
    Réponses: 10
    Dernier message: 13/05/2015, 15h40
  2. [XL-2010] Calcul d'écart type sous plusieurs conditions
    Par Pocken dans le forum Excel
    Réponses: 6
    Dernier message: 28/03/2014, 16h02
  3. VBA Excel 2003 Copier ligne sous plusieurs conditions
    Par Harreauv dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/01/2013, 19h40
  4. [XL-2003] Compter nombre de cellules sous plusieurs conditions
    Par coklin dans le forum Excel
    Réponses: 10
    Dernier message: 11/09/2009, 15h48
  5. Somme sous plusieurs conditions
    Par neeux dans le forum Excel
    Réponses: 5
    Dernier message: 04/07/2007, 15h53

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