corrections et exrcice + login.php

master
Juan 3 years ago
parent 67ea12ce16
commit 80ed556a26

@ -12,6 +12,7 @@
}
?>
<head>
<meta charset="utf-8">
<title><?php echo $titre_de_la_page ?></title>
<style>
body { font-family:sans-serif; font-size:10px; }

@ -4,8 +4,8 @@
Dans blog/index.php
reprendre l'exemple de l'insertion d'articles
pour insérer un commentaire si il n'y a pas d'erreur
avec une requête préparée.
pour insérer un commentaire si il n'y a pas
d'erreur avec une requête préparée.
Etapes :
@ -14,12 +14,20 @@ Etapes :
/b1-bak/session2/blog/commentaire.sql
sur le git du cours
2. faire une sertion via phpmyadmin pour récupérer
le sql d'une insertion de commentaire
2. faire une sertion via phpmyadmin pour
récupérer le sql d'une insertion de
commentaire
3. modifier le php pour utiliser cette requete
d'insertion de façon "préparée"
--------
Toujours dans blog/index.phpmyadmin
Sous le formulaire afficher le premier
commentaire
---------
Construire une authentification

@ -0,0 +1,173 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<title>Mon Blog</title>
<style>
body { font-family:sans-serif; font-size:10px; }
.error { background-color:#FFCC99;}
.success { background-color:#99FF99;}
.comments { margin-top : 2rem; }
</style>
</head>
<body>
<h1>Mon Blog</h1>
<!-- article -->
<article>
<?php
// utliser mysqli pour se connecter à la base de donnée
// pour mémoire https://www.php.net/manual/fr/book.mysqli.php
// se connecter
// à savoir par défait sur une installation xampp
// l'utilisateur "root" est définit avec un mot de passe vide
// https://www.php.net/manual/fr/mysqli.quickstart.connections.php
$mysqli = new mysqli("localhost", "root", "", "b1bak");
// si une erreur se produit alors un numero d'erreur est intialisé
if ($mysqli->connect_errno) {
echo "Échec lors de la connexion à MySQL : (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
//sinon on est connecté
else {
echo "connecté à ";
}
echo $mysqli->host_info . "\n";
// aller chercher le premier article dans la table article
// SELECT * FROM `article`
// appeler la méthode query de mysqli
// https://www.php.net/manual/fr/mysqli.quickstart.statements.php
$resultat = $mysqli->query('SELECT * FROM `article`');
// récupérer le premier l'article.
$ligne_de_resultat = $resultat->fetch_array(MYSQLI_ASSOC);
// afficher en deboguage mon resultat
/*
echo "<pre>";
print_r($ligne_de_resultat);
echo "</pre>";
*/
// afficher l'article
?>
<h2><?php echo $ligne_de_resultat['titre']; ?></h2>
<p><?php echo $ligne_de_resultat['contenu']; ?></p>
<footer class="date">publié le <?php echo $ligne_de_resultat['date']; ?></footer>
</article>
<?php
//print_r($_POST);
// si le pseudo n'est pas déifnit l'intialiser à vide
$pseudo = "";
$erreur_pseudo = false;
// sinon récupérer le pseudo
if(!empty($_POST['pseudo']))
{
$pseudo = $_POST['pseudo'];
}
//si le champs est vide mais initialisé alors c'est une erreur
elseif(isset($_POST['pseudo']))
{
$erreur_pseudo = true;
}
// si l'email n'est pas déifnit l'intialiser à vide
$email = "";
$erreur_email = false;
// sinon récupérer l'email
if(!empty($_POST['courriel']))
{
$email = $_POST['courriel'];
//vérrifier avec une expression rationnelle que c'est bine un email
// version compliquée :^([a-zA-Z0-9]+(([\.\-\_]?[a-zA-Z0-9]+)+)?)\@(([a-zA-Z0-9]+[\.\-\_])+[a-zA-Z]{2,4})$
if(!preg_match('/^[a-zA-Z0-9]+@[a-zA-Z0-9-_]+\.[a-zA-Z0-9]+$/',$email)) {
$erreur_email = true;
}
}
// si le commentaire n'est pas déifnit l'intialiser à vide
$commentaire = "";
$erreur_commentaire = false;
// sinon récupérer le commentaire
if(!empty($_POST['commentaire']))
{
$commentaire = $_POST['commentaire'];
// s'assurer qu'il n y'a pas de script ou d'attaque dedans
//$commentaire = htmlentities($commentaire);
$commentaire = strip_tags($commentaire);
//print_r($commentaire);
//si une fois qu'on asupprimé les tags il ne reste rien c'est une erreur
if(empty($commentaire))
{
$erreur_commentaire = true;
}
}
elseif(isset($_POST['commentaire']))
{
$erreur_commentaire = true;
}
// il n'y a pas d'erreur si aucun des champs est en erreur.
if(!($erreur_commentaire || $erreur_email || $erreur_pseudo)) {
// on prépare la requete sql, après insertion dans phpmyadmin on cette instruction exemple :
// INSERT INTO `commentaire` (`id_comentaire`, `article_id`, `pseudo`, `mail`, `commentaire`) VALUES (NULL, '<identifiant>', '<pseudo>', '<email>', '<commentaire>');
// ce qui nous donne la requête préparée :
$requete = $mysqli->prepare("INSERT INTO `commentaire` (`id_comentaire`, `article_id`, `pseudo`, `mail`, `commentaire`) VALUES (NULL, ?, ?, ?, ?)");
//ensuite on lie les paramètres approprié.
//l'identifiant de l'article on l'a avec la première requete pour afficher le blog, c'est $ligne_de_resultat['id_article']. C'est un entier
//les autre champs on les a vérifié ce sont des chaines.
//pour liés les paramètre on commence par décrire les types
//ce sera donc entier, chaine, chaine, chaine soit integerstringstringstring soit isss
//l'instruction de bin est donc :
$requete->bind_param('isss',$ligne_de_resultat['id_article'],$pseudo,$email,$commentaire);
$resultat = $requete->execute();
if($resultat) {
echo "<div class='success'>Commentaire enregistré !</div>";
$pseudo = $mail = $commentaire = "";
}
else {
echo "<div class='error'>Error description: ".$mysqli -> error."</div>";
}
}
?>
<div class="comments">
<form action="" method="post">
<label for="pseudo">votre pseudo</label>
<br/>
<?php
if($erreur_pseudo)
{
echo "<div class='error'>Vous devez saisir un pseudo</div>";
}
?>
<input type="text" required
id="pseudo"
name="pseudo"
value="<?php echo $pseudo; ?>" />
<br/>
<label for="courriel">votre courriel</label>
<br/>
<?php
if($erreur_email)
{
echo "<div class='error'>Vous devez saisir un email valide</div>";
}
?>
<input type="email" id="courriel"
name="courriel"
value="<?php echo $email; ?>" />
<br/>
<label for="commentaire">votre commentaire</label>
<br/>
<?php
if($erreur_commentaire)
{
echo "<div class='error'>Vous devez saisir un commentaire (html non autorisé)</div>";
}
?>
<textarea required
id="commentaire" name="commentaire"><?php
echo $commentaire;
?></textarea>
<br/>
<button type="submit">envoyer</button>
</form>
</div>
</body>
</html>

@ -4,6 +4,10 @@
<title>Mon Blog</title>
<style>
body { font-family:sans-serif; font-size:10px; }
.error { background-color:#FFCC99;}
.success { background-color:#99FF99;}
.comments { margin-top : 2rem; }
</style>
</head>
@ -80,6 +84,7 @@
}
// si le commentaire n'est pas déifnit l'intialiser à vide
$commentaire = "";
$erreur_commentaire = false;
// sinon récupérer le commentaire
if(!empty($_POST['commentaire']))
{
@ -89,6 +94,40 @@
$commentaire = strip_tags($commentaire);
//print_r($commentaire);
}
//si le champs est vide mais initialisé alors c'est une erreur
elseif(isset($_POST['commentaire']))
{
$erreur_commentaire = true;
}
if(!empty($_POST['commentaire']) && !($erreur_commentaire || $erreur_email || $erreur_pseudo))
{
$sql = "INSERT INTO `commentaire` (`id_comentaire`, `article_id`, `pseudo`, `mail`, `commentaire`)
VALUES (NULL, ?, ?, ?, ?); ";
$requete = $mysqli->prepare($sql);
//ensuite on lie les paramètres approprié.
//l'identifiant de l'article on l'a avec la première requete pour afficher le blog, c'est $ligne_de_resultat['id_article']. C'est un entier
//les autre champs on les a vérifié ce sont des chaines.
//pour liés les paramètres on commence par décrire les types
//ce sera donc entier, chaine, chaine, chaine soit integerstringstringstring soit isss
//l'instruction de bind est donc :
$requete->bind_param('isss', $ligne_de_resultat['id_article'],$pseudo,$email,$commentaire);
$resultat = $requete->execute();
if($resultat) {
echo "<div class='success'>Commentaire enregistré !</div>";
$pseudo = "";
$email = "";
$commentaire ="";
// ecriture aletrnative :
$pseudo = $email = $commentaire ="";
}
else {
echo "<div class='error'>Error description: " . $mysqli->error. "</div>";
echo $sql;
}
}
?>
</pre>
<div class="comments">
@ -128,5 +167,33 @@
<button type="submit">envoyer</button>
</form>
</div>
<div>
<h2>Commentaires</h2>
<?php
// aller chercher le premier commentaire dans la table article
// SELECT * FROM `commentaire`
//en convertissant en entier je m'assure la variable
// $ligne_de_resultat['id_article'] ne contient pas de code SQL ou de caractère posant problème.
$resultat = $mysqli->query('SELECT * FROM `commentaire` WHERE `article_id` = '.((int)$ligne_de_resultat['id_article']).' ');
// récupérer le premier l'article.
$ligne_de_resultat = $resultat->fetch_array(MYSQLI_ASSOC);
// afficher en deboguage mon resultat
/*
echo "<pre>";
print_r($ligne_de_resultat);
echo "</pre>";
*/
//afficher les commentaires
//echo "<br/>".$resultat->num_rows." commentaires";
while ( $ligne_de_resultat = $resultat->fetch_array(MYSQLI_ASSOC) )
{
echo "<h3>".$ligne_de_resultat['pseudo']."</h3>";
echo "<p>".$ligne_de_resultat['commentaire']."</p>";
}
?>
</div>
</body>
</html>

@ -0,0 +1,44 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Simple HTML document</title>
<style>
body { font-family:sans-serif; font-size:10px; }
.error { background-color:#FFCC99;}
.success { background-color:#99FF99;}
</style>
</head>
<body>
<!-- validateur -->
<h1>Connexion</h1>
<!-- faire un formulaire de connexion permettant à l'internaute de saisir un login et un mot de passe -->
<!-- le formulaire sera soumis en "POST" -->
<form action="" method="POST">
<label for="pseudo">Votre login :</label>
<input type="text" name="pseudo" id="pseudo"/>
<br/>
<label for="pass">Votre mot de passe :</label>
<input type="password" name="pass" id="pass"/>
<input type="submit" id='submit' value='LOGIN' >
</form>
<?php
// afficher le login saisit par l'utilisateur
echo "Bienvenue ".$_POST['pseudo'];
echo " et c'est le numero ".rand(1,19)." qui donne le code";
// 1 me connecter à ma base de donnée
// 2 exécuter une requete de recherche
// de la forme :
// SELECT * FROM `utilisateur`
// WHERE `login` LIKE 'jo'
// mais avec le login que l'utilisateur
// à saisi à la place de jo
// dire si on trouve ou pas le résultat
?>
</body>
</html>
Loading…
Cancel
Save