Aller au menu - Aller au contenu
Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !

TP PHP all in 1

mise en pratique des exercices du cours php de matéo

Pour accéder à cette section
Connectez-vous !
connexion_rpx

Offre d'emploi : Développeur Web PHP/Drupal (H/F)

Page 1 
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1 
Hors ligne loulou85 # Posté le 21/08/2011 à 14:33:38
Avatar

Bonjour à tous!
J'ai réalisé une mise en pratique rassemblant les exercices du cours PHP de Matéo et je vous fournis donc l'ensemble de ma réalisation pour ceux que ça intéressent.. notamment les débutants (comme moi) je pense.
Avant ça voici ce que mon TP permet de faire :
--> affichage des dernières news (comme le TP miniblog)
--> possibilité de poster des commentaires sur les news et de voir les commentaires
--> système de pagination pour afficher les news (moi j'ai pris 4 news par page)
--> possibilité d'accéder à une page administration protéger par mot de passe afin de poster de nouvelles news
--> on peut poster plusieurs news à la suite sans se ré-identifier grâce au session
--> utilisation d'un BBcode pour personnaliser le texte des news, des commentaires..

Voilà, comme je vous l'avais dis, ce TP reprend l'ensemble du cours de matéo et permet de s'entrainer en mettant tout cela en pratique.. à l’exception de la création d'image et la programmation orientée objet.
Avant de vous proposer ma solution, il serait bon que vous essayé de réaliser ce TP vous même.. le plus difficile d'après moi est l'utilisation des sessions pour poster plusieurs news à la suite.

Voici quelque screen des résultats de mon TP :
Image utilisateur Image utilisateur
Image utilisateur Image utilisateur
Image utilisateur Image utilisateur

Maintenant place ma solution ^^ :
Secret (cliquez pour afficher)
Index.php :
Code : PHP
  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
<?php
// On démarre la session AVANT d'écrire du code HTML
session_start();		
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
	<head>
		<title>Bienvenue</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" meta="screen" type="text/css" title="site_web" href="news.css" />
	</head>
	<body id="body_news"> 
	<div id="corps_news">
	
		<?php
			/*connection à la BDD*/
			try
			{
				$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
							$bdd = new PDO('mysql:host=localhost;dbname=news', 'root', '', $pdo_options);
			}
			catch(Exception $e)
			{
				die('Erreur :'.$e->getMessage());
			}
			
			
			$billets_par_page = 4; // détermine le nombre de billets par page
			
			$req = $bdd->query('SELECT COUNT(*) AS nb_billet FROM billets');// On récupère le nombre de billets de la table
			$donnees = $req->fetch();
			$nb_billet = $donnees['nb_billet']; // Change le nom de la variable
			$req->closeCursor();
			
			$nb_page = ceil($nb_billet / $billets_par_page); /*Calcule le nombre de page dont on à besoin en fonction de nb_billet et billets_par_page
			La fonction ceil arrondi la division au supérieur ce qui est intéressant pour pouvoir calculer le nombre de page nécessaires*/
			
			
			if(empty($_GET['page'])) // Si l'utilisateur vient d'arriver alors $_GET['page'] vaut NULL donc on le mettra sur la premiere page
				$_GET['page'] = 1;
							
							
			if($_GET['page'] >= 1 && $_GET['page'] <= $nb_page) // Cette condition permet juste de vérifier que le $_GET n'a pas une valeur "bidon"
			{
				$id = ($billets_par_page * $_GET['page']) - $billets_par_page; // Calcule permettant d'établir l'entrée a partir de laquelle on va lire les billets sur la page.
			
				$reponse = $bdd->query('SELECT id,titre,contenu,auteur,DATE_FORMAT(date_creation,\'Le %d/%m/%Y à %Hh%imin%ss\') AS date_fr FROM billets ORDER BY id  DESC LIMIT '.$id.','.$billets_par_page.'');
				/* au dessus, $id nous permettra de lire les données à partir de l'entrée correspondante.
				exemple : si mon nombre de billets par page est de 4, quand le visiteur sera a la page 1, $id vaudra 0, et on lira
				les 4 billets les plus récents. A la page 4, $limite vaudra 4, on lira les 4 suivants, etc, ...*/
				
		?>		<h1>News : </h1>
		<?php	

					include("fonctions.php"); //ici j'appel la page ou est écrite ma fonction permettant de faire le BBcode..
							
					while($donnees = $reponse->fetch())	// Boucle pour afficher les news
					{
						$contenu = htmlspecialchars($donnees['contenu']);
						$titre = htmlspecialchars($donnees['titre']);	
						$auteur = htmlspecialchars($donnees['auteur']);
						$date_fr = htmlspecialchars($donnees['date_fr']);
						
						$contenu=preg_replace('#\[img\](.+)\[/img\]#','<img src="$1" />',$contenu); 
				/* J'ai vonlontairement placer ce remplacement ici puisque je souhaite l'insertion d'image possible UNIQUEMENT dans mes contenus 
				et non dans mes titres, mes commentaires, pseudos... */
						
						$contenu= preg_replace('#(?:(?:https?|ftp)://|www\.)[\w]+[\w.-]*\.\w{2,}(?:/(?:[\w./=%+?~&;-])*)?#i', '<a href="$0">$0</a>',$contenu);
				/* EXPLICATIONS : l'adresse doit commencer par http(s):// ou ftp:// ou www. puis être suivit d'un nom de domaine commençant par au moins par une lettre
				suivit par des lettres et/ou des . et/ou des - ensuite extention avec un . et minimum 2lettres. Pour finir, en facultatif, un / après le nom de domaine 
				qui peut être suivit par n'importe quelle lettre et caractère plusieurs fois. Le tout utilisé avec l'option "i" pour accepter les minuscules comme les majuscules */
				
				/* Ici je souhaite avoir des url cliquable UNIQUEMENT dans mes contenus et non dans mes titres, mes commentaires, pseudo... 
					IMPORTANT : ne pas oublié de mettre le ";" comme caractère dans le regex puisque suite à la transformation par htmlspecialchars le "&" devient "&amp;". */
						
						
		?>																									
						<div class= "news">
							<?php $titre = Remplace($titre); // remplace le contenu de ma variable "brute" par le contenu modifié par les regex
							    echo '<p id="titre">'.$titre. '</p> <br/>';
								$contenu = Remplace($contenu);
								echo '<p id="contenu">'.$contenu.'</p> <br/><br/>'; 
								$auteur= Remplace($auteur);
								echo '<p id="auteur">Par : '.$auteur.'</p>'; 
								echo '<p id="date_fr">'.$date_fr.'</p> <br/>'; 
								?>
									  
								<a href = "commentaires.php?billet=<?php echo htmlspecialchars($donnees['id']);?>"><em>Commentaires</em></a>
							</p>
						</div>
		<?php
					}
				$reponse->closeCursor();
			}
				
			else // Ce else me permet d'afficher un message au cas ou le visiteur ai entré dans l'URL un numero de page invalide.
			{	
				echo '<strong> Numéro de page invalide! </strong> <br/>';
			}		
			
			echo '<br/><br/><br/>le nombre de billets totaux est de : '.$nb_billet.'<br/><br/>';			
				
			for($i=1;$i<= $nb_page;$i++) //On fait une boucle aprés avoir obtenu le nb_page exacte pour ensuite afficher les numéros de pages et faire les liens
			{
		?>
				<a href ="index.php?page=<?php echo $i;?>" <?php if(isset($_GET['page']) && $_GET['page'] == $i) echo 'class="active"';?> ><?php echo $i.' ';?></a>
				<!-- Au dessus, le if permet d'attribuer la class "active" au lien de la page actuellement ouverte, 
				afin par exemple de le mettre en gras pour que l'utilisateur repère bien sur quelle page il se situe -->
		<?php
			}
			
		?><br/><br/><br/>
		<a href="/news/admin/login.php">Espace Administrateur <a>
	
	</div>
	</body>
</html>


Commentaires.php :
Code : PHP
  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
<?php
// On démarre la session AVANT d'écrire du code HTML
session_start();		
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
	<head>
		<title>Commentaires</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" meta="screen" type="text/css" title="site_web" href="news.css" />
	</head>
	<body id="body_news">
	<div id="corps_news">
	
		<h1>News : </h1><br/>
		
		<?php
			try
			{
				$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
				$bdd = new PDO('mysql:host=localhost;dbname=news', 'root', '', $pdo_options);
			}
			catch(Exception $e)
			{
				die('Erreur :'.$e->getMessage());
			}
				
			if(!empty($_GET['billet'])) // Vérifie que le billet existe
			{
				$req = $bdd->prepare('SELECT titre,contenu,auteur,DATE_FORMAT(date_creation,\'Le %d/%m/%Y à %Hh%imin%ss\') AS date_fr FROM billets  WHERE id = ?  LIMIT 0,5');
				$req->execute(array($_GET['billet']));
				$donnees = $req->fetch();
					
				include("fonctions.php"); //ici j'appel la page ou est écrite ma fonction permettant de faire le BBcode..
					
				$contenu = htmlspecialchars($donnees['contenu']);
				$titre = htmlspecialchars($donnees['titre']);	
				$auteur = htmlspecialchars($donnees['auteur']);
				$date_fr = htmlspecialchars($donnees['date_fr']);
						
				$contenu=preg_replace('#\[img\](.+)\[/img\]#','<img src="$1" />',$contenu); 
			/* J'ai vonlontairement placer ce remplacement ici puisque je souhaite,l'insertion d'image possible uniquement dans mes contenu et non dans mes titre également */
		?>
				<div class= "news"> <!-- Affiche le billet à commenter -->
					<?php $titre = Remplace($titre); // remplace le contenu de ma variable "brute" par le contenu modifié par les regex
						echo '<p id="titre">'.$titre. '</p> <br/>';
							$contenu = Remplace($contenu);
						echo '<p id="contenu">'.$contenu.'</p> <br/><br/>'; 
							$auteur = Remplace($auteur);
						echo '<p id="auteur">Par : '.$auteur.'</p> <br/>'; 
						echo '<p id="date_fr">'.$date_fr.'</p> <br/><br/>'; 
						?>
					
				</div>
				
					<h2>Commentaires : </h2>
		<?php
				$req->closeCursor();
			}
		?>
		<?php
			$req = $bdd->prepare('SELECT pseudo,commentaire,DATE_FORMAT(date_commentaire,\'Le %d/%m/%Y à %Hh%imin%ss\') AS date_commentaire_fr FROM commentaires WHERE id_billet = ? ORDER BY id');
			$req->execute(array($_GET['billet']));								
				
			while($donnees = $req->fetch()) // Boucle pour afficher les commentaires tant qu'il y en a
			{
				$pseudo = htmlspecialchars($donnees['pseudo']);
				$date_com = htmlspecialchars($donnees['date_commentaire_fr']);
				$commentaire= htmlspecialchars($donnees['commentaire']);
				
					$pseudo = Remplace($pseudo);
				echo '<p id="pseudo"> de : '.$pseudo.'</p>';
				echo '<p id="date_com">'.$date_com.'</p>';
					$commentaire = Remplace($commentaire);
				echo '<p id="commentaire">'.$commentaire.'</p> <br/>';
						
			}
			$req->closeCursor();
			
		?>	<!-- Formulaire pour poster un nouveaux commentaire -->
			<form method = "post" action = "commentaires_post.php?billet=<?php echo $_GET['billet'];?>">	
				<p>
					<label for = "pseudo"><strong>Votre pseudo :</strong></label>
					<input type = "text" name = "pseudo" id = "pseudo" value='pseudo' onclick='this.value=""'/><br/> 
					<!-- Le "onclick" est un évènement JS permettant d'effacer la valeur par défaut dans la zone une fois cliquée -->
					<label for = "commentaire"><strong>Commentaire :</strong></label><br/>

					
					<script>				//Ce script permet seulement d'effacer au PREMIER click seulement la valeur par défaut de ma zone texte
						function erase(val)
							{
								if (val == "Votre commentaire...") return "";
								return val;
							}
					</script>
					<textarea type ="text" name = "commentaire" id = "commentaire" rows ="8" cols="45" onclick='this.value=erase(this.value)'>Votre commentaire...</textarea><br/>
					
					
					<input type = "submit" value = "Poster Votre Commentaire"/><br/>
					<p id="note_com"> Notification, utilisation du BBcode : <br/>
						Si vous souhaitez mettre du texte en gras, il faut placer votre texte entre [gras] et [/gras], <br/>
						--> Pour l'italique faire pareil mais avec [italique] [/italique], <br/>
						
						--> Pour la couleur pareil mais avec [color=<em>nom_couleur</em>] [/color], remplacer <em>nom_couleur</em> par red|green|blue|yellow|purple ou olive, <br/>
						--> Les smileys les plus courants sont automatiquement pris en charges.
					</p>
				</p>
			</form>	
			<a href='/news/index.php'>Retour aux news <a> <br/>
	
	</div>
	</body>
</html>


Commentaires_post.php :
Code : PHP
 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
<?php
// On démarre la session AVANT d'écrire du code HTML
session_start();		
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
	<head>
		<title>Commentaires_post</title>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<link rel="stylesheet" meta="screen" type="text/css" title="site_web" href="news.css" />
	</head>
	<body>
	
		<?php
			try
			{
				$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
							$bdd = new PDO('mysql:host=localhost;dbname=news', 'root', '', $pdo_options);
			}
			catch(Exception $e)
			{
				die('Erreur :'.$e->getMessage());
			}
			
			if(!empty($_GET['billet']) AND !empty($_POST['pseudo']) AND !empty($_POST['commentaire'])) // Condition pour vérifier que l'utilisateur à entré son commentaire correctement
			{
				$req = $bdd->prepare('INSERT INTO commentaires(id_billet,pseudo,commentaire,date_commentaire) VALUES(?,?,?,NOW())') or die(print_r($bdd->errorInfo())); // Insert les données voulues dans la BDD ou affiche les éventuelles erreurs
				$req->execute(array(htmlspecialchars($_GET['billet']),htmlspecialchars($_POST['pseudo']),htmlspecialchars($_POST['commentaire'])));
				header('Location:commentaires.php?billet='.$_GET['billet'].'');	// Redirection automatique vers la page commentaire du billet concerné après l'insertion du commentaire
				$req->closeCursor();
			}	
		?>
		
	</body>
</html>


Fonctions.php :
Code : PHP
 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
<!-- ATTENTION, ne pas mettre session_start(); sur cette feuille puisqu'elle vas être appelée dans une autre page et on ne peut pas ouvrir 2 fois les session -->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
	<head>
		<title>Fonctions</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" meta="screen" type="text/css" title="site_web" href="news.css" />
	</head>
	<body>
	
		<?php
			// On fait tout nos remplacement avec les regex (BBcode, smiley)
			function Remplace($nom)
			{
				$nom=preg_replace('#\[gras\](.+)\[/gras\]#isU','<strong>$1</strong>',$nom);	
				$nom=preg_replace('#\[italique\](.+)\[/italique\]#isU','<em>$1</em>',$nom);
				$nom=preg_replace('#\[color=(red|purple|green|blue|yellow|olive)\](.+)\[/color\]#isU', '<span style="color: $1">$2</span>', $nom);
				$nom=str_replace(':)','<img src="/news/smiley/icon_smile.gif" />',$nom);
				$nom=str_replace(':D','<img src="/news/smiley/icon_biggrin.png" />',$nom);
				$nom=str_replace('O_O','<img src="/news/smiley/icon_eek.gif" />',$nom);
				$nom=str_replace(':lol','<img src="/news/smiley/icon_lol.gif" />',$nom);
				$nom=str_replace('^^','<img src="/news/smiley/icon_razz.gif" />',$nom);
				$nom=str_replace(":'(",'<img src="/news/smiley/icon_sad.gif" />',$nom);
				$nom=str_replace(";)",'<img src="/news/smiley/icon_wink.gif" />',$nom);
				$nom=str_replace(":p",'<img src="/news/smiley/icon_tire_langue.gif" />',$nom);
				$nom=str_replace("\n",'<br/>',$nom); // Pour que les retours à la ligne (entrée) se fasse comme voulu
				
				return $nom;
								
			}
		?>
						
	</body>
</html>


Login.php :
Code : PHP
 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
<?php
// On démarre la session AVANT d'écrire du code HTML
session_start();		
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
		<title>Identification</title> 
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" media="screen" type="text/css" title="test_css" href="news.css" />
   </head>
   <body>
   
		<h1>Attention!</h1>
		<p>
			<?php 
			echo "Pour accéder à la page administrateur veuilliez compléter les informations ci-dessous : "; 
				
			?> 	<!-- Formulaire d'identification de l'utilisateur -->
				<form method="post" action="/news/admin/admin.php"><br/>
					<p>
						<fieldset>
							<legend> Identification </legend>
							<label for="login"> Nom d'utilisateur? </label> <br/>
							<input type="text" name="login" id="login" value="utilisaeur?" size="20" maxlength="20" onclick='this.value=""'/> <br/>
							<label for="mdp"> Quel est le mot de passe? </label> <br/>
							<input type="password" name="mdp" id="mdp" size="20" maxlength="20" value="alors???" onclick='this.value=""'/><br/>
							<input type="submit" value="valider" />
						</fieldset>
					</p>
				</form> 
					
				<a href='/news/index.php'>Retour aux news <a> <br/>

   </body>
</html>


Admin.php :
Code : PHP
 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
<?php
// On démarre la session AVANT d'écrire du code HTML
session_start();		
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
	<head>
		<title>Page Adstrateur</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" meta="screen" type="text/css" title="site_web" href="/news/news.css" />
	</head>
	<body>
		
		<?php
			try
				{
					$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
								$bdd = new PDO('mysql:host=localhost;dbname=admin', 'root', '', $pdo_options);
				}
				catch(Exception $e)
				{
					die('Erreur :'.$e->getMessage());
				}
				
				
				if(isset($_POST['mdp'], $_POST['login']) && $_POST['mdp'] !== '' && $_POST['login'] !== '') // donne les restrictions pour accéder à la page
				{
					$rep = $bdd->prepare('SELECT login, mdp FROM admin WHERE login = ? AND mdp = ?');
					$rep->execute(array($_POST['login'], $_POST['mdp']));
					
					if($info = $rep->fetch()) // Si le login et le mdp donné par l'utilisateur sont correctes alors il y aura une entrée dans le tableau, donc la condition sera VRAI
					{	
						$_SESSION['login'] = $_POST['login'];	//On définit nos variables pour la session afin que le loginet le mdp soit conservé pendant toute la navigation
						$_SESSION['mdp'] = $_POST['mdp'];
						$rep->closeCursor();
					}	
				}
				
				if(isset($_SESSION['mdp'])&& isset($_SESSION['login']))	// Si les 2 If précédents ont été correctement passé, alors cette condition est VRAI
				{
					
			?> 			<!-- Maintenant que l'on à vérifié que l'utilisateur pouvais accéder à la page, on peut l'afficher --> 			
					<h1>Espace Administrateur</h1>
					
						<!-- pour ajouter de nouveaux billets : -->
						<form method = "post" action = "billets_post.php">
							<p>
								<label for = "titre"><strong>Ajouter une news :</strong></label>
								
								<script>						//Ce script permet seulement d'effacer au PREMIER click seulement la valeur par défaut de ma zone texte
									function ecrase(value)
									{
									  if (value == "titre") return "";
									  return value;
									}
								</script>						
								<input type = "text" name = "titre" id = "titre" value="titre" onclick='this.value=ecrase(this.value)'/><br/>
								
								<label for = "contenu"><strong>Contenu :</strong></label><br/>
								
								<script>						
									function erase(val)
									{
									  if (val == "ICI votre texte...") return "";
									  return val;
									}
								</script>								
								<textarea name = "contenu" id = "contenu" rows ="8" cols="45" onclick='this.value = erase(this.value)'>ICI votre texte...</textarea><br/>
								<input type= "text" name = "auteur" id = "auteur" value="auteur" onclick='this.value=""' />
								<input type = "submit" value = "Enregistrer" /> <br/>
								
								<p id="note_admin"> Notification, utilisation du BBcode : <br/>
									Si vous souhaitez mettre du texte en gras, il faut placer votre texte entre [gras] et [/gras], <br/>
									--> Pour l'italique faire pareil mais avec [italique] [/italique], <br/>
									--> Pour la couleur pareil mais avec [color=<em>nom_couleur</em>] [/color], remplacer <em>nom_couleur</em> par red|green|blue|yellow|purple ou olive, <br/>
									--> Pour les images pareil mais avec [img] [/img] <br/>
									--> Les smileys les plus courants sont automatiquement pris en charges.
								</p>
							</p> 
						</form>
						
						<a href='/news/index.php'>Retour aux news <a> <br/>
			<?php
				}
					
				else	// Si l'utilisateur n'a pas entré les bons identifiants
				{
					echo'<h1>Champs incorrects</h1>';
			?>			<a href='/news/admin/login.php'>Retour à la page login <a> <br/>
						<a href='/news/index.php'>Retour aux news <a> <br/>
			<?php
				}
			
			?>	
	
		
	</body>
</html>


Billets_post.php :
Code : PHP
 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
// On démarre la session AVANT d'écrire du code HTML
session_start();		
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
	<head>
		<title>billets_post</title>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<link rel="stylesheet" meta="screen" type="text/css" title="site_web" href="news.css" />
	</head>
	<body>
	
		<?php
			try
				{
					$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
								$bdd = new PDO('mysql:host=localhost;dbname=news', 'root', '', $pdo_options);
				}
				catch(Exception $e)
				{
					die('Erreur :'.$e->getMessage());
				}
				
				
			if(!empty($_POST['titre']) AND !empty($_POST['contenu'])) // Vérifie que l'utilisateur à poster correctement la news
			{
				$req = $bdd->prepare('INSERT INTO billets(titre,contenu,auteur,date_creation) VALUES(?,?,?,NOW())') or die(print_r($bdd->errorInfo())); // Insert les données voulues dans la BDD ou affiche les éventuelles erreurs
				$req->execute(array(htmlspecialchars($_POST['titre']),htmlspecialchars($_POST['contenu']),htmlspecialchars($_POST['auteur'])));
				
				header("location: redirection.php"); // Redirection automatique vers la page redirection afin que l'utilisateur puisse choisir s'il veut reposter une news ou non
				$req->closeCursor();
			}
		?>
		
	</body>
</html>


Redirection.php :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// On démarre la session AVANT d'écrire du code HTML
session_start();		
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
	<head>
		<title>Redirection</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" meta="screen" type="text/css" title="site_web" href="news.css" />
	</head>
	<body>	
	
			<p> Veuilliez selectionner une option : <br/>
				<a href="/news/admin/admin.php">Poster une nouvelle news </a> <br/>
				<a href="/news/index.php">Retourner aux dernières news </a>
			</p>
				
	</body>
</html>


Et mon petit news.css, si vous voulez donner un peut de style :
Code : CSS
 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
#corps_news
{
   width: 800px; 
   margin: auto; 
   margin-top: 20px; 
   margin-bottom: 20px; 
   border: 2px dotted rgb(191,118,66);
   padding: 5px;
}
#titre
{
text-align: center;
color: teal;
font-size: 150%;
}

#contenu
{
font-size: 100%;
color: red;
text-indent: 30px;
}

#auteur
{

text-align:right;
font-size: 80%;
color: olive;

}

#date_fr
{
text-align: right;
font-size: 80%;
color: grey;
}

.active
{
font-weight: bold;


News.sql (à importer avec phpmyadmin sous wamp, regroupe les billets des news et les commentaires, il s'agit en fait de la même BDD que celle utilisé dans le TP miniblog du cours de matéo), j'ai utilisé une 2ème BDD appelée "admin" où figure les identifiants autorisés à l'accès de la zone administrateur (login et mot de passe)donc à vous de la créer celle ci puisque pour faire votre propre accès sécurisé :
Code : TeX
 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
-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Dim 21 Août 2011 à 18:41
-- Version du serveur: 5.5.8
-- Version de PHP: 5.3.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `news`
--

-- --------------------------------------------------------

--
-- Structure de la table `billets`
--

CREATE TABLE IF NOT EXISTS `billets` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `titre` varchar(255) NOT NULL,
  `contenu` text NOT NULL,
  `date_creation` datetime NOT NULL,
  `auteur` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=69 ;

--
-- Contenu de la table `billets`
--

INSERT INTO `billets` (`id`, `titre`, `contenu`, `date_creation`, `auteur`) VALUES
(1, 'Bienvenue sur mon blog !', 'Je vous souhaite à toutes et à tous la bienvenue sur mon blog qui parlera de... PHP bien sûr !', '2010-03-25 16:28:41', 'loulou'),
(2, 'Le PHP à la conquête du monde !', 'C''est officiel, l''éléPHPant a annoncé à la radio hier soir "J''ai l''intention de conquérir le monde !".\r\nIl a en outre précisé que le monde serait à sa botte en moins de temps qu''il n''en fallait pour dire "éléPHPant". Pas dur, ceci dit entre nous...', '2010-03-27 18:31:11', 'Thomas'),
(18, 'test [gras]tous[/gras] les smiley :) :p', ':)     :D\r\nO_O    ^^\r\n;)     :lol\r\n:''(    :p\r\n', '2011-08-17 21:14:48', 'loulou'),
(19, '[gras]test [/gras] [color=blue]couleurs [/color] et ;) :p :lol ...', 'blablabla', '2011-08-17 22:19:39', '[color=green]loulou[/color]'),
(20, 'l''insertion d''image est bloqué [img]ai_mini.jpg[/img]', 'Voilà mon image : [img]ai_mini.jpg[/img]', '2011-08-18 10:11:55', 'loulou'),
(68, 'test url', '[color=green]Toutes ces url [gras]marchent[/gras] :[/color]\r\nhttp://www.siteduzero.com\r\nhttps://siteduzero.com\r\nftp://siteduzero.com\r\nhttp://site-duzero.com\r\nwww.siteduzero.com/billet?=1+%&post=3.\r\nhttp://siteduzero.com/bilet&com\r\nwww.s-i-t-eduzero.com\r\nwww.s-.com\r\nwww.g.com (un nom de domaine à une lettre, impossible? impossible isn''t google ^^)\r\n\r\nCes url [gras]ne fonctionnent pas[/gras] :\r\nsiteduzero.com  (pas de http:// ou ftp:// ou www.)\r\nwww.site^duzero.com (le ^ n''est pas un caractère autorisé)\r\nwww.siteduzero (manque d''extention, comme .com)\r\nwww.-siteduzero.com (le nom de domaine doit commencer par un lettre)\r\n://siteduzero.com\r\n//siteduzero.com\r\nww.siteduzero.com\r\nwwwsiteduzero.com (manque le . après www)\r\nhttp:siteduzero.com (manque :// après http)\r\nwww.com (ici selon comment on interprète l''url, il manque soit le www. qui peut être ici considéré comme un nom de domaine, soit l’extension et c''est le .com qui est considéré comme nom de domaine)\r\n', '2011-08-20 17:42:25', 'loulou'),
(67, 'titre', 'ICI votre texte...', '2011-08-19 22:00:33', 'auteur'),
(66, 'Smileys dans le contenu et auteur en couleur', 'ICI votre texte...	:)     :D\r\nO_O    ^^\r\n;)     :lol\r\n:''(    :p', '2011-08-19 21:50:26', '[color=green]loulou[/color]');

-- --------------------------------------------------------

--
-- Structure de la table `commentaires`
--

CREATE TABLE IF NOT EXISTS `commentaires` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_billet` int(11) NOT NULL,
  `pseudo` varchar(255) NOT NULL,
  `commentaire` text NOT NULL,
  `date_commentaire` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=52 ;

--
-- Contenu de la table `commentaires`
--

INSERT INTO `commentaires` (`id`, `id_billet`, `pseudo`, `commentaire`, `date_commentaire`) VALUES
(1, 1, 'M@teo21', 'Un peu court ce billet !', '2010-03-25 16:49:53'),
(2, 1, 'Maxime', 'Oui, ça commence pas très fort ce blog...', '2010-03-25 16:57:16'),
(3, 1, 'MultiKiller', '+1 !', '2010-03-25 17:12:52'),
(4, 2, 'John', 'Preum''s !', '2010-03-27 18:59:49'),
(5, 2, 'Maxime', 'Excellente analyse de la situation !\r\nIl y arrivera plus tôt qu''on ne le pense !', '2010-03-27 22:02:13'),
(47, 15, 'loulou', 'Yo salut à toi!', '2011-08-17 18:52:00'),
(50, 18, '[gras][italique][color=olive]loulou ^^[/color][/italique][/gras]', 'Test [gras]gras[/gras] et [italique]italique[/italique] ainsi que la [color=purple]couleur[/color] sans oublier les smileys : :) ;) :lol ^^ :p :''( o_O :D', '2011-08-19 20:33:59');




Voilà tout, je tiens à remercier tout ceux qui m'ont aidé de près ou de loin pour la réalisation de ce TP et si vous avez des modifications n'hésitez pas à me les donner notamment en ce qui concerne la sécurité avec les htmlspecialchars puisque j'ai un peut de mal avec son utilisation ^^.

J'espère que ce TP vous à aidé!

Edit : insertion du code pour la BDD news avec les tables billets et commentaires

loulou
Édité le 21/08/2011 à 20:55:58 par loulou85

Ma vidéo de Space-painting ! ;)

Mon TP sur le php pour mettre en pratique les cours de matéo : c'est ici !
 
Publicité # Posté le 21/08/2011 à 14:33:38

Hors ligne simcos # Posté le 21/08/2011 à 16:52:10
Avatar

Ville : Albeuve
Pays : Suisse

je me souviens que tu avais promis de poster le résultat dans un post ou on t'avait aidé. Bonne innitiative que de montrer les améliorations que tu as pu effectuer.

ça permet aux autres Zer0 d'avoir un exemple. De demontrer qu'il ne faut pas forcément s'arrèter au code que l'on nous donne.
bravo

par contre pour pouvoir tester, il nous faut une description de tabe 'news', ou le code sql correspondant à leur création

Édité le 21/08/2011 à 17:10:58 par simcos

Le forum est fait pour poster vos questions. C'est pourquoi je ne répondrai à aucune question en MP. Mais je me ferai un plaisir de vous aider sur un topic du forum.

Une jeune équipe de développement Symfony2: PixyDev.fr
 
Hors ligne loulou85 # Posté le 21/08/2011 à 20:45:22
Avatar

Oui chose promise chose due!
Et je pense que le fait de poster l'ensemble des mes résultats permet de regrouper toutes les réponses aux questions que je me suis posé au même endroit et permettre ainsi à ceux qui se les poses aussi de trouver toutes les réponses..

Concernant les tables je vais rajouter le code sql correspondant.

Merci pour ton commentaire, ça fait plaisir de voir que j'ai pas posté pour rien ^^"


loulou

Ma vidéo de Space-painting ! ;)

Mon TP sur le php pour mettre en pratique les cours de matéo : c'est ici !
 

Retour au forum "PHP" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx


Lire aussi