Création système de news

Eléphanteau du PHP | 10 Messages

30 août 2012, 15:19

Bonjour,
je voudrai créer un système de news mais je rencontre quelques problèmes :
ma page où on peut poster les news :

Code : Tout sélectionner

<?php session_start(); ?> <h3> Poster une news </h3> <br/> <?php $action = (isset($_GET['action']))?htmlspecialchars($_GET['action']):''; try { $bdd = new PDO('mysql:host=localhost;dbname=news', 'pseudo', 'pass'); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } <?php switch ($action) { case "poster": else { $auteur = $_SESSION['pseudo']; ?> <form method="post" action="poster_news.php?action=poster&amp" name="post"> <fieldset> <p> <label for "titre">Titre de la news :</label> <input type="text" size="80" id="titre" name="titre" /> </p> <p> <label for "icone">Image :</label> <input type="hidden" name="MAX_FILE_SIZE" value="2097152" /> <input type="icone" name="icone" id="icone" /> <br/> (Les formats acceptés pour l'image sont jpg, jpeg, gif, png) </p> <br/> <p> <label for="texte_news"> Contenu de la news : <br/> <textarea cols="120" rows="10" id="texte_news" name="texte_news"></textarea> </p> <input type="submit" name="submit" value="Envoyer" /> </p> </form> </fieldset> <?php } break; } ?> </div> </body> </html>
Et ma page de traitement :

Code : Tout sélectionner

<?php session_start(); ?> <?php $action = (isset($_GET['action']))?htmlspecialchars($_GET['action']):''; try { $bdd = new PDO('mysql:host=localhost;dbname=news', 'pseudo', 'pass'); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } ?> <?php switch($action) { //Premier cas : nouveau topic case "poster": $statut = "en attente"; $categorie = "manga"; $auteur = $_SESSION['pseudo']; $texte_news = $_POST['texte_news']; //Pareil pour le titre $titre = $_POST['titre']; if ($_FILES['icone']['error'] > 0) $erreur = "Erreur lors du transfert"; if ($_FILES['icone']['size'] > $maxsize) $erreur = "Le fichier est trop gros"; $extensions_valides = array( 'jpg' , 'jpeg' , 'gif' , 'png' ); //1. strrchr renvoie l'extension avec le point (« . »). //2. substr(chaine,1) ignore le premier caractère de chaine. //3. strtolower met l'extension en minuscules. $extension_upload = strtolower( substr( strrchr($_FILES['icone']['name'], '.') ,1) ); $image_sizes = filesize($_FILES['icone']['tmp_name']); if ($image_sizes[0] > $maxwidth OR $image_sizes[1] > $maxheight) $erreur = "Image trop grande"; $nom = "images/imagesnews/{$id}.{$extension_upload}"; $resultat = move_uploaded_file($_FILES['icone']['tmp_name'],$nom); if ($resultat) echo "Transfert réussi"; $date = time(); if (empty($texte_news)) { echo'<p>Votre contenu est vide, } elseif (empty($titre)) { echo'<p>Votre contenu est vide, } if (!empty($texte_news) AND (!empty($titre))) { $reponse = $bdd ->exec('INSERT INTO news (auteur, titre, date, texte_news, categorie, statut) VALUES ('.$auteur.', '.$titre.', '.$date.', '.$texte_news.', '.$categorie.', '.$statut.')'); echo'<p>Votre news a bien été prise en compte !<br /> Elle sera étudiée par les administateurs du site dans 72 heures maximum. } else { echo '<p>Une erreur s\'est produite. <br/> Verifiez bien que vous avez rempli tous les camps et que le format de l\'image est correct. </p>'; } break; } ?> </div> </body> </html>
Le php m'indique que ma news s'est exécutée sans aucune erreur ais les données que je rentre ne sont pas enregistrées pas dans ma base de donnée.

Je voudrai qu'après validation, mes news s'affichent avec un titre et le contenu quand on clique sur le titre avec un lien du style news?id=1.

Pouvez vous m'aider ?
Merci d'avance

ViPHP
ViPHP | 2577 Messages

30 août 2012, 15:27

$reponse = $bdd ->exec('INSERT INTO news (auteur, titre, date, texte_news, categorie, statut) VALUES ('.$auteur.', '.$titre.', '.$date.', '.$texte_news.', '.$categorie.', '.$statut.')');
Il faut tester s'il y a eu une erreur dans l'exécution de la requete insert (http://www.php.net/manual/fr/pdo.errorcode.php)

Edit : essayes de mettre de ' et des " dans les zones de saisies

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

30 août 2012, 15:37

Ben il manque surtout des apostrophes autours des chaines que tu veux insérer en base, en partant du principe que ce soit tous des varchars, date ou text :
$reponse = $bdd->exec('INSERT INTO news (auteur, titre, date, texte_news, categorie, statut) VALUES (\''.$auteur.'\', \''.$titre.'\', \''.$date.'\', \''.$texte_news.'\', \''.$categorie.'\', \''.$statut.'\')');
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 10 Messages

31 août 2012, 18:43

@Ryle : Tous mes champs ne sont pas des varchar le champs date est un timetamp et le champ text_news est un text.

@Mazirini : J'ai essayer de tester la présence d'erreur et php ne me renvoie rien.

Avez vous d'autres idées ?

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

31 août 2012, 20:07

Euh ben en fait, ce que je voulais dire, c'est que c'était pareil que ton champ soit de type text, varchar, date, ... les chaînes que tu veux y insérer doivent être délimitées par des apostrophes (contrairement aux nombres) :
UPDATE maTable SET monChampText = 'maValeur', monChampDate = 'maValeur', monChampVarchar = 'maValeur', monChampInt = 12, ...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 10 Messages

01 sept. 2012, 13:20

J'ai bien mis des apostrophes et des antislash comme tu me l'avais dis mais rien n'a changer...

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

01 sept. 2012, 14:59

salut,

vérifie ton niveau de rapport d'erreur (error_reporting) en dev il doit impérativement être à E_ALL.

utilise try / catch pour récupérer les exception levé par pdo.

+ le reste sur le retour de query comme l'indique Mazarini

de plus il faut protéger tes requêtes en échappants les données, pour cela utilise PDO::quote

ton code serait donc
<?php
try {
	$bdd = new PDO('mysql:host=localhost;dbname=news', 'pseudo', 'pass');
	$reponse = $bdd->exec('INSERT INTO news (auteur, titre, date, texte_news, categorie, statut) VALUES ('.$bdd->quote($auteur).', '.
	$bdd->quote($titre).', '.$bdd->quote($date).', '.$bdd->quote($texte_news).', '.$bdd->quote($categorie).', '.$bdd->quote($statut).')');
}
catch(PDOException $e) {
	echo 'Erreur SQL : '.$e->getMessage();
}
?>
ne sachant pas qui est quoi j'ai considéré que tout était des chaine de caractère mais si ce n'est pas le cas utilise le second paramètre de la méthode quote.

La doc de la méthode quote http://fr2.php.net/manual/fr/pdo.quote.php

surtout pas de die, c'est crade, il faut afficher un beau message d'erreur aux gens qui viennent ton site et pas les laisser sur une page blanche avec un message imcompréhensible (pour les gens "normaux").


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

Eléphanteau du PHP | 10 Messages

01 sept. 2012, 19:09

Un grand merci pour votre aide.
En mettant dans les values

Code : Tout sélectionner

'.$bdd->quote($auteur).'
, cela fonctionne.

Mais ma date s'affiche en 0000-00-00 00:00:00 dans ma base de données

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

03 sept. 2012, 01:27

Un grand merci pour votre aide.
En mettant dans les values

Code : Tout sélectionner

'.$bdd->quote($auteur).'
, cela fonctionne.

Mais ma date s'affiche en 0000-00-00 00:00:00 dans ma base de données
mauvais format de date, il doit être de la forme YYYY-mm-dd

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

Eléphanteau du PHP | 10 Messages

03 sept. 2012, 16:27

Dans le haut de mon scripte, j'ai :

Code : Tout sélectionner

$date= date()
Donc si j'utilise un INT ou lien d'un DATE ou un DATETIME dans ma base de données, cela fonctionnera non ?

Et comment procéderiez vous pour afficher un contenu de news après avoir cliquer sur le lien de la news concernée ?

Merci d'avance

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

03 sept. 2012, 17:30

Donc si j'utilise un INT ou lien d'un DATE ou un DATETIME dans ma base de données, cela fonctionnera non ?
heu peux être mais tu vas devoir faire des choses complexe et foireuse pour utiliser la chose.

une date c'est une date :)
dans une requête SQL cela s'exprime sous forme de chaine de caractère.

En SQL le format de date (par défaut) est YYYY-mm-dd où
- YYYY est l'année sur quatre digits (2012 par exemple)
- mm est le mois sur deux digits (09 par exemple)
- dd le jour sur deux digits (03 par exemple)
la date du jour sera donc 2012-09-03

L'avantage d'avoir un champ de type date est de pouvoir demander à MySQL de faire des calculs sur les dates ( recherche sur une période donnée somme / soustraction etc etc).

de plus est relativement de formater une date pour l'affichage avec date_format dans la requête (mysql)
Ou avec la classe DateTime (et la méthode format) de php. (cette solution est la plus portable).

donc un champ de type date et on format la date correctement avant l'insérer dans la table.
Et comment procéderiez vous pour afficher un contenu de news après avoir cliquer sur le lien de la news concernée ?
cela dépend de tes envies / besion / compétence.

La méthode simple et universelle : un lien vers une pages qui affiche le détails (news.php?id=412)

Les méthodes JS / AJAX
d'abord JS :
- tu charge toute les news (avec une limite quand même une dizaine max devrais être suffisant après faut mettre en place une pagination, voir même avant), tu génère le tout et applique un style css (display:none) sur le corps des news que ne veux pas voir a l'affichage.
Ensuite avec, suite à un clic sur le titre par exemple, tu passe la propriété en display: block (doit fonctionner aussi avec la propriété visible.
Avec jQuery tu peux très facilement utiliser la propriété toggle (voir doc).

La méthode ajax.
- Tu affiche toujours la première news complète mais après tu n'affiche que les titres des news, tu iras chercher, avec AJAX, le contenu de la news, si l'on clic sur le titre.

Dans les deux cas, lorsque tu clique tu un titre t masque les autres news (mais pas les titres) pour ne pas avoir une page trop grande qui finis par faire fouillies.

Il existe des composant graphique, à base JS, qui peuvent te faire des composant assez sympa, si tu aime.
Par exemple avec jQuery UI (mais d'autre existe).
comme l'accordéon :)

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

Eléphanteau du PHP | 10 Messages

03 sept. 2012, 20:36

Merci pour la date, cela fonctionne maintenant.

Pour afficher mes news, je vais prendre la méthode dite "universelle".
Mais j'ai commencer un script qui ne fonctionne pas :

Code : Tout sélectionner

<?php try { // Connexion a la bdd via la variable $bdd } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } ?> <?php $reponse = $bdd->query( 'SELECT id, auteur, titre, date, texte_news, categorie, statut FROM news WHERE categorie =\'manga\' AND statut =\'validé\' ORDER BY date'); while ($data = $reponse->fetch()) { ?> <fieldset> <a href= "http://manga_news.php?<?php echo $data['id'];?>"> <?php echo $data['titre'];?> </a> <br/> <?php echo 'News postée '.$data['date("d-m-Y H:i")'].''; } $reponse->closeCursor(); ?> </fieldset> <?php $repo = $bdd->query( 'SELECT id, auteur, titre, date, texte_news, categorie, statut FROM news WHERE categorie =\'manga\' AND statut =\'validé\' ORDER BY date'); while ($donnee = $reponse->fetch()) { echo $donnee['titre']; echo $donnee['auteur']; echo $donnee['texte_news']; } $repo->closeCursor(); ?> </body> </html>
Pouvez vous m'aider ?