Modules de news (et login)

Eléphanteau du PHP | 15 Messages

16 août 2013, 01:14

Bonjour... j'ai suivis un tuto pour faire un module news (simple!!!)

Pouvez-vous (si vous avez le temps et la patience) me dire si mon code n'est pas affreux?
Que dois-je faire pour l'améliorer?
J'ai déjà essayé de le tourner pdo...

Voici le code:


Liste_news.php
<!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>Liste des news</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <style type="text/css">
        h2, th, td
        {
            text-align:center;
        }
        table
        {
            border-collapse:collapse;
            border:2px solid black;
            margin:auto;
        }
        th, td
        {
            border:1px solid black;
        }
        </style>
    </head>
     
    <body>
  
<h2><a href="rediger_news.php">Ajouter une news</a></h2>
<?php

require_once 'connect.php';

if (isset($_POST['titre']) AND isset($_POST['contenu']))
{
    $titre = addslashes($_POST['titre']);
    $contenu = addslashes($_POST['contenu']);
 
    if ($_POST['id_news'] == 0)
    {
       $retour = $bdd->prepare("INSERT INTO mynews VALUES('', :titre, :contenu, '" . time() . "')");
       $retour->bindParam(':titre', $titre, PDO::PARAM_STR);
       $retour->bindParam(':contenu', $contenu, PDO::PARAM_STR);
       $retour->execute();
	 
    }
    else
    {
        $_POST['id_news'] = addslashes($_POST['id_news']);
        $retour = $bdd->prepare("UPDATE mynews SET titre=:titre, contenu=:contenu WHERE id='" . $_POST['id_news'] . "'");
		$retour->bindParam(':titre', $titre, PDO::PARAM_STR);
	   	$retour->bindParam(':contenu', $contenu, PDO::PARAM_STR);
	   	$retour->execute();
    }
}
  
if (isset($_GET['supprimer_news'])) // Si l'on demande de supprimer une news.
{
    
    $retour = $bdd->exec('DELETE FROM mynews WHERE id=\'' . $_GET['supprimer_news'] . '\'');
	
}
?>
<table><tr>
<th>Modifier</th>
<th>Supprimer</th>
<th>Titre</th>
<th>Date</th>
</tr>
<?php
$retour = $bdd->query('SELECT * FROM mynews ORDER BY id DESC LIMIT 0, 10');

while ($donnees = $retour->fetch(PDO::FETCH_OBJ))
{
?>
<tr>
<td><?php echo '<a href="rediger_news.php?modifier_news=' . $donnees->id . '">'; ?>Modifier</a></td>
<td><?php echo '<a href="liste_news.php?supprimer_news=' . $donnees->id . '">'; ?>Supprimer</a></td>
<td><?php echo stripslashes($donnees->titre); ?></td>
<td><?php echo date('d/m/Y', $donnees->timestamp); ?></td>
</tr>
<?php
} 
?>
</table>
</body>
</html>




rediger_news.php
<!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>R&eacute;diger une news</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <style type="text/css">
        h3, form
        {
            text-align:center;
        }
        </style>
    </head>
     
    <body>
<h3><a href="liste_news.php">Retour à la liste des news</a></h3>
<?php
require_once 'connect.php';

if (isset($_GET['modifier_news'])) // Si on demande de modifier une news.
{
    
    $retour = $bdd->query('SELECT * FROM mynews WHERE id=\'' . $_GET['modifier_news'] . '\'');
    $donnees = $retour->fetch(PDO::FETCH_OBJ);
    $titre = stripslashes($donnees->titre);
    $contenu = stripslashes($donnees->contenu);
    $id_news = $donnees->id; 
}
else 
{
    .
    $titre = '';
    $contenu = '';
    $id_news = 0; 
}
?>
<form action="liste_news.php" method="post">
<p>Titre : <input type="text" size="30" name="titre" value="<?php echo $titre; ?>" /></p>
<p>
    Contenu :<br />
    <textarea name="contenu" cols="50" rows="10">
    <?php echo $contenu; ?>
    </textarea><br />
     
    <input type="hidden" name="id_news" value="<?php echo $id_news; ?>" />
    <input type="submit" value="Envoyer" />
