
|
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 :
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 "&". */
?>
<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
|