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

Langage PHP Discussion :

Sécurité des liens avec variables en paramètres


Sujet :

Langage PHP

  1. #1
    Membre régulier
    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
    Points : 78
    Points
    78
    Par défaut Sécurité des liens avec variables en paramètres
    Bonjour,

    J'utilise des requêtes $_GET pour récupérer les paramètres de les liens.

    Par exemple:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="accueil.php?page=Flash">

    Et je sécurisais mes liens en utilisant un fichier includes.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $checkPage = array('Livre' => 'livre.php', 'Series' => 'series/series.php'
    ...
    Hors, pour afficher les fiches séries, je ne crée plus une page par fiche série, je passe maintenant par une base de données.
    J'utilise maintenant des variables en lieu et place des noms de pages.

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="accueil.php?page=Series_Record&series='.$row['seriesId'].'&title='.$row['seriesTitle'].'">'.$row['seriesTitle'].'</a>

    Comment puis-je, dans ce cas, sécuriser tout ça ?

  2. #2
    Nb
    Nb est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 149
    Points : 421
    Points
    421
    Par défaut
    Ben quand tu reçoit le seriesId j imagine que tu vas chercher le detail en bd donc tu fais une requete préparée avec l id récupéré et un minimum nettoyé.

    Ps. Je ne sais pas ce que tu cherches à faire mais tu sembles passer en parametre l id et le titre d une serie pour en recuperer le detail en base, si c est le cas le titre ne sert a rien puisque tu as un id.

  3. #3
    Membre régulier
    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
    Points : 78
    Points
    78
    Par défaut
    Ps. Je ne sais pas ce que tu cherches à faire mais tu sembles passer en parametre l id et le titre d'une série pour en récupérer le detail en base, si c est le cas le titre ne sert a rien puisque tu as un id.
    Effectivement, je me rends compte que c'est inutile.

    J'utilise déjà des requêtes préparées. Mais j'aimerais éviter qu'on ne puisse rentrer un paramètre dans l'url, car cela planté la page. Je préférerais un message d'erreur ou que
    ça provoque une redirection vers une autre page.

  4. #4
    Membre éclairé
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juin 2014
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2014
    Messages : 426
    Points : 852
    Points
    852
    Par défaut
    Une requête préparée fait deux appels à la BDD. A mon avis, elle mobilise inutilement des ressources lorsque le paramètre passé est censé être un entier (à moins bien sûr qu'elle ne soit réutilisée dans le script), ce qui, si j'ai bien compris est le cas ici. Il suffit de vérifier que c'en est bien un par la fonction ctype_digit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(ctype_digit($_GET['mavariable')) {
        // OK, traitement
    }
    else {
       // redirection ou ce qu'on veut
    }
    Je veux bien être contredit si je dis une bêtise.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 201
    Points : 8 426
    Points
    8 426
    Billets dans le blog
    17
    Par défaut
    Je suis d'accord avec domi65 sur les requêtes préparées.

    Mais j'aimerais éviter qu'on ne puisse rentrer un paramètre dans l'url, car cela planté la page
    Il faut accepter que l'utilisateur puisse modifier l'URL.
    À toi d'avoir un code suffisamment robuste pour prendre en compte la situation.

    Si l'utilisateur supprime un paramètre => Tu dois prendre en compte son absence et afficher "Pas de résultat" ou "Requête incorrecte"
    Si l'utilisateur remplace l'ID série par une valeur farfelue => Tu dois afficher "Pas de résultat" ou "Requête incorrecte"
    etc.

  6. #6
    Membre régulier
    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
    Points : 78
    Points
    78
    Par défaut
    Bonjour et merci pour vos réponses.

    Je n'ai pas eu beaucoup le temps de me consacrer à tout ça ces temps-ci.

    Après maints essais, je ne parviens pas à afficher un message d'erreur en cas de paramètre erroné ou d'absence de paramètre.

    Voila ce qui me semblait pourtant le plus adapté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $sql = <<<SQL
    	SELECT * FROM SERIES
    	WHERE seriesId = :seriesId
    	SQL;
    $idQuery = $pdo->prepare($sql);
    $idQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    $idQuery->execute();
    $row = $idQuery->fetch();
    if(!isset($row)) {
       	include('error.php');
    }
    J'ai essayé également avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $sql = <<<SQL
    	SELECT * FROM SERIES
    	WHERE seriesId = :seriesId
    	SQL;
    $idQuery = $pdo->prepare($sql);
    $idQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    $idQuery->execute();
    $row = $idQuery->fetch();
    if($row = 0) {
       	include('error.php');
    }
    Je reviens également sur ma réponse précédente:
    Ps. Je ne sais pas ce que tu cherches à faire mais tu sembles passer en paramètre l id et le titre d'une série pour en récupérer le détail en base, si c est le cas le titre ne sert a rien puisque tu as un id.
    Effectivement, je me rends compte que c'est inutile.
    J'ai tout de même besoin du paramètre 'title' pour afficher le titre de la série comme titre de page.
    Mais c'est peut-être l'un des nœuds du problème ?

  7. #7
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    Le titre n'est pas dans ta table ?
    id => requete titre donc pas besoin de le passer en paramètre ...

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 201
    Points : 8 426
    Points
    8 426
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $row = $idQuery->fetch();
    if(!isset($row)) {
    Je ne pense pas que ce soit bon.
    PDOStatment::fetch() retourne false ou un tableau/objet.
    Adapte ton test en conséquence.

    Ici tu ne testes pas si $row vaut 0, mais tu affectes 0 à $row.
    Pourquoi faire une comparaison avec 0 ?

    Il ne faut pas faire de tests au hasard mais lire la doc et adapter les tests selon les valeurs possiblement retournées.
    => https://www.php.net/pdostatement.fetch

    Valeurs de retour ¶
    La valeur retournée par cette fonction en cas de succès dépend du type récupéré. Dans tous les cas, false est retourné si une erreur survient ou s'il n'y a plus de lignes.
    J'ai tout de même besoin du paramètre 'title' pour afficher le titre de la série comme titre de page.
    Est-ce que cela veut dire que si la page appelée est accueil.php?page=Series_Record&series=123&title=Hophophop alors tu afficheras en titre "Hophophop" ?
    Si oui c'est une faille majeure qu'il faut absolument corriger.

    La page appelée doit être accueil.php?page=Series_Record&series=123

    À toi de valider le paramètre $_GET['series'], récupérer les données de la série $_GET['series'] (y compris le titre !) et de les afficher correctement ou d'afficher une erreur si anomalie.

  9. #9
    Membre régulier
    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
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    J'ai beau chercher, sans mon $_GET['series'], impossible de faire afficher le titre de la fenêtre ou de l'onglet.

    Je suis peut-être con, mais, quand à afficher ma page d'erreur, je n'arrive à rien non plus. Après, je suis un gros débutant. J'en viens quelquefois à me demander comment
    j'ai fait pour arriver aussi loin avec mon site.

    J'ai beau avoir le titre dans la base de données, impossible de le récupérer autrement que par un paramètre du lien vers la fiche de la série concernée.

    J'ai une page d'accueil qui se présente comme ceci:
    www.serie

    Dans le cadre de droite s'affiche la fiche série et je récupère le titre par ce bout de code:
    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
    if ( (isset($_GET['category'])) && (isset($checkTitle[$_GET['category']])) ) {
    	echo $checkTitle[$_GET['page']].' - '.$checkTitle[$_GET['category']];
    }
    elseif( (isset($_GET['page'])) && (isset($checkTitle[$_GET['page']])) ) {
    	echo $checkTitle[$_GET['page']].' - '.$row['seriesTitle'];
    }
    elseif( (isset($_GET['page'])) && (isset($checkTitle[$_GET['page']])) && (isset($_GET['letter']))) {
    	 echo $checkTitle[$_GET['page']].' - '.$_GET['letter'];
    }
    elseif( (isset($_GET['page'])) && (isset($checkTitle[$_GET['page']])) ) {
    	 echo $checkTitle[$_GET['page']];
    }
    else {
    	echo 'Accueil';
    }
    La variable $checkTitle récupère le titre dans un fichier 'title.php' sauf pour les fiches séries, puisque les infos proviennent
    de la base de données.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 201
    Points : 8 426
    Points
    8 426
    Billets dans le blog
    17
    Par défaut
    Je suppose qu'il s'agit d'un problème de composition de page.

    Difficile d'en dire plus sans voir davantage de code.

  11. #11
    Membre régulier
    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
    Points : 78
    Points
    78
    Par défaut
    Je joins les fichiers concernés à ce post.
    record.php
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    <?php
    	if(isset($_GET['series'])) {
    		$seriesId = $_GET['series'];
    	}
    	if(isset($_GET['title'])) {
    		$seriesTitle = $_GET['title'];
    	}	
    ?>
     
    <section class="series accueilContainer col-10">
    	<!--<?php
    		$sql = <<<SQL
    		SELECT * FROM SERIES
    		WHERE seriesId = :seriesId or seriesTitle like :seriesTitle
    		SQL;
    		$idQuery = $pdo->prepare($sql);
    		$idQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    		$idQuery->bindParam(':seriesTitle', $seriesTitle, PDO::PARAM_INT);
    		$idQuery->execute();
    		$row = $idQuery->fetch();
    		if(($row['seriesId'] = 0) || ($row['seriesTitle'] = 0)) {
    	    	include('../error.php');
    		}
    	?>-->
    	<figure class="poster">
    		<?php
    			// Image Query
    			$sql = <<<SQL
    				SELECT seriesTitle, seriesPoster FROM SERIES
    				WHERE seriesId = :seriesId
    				SQL;
     
    			$imageQuery = $pdo->prepare($sql);
    			$imageQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    			$imageQuery->execute();
    			$row = $imageQuery->fetch();
    			if(isset($row['seriesPoster'])) {
    				echo '<img class="seriesImage" src="/series/images/'.$row['seriesPoster'].'">';
    			}
    			else {
    				echo '<img class="seriesImage" src="/series/images/no_image_available.png">';
    			}
    		?>
    	</figure>
     
    	<article class="seriesRecord">
    	<!-- TITLE SECTION DISPLAY -->
    		<?php
    			// Title Query
    			$sql = <<<SQL
    				SELECT SL.seriesTitle AS frenchTitle, S.seriesTitle AS seriesTitle FROM SERIESLIST AS SL
    				LEFT JOIN SERIES AS S ON S.seriesId = SL.seriesId
    				WHERE SL.seriesId = :seriesId
    				SQL;
     
    			$titleQuery = $pdo->prepare($sql);
    			$titleQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    			$titleQuery->execute();
    			$row = $titleQuery->fetch();
    			if ($row['frenchTitle'] == $row['seriesTitle']) {  // Test if The original an french titles are the same
    				$title = mb_strtoupper($row['frenchTitle']);  // If they are the same display only one uppercase title
    			} else {  // If they're different, display the french title uppercase and the original one lowercase
    				$title = mb_strtoupper($row['frenchTitle'])." (".$row['seriesTitle'].")";
    				$limit = "40";
    				if(strlen($title) <= $limit) {  // Test String Lenght
    					$title = mb_strtoupper($row['frenchTitle'])." (".$row['seriesTitle'].")";  // If the lenght is smaller then limit
    				} else {  // If lenght is bigger, display the title on 2 lines
    					$title = mb_strtoupper($row['frenchTitle'])."<br>(".$row['seriesTitle'].")";
    				}
    			}
    			echo '<h1 class="seriesTitle">'.$title.'</h1>';
     
    			// Is the Series a Spin-Off Query
    			$sql = <<<SQL
    				SELECT S.seriesId FROM SERIES AS S
    				JOIN SPINOFF AS SO ON SO.seriesId_spinOff = S.seriesId
    				WHERE S.seriesId = :seriesId AND SO.seriesId_spinOff = S.seriesId
    				SQL;
     
    			$isSpinOffQuery = $pdo->prepare($sql);
    			$isSpinOffQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    			$isSpinOffQuery->execute();
    			$row = $isSpinOffQuery->fetch();
    			if (isset($row['seriesId'] )) {  // Test if the series is a Spin-Off
    				// Spin-Off from Query
    				$sql = <<<SQL
    					SELECT PL.seriesTitle AS prequel, S.seriesTitle AS spinOff FROM SPINOFF AS SO
    					JOIN SERIESLIST AS PL ON PL.seriesId = SO.seriesId_prequel
    					JOIN SERIESLIST AS S ON S.seriesId = SO.seriesId_spinOff
    					WHERE S.seriesId = :seriesId
    					SQL;				
     
    				$spinOffQuery = $pdo->prepare($sql);
    				$spinOffQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    				$spinOffQuery->execute();
    				$row = $spinOffQuery->fetch();  // If it is one, display this line
    				echo '<span id="spinOff">Spin-Off de '.$row['prequel'].'</span>';
    			}
    		?>
     
    		<!-- PRODUCTION SECTION DISPLAY -->
      		<?php
    			// Company Name Query	
    			$sql = <<<SQL
    				SELECT companyName AS companyName FROM COMPANY AS C 
    				LEFT JOIN PRODUCTION AS P ON P.companyId = C.companyId
    				LEFT JOIN SERIES AS S ON S.seriesId = P.seriesId
    				WHERE S.seriesId = :seriesId
    				SQL;
     
    			$companyQuery = $pdo->prepare($sql);
    			$companyQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    			$companyQuery->execute();
    			$rows = $companyQuery->fetchAll();
    			if(isset($rows[0]['companyName'])) {
    				echo '<div class="castAndCrew">';
    				echo '<h2>PRODUCTION</h2>';
    				echo '<dl>';
    				foreach ($rows as $row) {
    					echo '<dd>'.$row['companyName'].'</dd>';
    				}
    				echo '</dl>';
    				echo '</div>';
    			}
    		?>
     
     
    		<!-- PRODUCER SECTION DISPLAY -->  	
    		<?php 
    			// Producer Name Query	
    			$sql = <<<SQL
    				SELECT personName AS personName FROM PERSON AS P
    				LEFT JOIN CREW AS C ON C.personId = P.personId
    				LEFT JOIN ROLE AS R ON R.roleId = C.roleId
    				LEFT JOIN SERIES AS S ON S.seriesId = C.seriesId
    				WHERE S.seriesId = :seriesId
    				AND R.roleId = 1
    				SQL;
     
    			$producerQuery = $pdo->prepare($sql);
    			$producerQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    			$producerQuery->execute();
    			$rows = $producerQuery->fetchAll();
    			if(isset($rows[0]['personName'])) {
    				echo '<div class="castAndCrew">';
    				echo '<h2>PRODUCTEUR</h2>';
    				echo '<dl>';
    				foreach ($rows as $row) {
    					echo '<dd>'.$row['personName'].'</dd>';
    				}
    				echo '</dl>';
    				echo '</div>';
    			}
    		?>
     
    		<!-- EXECUTIVE PRODUCER SECTION DISPLAY -->  	
    		<?php 
    			// Executive Producer Name Query	
    			$sql = <<<SQL
    				SELECT personName AS personName FROM PERSON AS P
    				LEFT JOIN CREW AS C ON C.personId = P.personId
    				LEFT JOIN ROLE AS R ON R.roleId = C.roleId
    				LEFT JOIN SERIES AS S ON S.seriesId = C.seriesId
    				WHERE S.seriesId = :seriesId
    				AND R.roleId = 2
    				SQL;
     
    			$execProducerQuery = $pdo->prepare($sql);
    			$execProducerQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    			$execProducerQuery->execute();
    			$rows = $execProducerQuery->fetchAll();
    			if(isset($rows[0]['personName'])) {
    				echo '<div class="castAndCrew">';
    				echo '<h2>PRODUCTEUR EXECUTIF</h2>';
    				echo '<dl>';
    				foreach ($rows as $row) {
    					echo '<dd>'.$row['personName'].'</dd>';
    				}
    				echo '</dl>';
    				echo '</div>';
    			}
    		?>
     
    	  	<!-- DIRECTOR SECTION DISPLAY -->
    		<?php
    			// Director Name Query	
    			$sql = <<<SQL
    				SELECT personName AS personName FROM PERSON AS P
    				LEFT JOIN CREW AS C ON C.personId = P.personId
    				LEFT JOIN ROLE AS R ON R.roleId = C.roleId
    				LEFT JOIN SERIES AS S ON S.seriesId = C.seriesId
    				WHERE S.seriesId = :seriesId AND R.roleId = 3
    				SQL;
     
    			$directorQuery = $pdo->prepare($sql);
    			$directorQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    			$directorQuery->execute();
    			$rows = $directorQuery->fetchAll();
    			if(isset($rows[0]['personName'])) {
    				echo '<div class="castAndCrew">';
    				echo '<h2>REALISATEUR</h2>';
    				echo '<dl>';
    				foreach ($rows as $row) {
    					echo '<dd>'.$row['personName'].'</dd>';
    				}
    				echo '</dl>';
    				echo '</div>';
    			}
    		?>
    		<!-- CREATED BY SECTION DISPLAY -->
    		<?php
    			// Creator Name Query	
    			$crSql = <<<SQL
    				SELECT personName AS personName FROM PERSON AS P
    				LEFT JOIN CREW AS C ON C.personId = P.personId
    				LEFT JOIN ROLE AS R ON R.roleId = C.roleId
    				LEFT JOIN SERIES AS S ON S.seriesId = C.seriesId
    				WHERE S.seriesId = :seriesId AND R.roleId = 5
    				SQL;
    			$ocSql = <<<SQL
    				SELECT originalText AS origText FROM ORIG_CREATION AS OC
    				LEFT JOIN SERIES AS S ON S.originalId = OC.originalId
    				WHERE S.seriesId = :seriesId
    				SQL;
     
    			$creatorQuery = $pdo->prepare($crSql);
    			$creatorQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    			$creatorQuery->execute();
    			$rows = $creatorQuery->fetchAll();
    			if(isset($rows[0]['personName'])) {
    				echo '<div class="castAndCrew">';
    				echo '<h2>CREATION</h2>';
    				echo '<dl>';
    				foreach ($rows as $row) {
    					echo '<dd class="castAndCrew">'.$row['personName'].'</dd>';
    				}
    				echo '</dl>';
    				echo '</div>';
    			}
    			$origCreator = $pdo->prepare($ocSql);
    			$origCreator->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    			$origCreator->execute();
    			$rows = $origCreator->fetchAll();
    			if(isset($rows[0]['origText'])) {
    				echo '<div class="castAndCrew">';
    				echo '<dl>';
    				foreach ($rows as $row) {
    					echo $row['origText'];
    				}
    				echo '</dl>';
    				echo '</div>';
    			}
    		?>
     
    	  	<!-- CAST SECTION DISPLAY -->
    	  	<div class="castAndCrew">
    	  	<h2>DISTRIBUTION</h2>
    			<?php
    				// Cast Query
    				$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', $seriesId, PDO::PARAM_INT);
    				$castQuery->execute();
    				$rows = $castQuery->fetchAll();
     
    				if ($rows[0]['period'] == '-') {
    					echo '<dl>';
    				    foreach ($rows as $row) {
    				        $cast[$row['charName']][] = $row['personName'];
    				    }
    				    foreach ($cast as $char => $persons) {
     
    				        echo '<dd>', implode(' -> ', $persons), " : {$char}</dd>";
     
    				    }
    				    echo '</dl>';
    				} else {
    				    foreach ($rows as $row) {
    				        $cast[$row['period']][$row['charName']][] = $row['personName'];
    				    }
    				    foreach ($cast as $period => $chars) {
    				    	echo '<dl>';
    				        echo "<dt>".$period."</dt>";
    				        foreach ($chars as $char => $persons) {
    				            echo '<dd>', implode(' -> ', $persons), " : {$char}</dd>";
    				        }
    				        echo '</dl>';
    				    }
    				}
    			?>	
    	  	</div>
     
    	  	<!-- FIRST AIRED SECTION DISPLAY -->	
    	  	<div class="castAndCrew">
    	  	<h2>PREMIERE DIFFUSION</h2>
    	  		<?php
    				// Is the series French Query
    				$sql = <<<SQL
    					SELECT S.seriesId FROM SERIES AS S
    					JOIN FRENCH_SERIES AS F ON F.seriesId = S.seriesId
    					WHERE S.seriesId = :seriesId AND F.seriesId = S.seriesId
    					SQL;
     
    				$isFrenchQuery = $pdo->prepare($sql);
    				$isFrenchQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    				$isFrenchQuery->execute();
    				$row = $isFrenchQuery->fetch();
     
    				// First Aired Query
    				$sql = <<<SQL
    					SELECT countryName, releaseYear, frenchReleaseYear, channelName, frenchChannelName FROM FIRSTAIRED
    					WHERE seriesId = :seriesId
    					SQL;
    				$airedQuery = $pdo->prepare($sql);
    				$airedQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    				$airedQuery->execute();
    				echo '<dl>';
    	  			if (isset($row['seriesId'] )) {  // Test if it's a french series
    					$row = $airedQuery->fetch();  // If it's a french series display only this line
    		  			echo '<dd class="castAndCrew">France : '.$row['channelName'].' - '.$row['releaseYear'].'</dd>';  				
    	  			} else {  // If it's a foreign series display the two first aired lines
    		  			$row = $airedQuery->fetch();
    		  			echo '<dd class="castAndCrew">'.$row['countryName'].' : '.$row['channelName'].' - '.$row['releaseYear'].'</dd>';
    		  			echo '<dd class="castAndCrew">France : '.$row['frenchChannelName'].' - '.$row['frenchReleaseYear'].'</dd>';
    		  		}
    		  		echo '</dl>';
    	  		?>
    	  	</div>
     
    		<div class="retour">
    	 			<span><?php echo "<a href=\"javascript:history.go(-1)\">" ?>RETOUR</a></span>
    	 	</div>
     	</article>
    </section>
    series_index.php
    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
    <?php
    if(isset($_GET['letter'])) {
    		$letter = $_GET['letter'];
    	}
    ?>
     
    <section class="accueilContainer col-10">
    	<?php
    		echo '<h1 class="seriesTitle">Index Séries '.$letter.'</h1>';
    		echo '<div class="seriesIndex">';
    		$sql = <<<SQL
    			SELECT titleSort, seriesTitle,  seriesId, releaseYear FROM SORTLIST
    			WHERE titleSort RLIKE '^[$letter]'
    			ORDER BY titleSort, releaseYear
    			SQL;	
     
    		$query = $pdo->prepare($sql);
    		$query->execute();
    		$rows = $query->fetchAll();
     
    		$doublons = array();
     
    		foreach ($rows as $row) {
    			if (in_array($row['seriesTitle'], $doublons)) { //Si le titre a déjà été traité, il se trouvera dans le tableau et il s'agira donc d'un doublon
    				echo '<p><a href="accueil.php?page=Series_Record&series='.$row['seriesId'].'&title='.$row['seriesTitle'].'">'.$row['seriesTitle'].' ('.$row['releaseYear'].')</a></p>'; // Affichage de l'année
    			} else {
    				$doublons[] = $row['seriesTitle']; //Si le titre n'existe pas dans le tableau, on l'ajoute pour que la prochaine correspondance soit traitée comme un doublon
    				echo '<p><a href="accueil.php?page=Series_Record&series='.$row['seriesId'].'&title='.$row['seriesTitle'].'">'.$row['seriesTitle'].'</a></p>';
    			}
    		}
    		echo '</div>';
     
    	?>
    </section>
    accueil.php
    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
    <?php
    	session_start();
    	require('includes.php');
    	include('titles.php');
    	include('config.php');
    ?>
    <!DOCTYPE html>
    <html lang="fr">
     
    	<head>
    		<title><?php
    			if ( (isset($_GET['category'])) && (isset($checkTitle[$_GET['category']])) ) {
    				echo $checkTitle[$_GET['page']].' - '.$checkTitle[$_GET['category']];
    			}
    			elseif( (isset($_GET['page'])) && (isset($checkTitle[$_GET['page']])) && (isset($_GET['title']))) {
    				echo $checkTitle[$_GET['page']].' - '.$_GET['title'];
    			}
    			elseif( (isset($_GET['page'])) && (isset($checkTitle[$_GET['page']])) && (isset($_GET['letter']))) {
    				 echo $checkTitle[$_GET['page']].' - '.$_GET['letter'];
    			}
    			elseif( (isset($_GET['page'])) && (isset($checkTitle[$_GET['page']])) ) {
    				 echo $checkTitle[$_GET['page']];
    			}
    			else {
    				echo 'Accueil';
    			}
    			?></title>
    		<meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, minimum-scale=1" />
    		<meta name="description" content="Site dédié aux séries TV et plus particulièrement à Star Trek.">
    		<meta name="keywords" content="Séries TV, Star Trek, Fiches, Vitesse de distorsion, Armement, Equipements, Personnages, Uniformes, Grades, Directives, Règles d'acquisition, Chevaliers du zodiaque, Goldorak, Icones, Wallpapers, Polices, Forum, Liens">
    		<meta name="abstract" content="Vous trouverez sur ce site des fiches pratiques concernant les séries TV ainsi qu'un maximum d'informations concernant Star Trek et un forum sur lequel vous pourrez discuter">
    		<meta name="robots" content="all">
    		<meta name="revisit-after" content="30">
    		<meta name="reply-to" content="neelix570@gmail.com">
    		<meta name="identifier-url" content="http://swww.seriemaniacs.fr">
    		<meta name="subject" content="Série TV, Star Trek, Mangas, Downloads">
    		<meta name="expires" content="never">
    		<meta name="location" content="France, FRANCE">
    		<meta name="rating" content="general">
    		<meta name="category" content="Séries TV">
    		<script src="js/jquery-3.5.1.min.js"></script>
    		<script async src="js/menu.js"></script>
    		<script src="../js/trekmenu.js"></script>
    		<script src="../js/downmenu.js"></script>
    		<link rel="stylesheet" href="css/accueil.css" type="text/css" />
    		<link rel="stylesheet" href="css/bienvenue.css" type="text/css" />
    		<link rel="stylesheet" href="css/navigation.css" type="text/css" />
    		<link rel="stylesheet" href="css/series.css" type="text/css" />
    		<link rel="stylesheet" href="css/series_sommaire.css" type="text/css" />
    		<link rel="stylesheet" href="css/startrek.css" type="text/css" />
    		<link rel="stylesheet" href="css/treknav.css" type="text/css" />
    		<link rel="stylesheet" href="css/trekaccueil.css" type="text/css" />
    		<link rel="stylesheet" href="css/directives.css" type="text/css" />
    		<link rel="stylesheet" href="css/startrek_histoire.css" type="text/css" />
    		<link rel="stylesheet" href="css/mangas.css" type="text/css" />
    		<script>
    			function slideMenu() {
    			  var x = document.getElementById("navigationContainer");
    			  if (x.style.display === "block") {
    			    x.style.display = "none";
    			  } else {
    			    x.style.display = "block";
    			  }
    			} 
    		</script>
     
    	<body>
    		<?php
    			include 'navigation.php'; 
     
    			if ( (isset($_GET['page'])) && (isset($checkPage[$_GET['page']])) ) {
    				include($checkPage[$_GET['page']]);	
    			} 	/* if $page has a value, include it */
    			else {
    				include('bienvenue.php');	
    			}
    		?>
    	</body>
    </html>

  12. #12
    Membre régulier
    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
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    Il n'y a vraiment personne qui puisse m'aider ?

  13. #13
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 201
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 201
    Points : 8 426
    Points
    8 426
    Billets dans le blog
    17
    Par défaut
    Ton projet manque de structure (accès aux données et affichage sont mélangés), dans ces conditions ce n'est pas facile d'avoir une solution simple et élégante à la fois
    Les moteurs de temple proposent des placeholders pour répondre à ce genre de problème.
    Avec Blade (moteur de Laravel), il faudrait faire un simple @section ou @push.

    Avec l'existant il modifier le title et y ajouter la rechercher de titre selon l'ID en paramètre :

    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
    <title><?php
    	if (isset($_GET['series'])) { // ID série défini dans l'URL ?
    		$sql = '... CHERCHER TITRE ...';
                    ...
                    echo ...;
    	} elseif ( (isset($_GET['category'])) && (isset($checkTitle[$_GET['category']])) ) {
    		echo $checkTitle[$_GET['page']].' - '.$checkTitle[$_GET['category']];
    	}
    	elseif( (isset($_GET['page'])) && (isset($checkTitle[$_GET['page']])) && (isset($_GET['title']))) {
    		echo $checkTitle[$_GET['page']].' - '.$_GET['title'];
    	}
    	elseif( (isset($_GET['page'])) && (isset($checkTitle[$_GET['page']])) && (isset($_GET['letter']))) {
    			echo $checkTitle[$_GET['page']].' - '.$_GET['letter'];
    	}
    	elseif( (isset($_GET['page'])) && (isset($checkTitle[$_GET['page']])) ) {
    			echo $checkTitle[$_GET['page']];
    	}
    	else {
    		echo 'Accueil';
    	}
    ?></title>

  14. #14
    Membre régulier
    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
    Points : 78
    Points
    78
    Par défaut
    Je te remercie, Séb.

    Ne reste plus qu'à afficher un page d'erreur si l'utilisateur entre un paramètre manuellement. Là, je patauge.

    Ton projet manque de structure (accès aux données et affichage sont mélangés)
    Je ne sais pas comment faire autrement.

Discussions similaires

  1. faire des liens avec le resultat de ma requete mysql
    Par rane dans le forum Requêtes
    Réponses: 12
    Dernier message: 10/03/2006, 17h29
  2. vue avec variable en paramètre
    Par yayooyayoo2005 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 27/02/2006, 14h25
  3. [VB6] Déclaration d'un tableau avec variable en paramètre.
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 23/10/2005, 12h21
  4. Réponses: 9
    Dernier message: 24/05/2005, 16h34
  5. Problème à l'édition des liens avec BCC55 et Xerces
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/11/2003, 14h50

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