</p>
</form>
</body>
</html>

Trouvez vous mon code cohérent?
Merci pour votre aide ^^

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 août 2013, 10:35

Salut,

N'utilise pas de addslashes oui stripslashes, c'est inutile, la "protection" des données est faite par la requête préparée.

Si tu veux palier le problème des magic_quote deux solutions :
- désactiver les magic_quote colle ça t'es pas emmerdé (voir la doc pour un php.ini dans le répertoire ou par htaccess peux être).
- tester si les magic_quote sont activer et si oui utiliser un stripslashes pour virer ceux qui sont ajouter.


Ensuite les requêtes préparées ne sont pas forcément utile dans ton cas. C'est prévue pour une utilisation dans une boucle, pour action répétitive sur la base.
Tu peux donc construire la requête dans une variable et utiliser la méthode quote pour protéger les données.

Pour la gestion des erreurs tu peux utiliser un try / catch afin de capture les erreurs et les afficher / logger correctement et te permettre le debug et amélioration de ton code :)

Pour la validation, tu ne test pas l'existance de tous les Indes du tableau $_POST que tu utilise (id par exemple).

Personnellement je préfère utiliser empty plutôt que isset (test l'existence mais aussi le fait que la variable ne soit pas vide ).
Attention tu ne peux pas l'utiliser sur l'id qui peux être à zéro et, dans ce cas, la variable est considérée vide ;)

Pourquoi ne fait tu pas la validation du formulaire sur la page qui affiche le formulaire ?
Cela te permettrais de pouvoir ré afficher la saisie en cas d'erreur.

Ton code semble prévu pour traiter l'ajout et la modification mais le formulaire d'ajout ne traite pas ce cas.

Tous cela peux être traiter sur la même page, il faut gérer le cas où l'id n'est pas dans l'url, dans ce cas c'est un ajout.

Bon courage

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 15 Messages

16 août 2013, 13:45

heu ... merci ^^
Je vais essayer de comprendre ce que tu me dis (je suis débutant, je ne maitrise pas... donc j'ai fait ce qui se fait dans le tuto puis j'ai afrémenté de ce que j'ai vu autre part ^^).
Merci!

"Ton code semble prévu pour traiter l'ajout et la modification mais le formulaire d'ajout ne traite pas ce cas. " heu ben tout fonctionne pourtant (attention je ne dis pas que mon code est beau, justement je suis ici pour l'embellir): la modif et l'ajout! :|

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 août 2013, 18:53

pour le dernier paragraphe, je suppose que tu as une page avec le formulaire de création; une page avec le formulaire de modification et la validation des deux se fait sur celle qui affiche la liste ?

Si oui du coup je comprend mieux ton code :)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 15 Messages

20 août 2013, 11:06

Non en fait voilà ce que j'ai:

J'ai un page login avec session (si on va sur une autre page sans qu'il y ait de session on revient à login).
Ensuite on va sur listerlesnews.php = la liste des news avec à côté un lien supprimer/modifier.

Qu'on choisisse surprimer ou modifier, il traite tout sur cette page (le traitement mysql).

MAIS il faut quand même un formulaire pour rédiger/modifier la news.
Donc on a une page redigernews.php dans laquelle soit:

-Il n'y a rien dans $get et donc il sait qu'il faut rien mettre dans les champ (champs vide)
-Il y a dans $get l'intruction modifier avec l'id de la news à modifier et il préremplis les champs.

Il renvoie les valeurs à listerlesnews.php (et revient automatiquement sur listerlesnews.php quand on pousse le bouton submit).

Ca c'est pour la partie privée.