Création système de news

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Création système de news

Re: Création système de news

par JofSam » 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 ?

Re: Création système de news

par moogli » 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 :)

@+

Re: Création système de news

par JofSam » 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

Re: Création système de news

par moogli » 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

@+

Re: Création système de news

par JofSam » 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

Re: Création système de news

par moogli » 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").


@+

Re: Création système de news

par JofSam » 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...

Re: Création système de news

par Ryle » 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, ...

Re: Création système de news

par JofSam » 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 ?

Re: Création système de news

par Ryle » 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.'\')');

Re: Création système de news

par Mazarini » 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

Création système de news

par JofSam » 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