Espace news...

Par marrtin, il y a 15 ans


Bonsoir,

J'ai terminé l'espace administration de mon site et je me suis lancé dans l'espace news. Qui lui fonctionne à moitié...
Voilà quand j'envoie ma news elle s'envoie sans soucis à part qu'elle ne s'affiche pas parce que l'id_login qui est en rapport avec l'id de l'administrateur reste à 0. Et je dois donc allé dans mon phpmyadmin pour lui attribué l'id correspondant à l'auteur qui à écrit la news et ensuite elle s'affiche correctement.

En gros je dois définir l'id de la personne qui écrit la news lors de l'insertion dans la BDD.
On m'avait donc conseiller de regarder le tuto concernant le système de commentaires, mais j'ai essayer plusieurs code qui ne fonctionnait pas...

Merci par avance,

20 réponses

agrafik, il y a 15 ans

Monte nous un peu ton code stp.

marrtin, il y a 15 ans

Le code de rédaction :

<?php
    mysql_connect("localhost","root","");
    mysql_select_db("news");

    extract($_POST);  
    if(isset($titre) && isset($contenu) && !empty($titre) && !empty($contenu)){
    $sql = "INSERT INTO news (titre,contenu,id_login) VALUES ('$titre','$contenu','$id_login')";  
    $req = mysql_query($sql) or die(mysql_error());  
    } ;

?>
<div id="red">
<div class="red_head">Rédiger une news :</div>
<div class="red_body">
<form action="index.php?p=rediger_news" method="post">
<p>Titre : 
<input type="text" size="30" name="titre" class="titre"/>
</p>
  <p> 
    <script>edToolbar('contenu'); </script>
    <textarea name="contenu" id="contenu" class="ed"></textarea>
  </p>
  <p>
   <input type="submit" value="Envoyer" /><br />
   <br />
   <a href="index.php?p=list">Retour à liste des news</a>
  </p></div>
 <div class="red_footer"></div>
 </div>
marrtin, il y a 15 ans

Alors j'ai réussi avec les sessions, sa marche impec ^^
Par contre quand j'envoi un message qui contient des apostrophes il ne veut pas, je sais qu'il faut que j'insert "addslashes" mais je ne sais pas où ? ^^"

"?You have an error in your SQL syntax..."

tottosche, il y a 15 ans

Bonjour,

Quelques petites questions,
Tu la fermes quand la balise form?
Et ou est initialisé id_login?

Si tu ne donnes aucune valeur a la variable id_login, c'est normal qu'il n'envoie rien dutt

Tu a deux solutions:

Soit tu crées un champ caché appelé id_login

<input type="hidden" name="id_login" value="<?php echo $VALEUR_DE_L_ID_DU_USER; ?>">

Soit c'est lors de l'insertion dans la bdd que tu initialises id_login.

N'utilises pas la première solution, n'importe qui pourrait envoyer une autre valeur (et par exemple faire semblent que c'est l'admin qui à poster la news)

Donc la deuxieme solution serait plus:

$sql = "INSERT INTO news (titre,contenu,id_login) VALUES ('$titre','$contenu','" . $_SESSION'id_user'] . "')";

Si bien entendu tu utilise des sessions et que l'id de l'utilisateur est stoqué dans id_user

Autre commentaire:
protege tes variables!
une injection SQL et facilement exploitable, ainsi qu'un XSS!

http://php.net/manual/en/function.htmlentities.php : pour ne pas avoir du code generer dans ta page (ou alors passes par un systeme de BBCode)

http://php.net/manual/en/function.mysql-real-escape-string.php : pour echapper les quotes et ne pas avoir un injection sql qui exécuterait une autre requete par jointure ou que sais-je

agrafik, il y a 15 ans

Ton ID dans la base de donnée tu l'as nommé : id_login ?

tottosche, il y a 15 ans

Un réaction par rapport a ce que j'ai écrit?
J'suis totallement a coté de la plaque?!

marrtin, il y a 15 ans

Oui j'ai fait ce que tu m'a dit mais sa ne marche pas --"

$sql = "INSERT INTO news (titre,contenu,id_login) VALUES ('$titre','$contenu','" . $_SESSION'Auth']'login'] . "')";
PhiSyX, il y a 15 ans

Hello, oui ça ne marche pas parce que je crois que tu n'as pas l'id stocké dans la session...
Tu peux faire comme a dit tottosche avec le champ caché :p

(C'est un peu pour ça que je t'ai dit d'aller voir le tuto de systme de comments... Regarde à la 9ème mins)

Byee :p

marrtin, il y a 15 ans

J'y arrive presque sauf qu'au lieu de récupérer l'id je récupère le login ^^"
Comment puis-je récupérer l'id de l'utilisateur en ligne dans un variable ?

ou bien sinon je récupère le login, sa peut-être aussi bien ?!

PhiSyX, il y a 15 ans

Ça dépend de ce que tu veux faire par la suite avec l'id ^^
Si tu souhaites par exemple par la suite leur créer une fiche technique, il est serait important d'avoir un id..
Si c'est juste pour vérifier qui a posté la news, tu peux ajouter sur ta table news un nouveau champ 'news_author' qui contiendrait seulement le pseudo de l'user :p

Enfin, à toi de voir :p

marrtin, il y a 15 ans

Oui en est fait je préfère l'id. Mais si je défini $news"id_login"]="$_SESSION"login"] je récupère le login mais en revanche l'id je ne l'est pas défini dans mes sessions donc je peu pas le récupérer.

tottosche, il y a 15 ans

Peut être que tu devrais relir la fin de ma première réponse...

"Autre commentaire:
protege tes variables! une injection SQL est facilement exploitable, ainsi qu'un XSS!
http://php.net/manual/en/function.htmlentities.php : pour ne pas avoir du code generer dans ta page (ou alors passes par un systeme de BBCode)
http://php.net/manual/en/function.mysql-real-escape-string.php : pour echapper les quotes et ne pas avoir un injection sql qui exécuterait une autre requete par jointure ou que sais-je"

Juste avant de crée ta requête, tu protèges tes variable utilisé:

mysql_real_escape_string($titre);
mysql_real_escape_string($contenu);
intval(id_login); //Si id_login est bien un id - integer

Et quand tu voudras retourner les valeur a partir de passe de donnée

htmlentities($data'titre']);
htmlentities($data'contenu']);
tottosche, il y a 15 ans

je n'ai pas été plus loin donc je sais pas vraiment comment fonctionne l'éditeur, mais j'espère pour toi que ce n'est pas une simple javascript qui te permet de d'ajouter des balises autours du texte selectionné et qu'il y a bien un post traitement des données qui efface les balises non autorisées

Essayes de taper:

'<ScRiPt>alert(10)</ScRiPt>

script est écrit bizarement car des fois la protection se fait sur <script> sans faire un lowercase préalable alors qu'une balise <ScRiPt> reste exécuter par le browser

Si une alert javacript apparait, je te recommande de changer d'editeur.

marrtin, il y a 15 ans

Oué en est fait j'ai une alert avec écrit 10 --"
je vais me diriger vers markitup surement alors.

tottosche, il y a 15 ans

Ok mais ne prend pas le html set, il a le même problème,
Je crois que tout les html set en général son comme ça, juste des script qui te permet d'ajouter des balise facilement mais sans aucune sécurité.

BBCode est pratique car c'est toi qui gère les balises HTML autorisé (gras - image - lien - ... mais pas script, form, ...

marrtin, il y a 15 ans

Ok oué donc là j'aurai pas de soucis avec les apostrophes et les / normalement

tottosche, il y a 15 ans

Non, les apostrophes avec backslashes (\') sont due au magic quote activé.
Magic quote n'est pas infaillible, je te conseil donc de le désctivé et par la suite proteger tes variables comme mentionné précédement

Pour desactiver les magic quotes j'utilise ce bout de code en début de pages:

if(get_magic_quotes_gpc()) {
    $_POST = array_map('stripslashes', $_POST);
    $_GET = array_map('stripslashes', $_GET);
    $_COOKIE = array_map('stripslashes', $_COOKIE);
}
marrtin, il y a 15 ans

Ok d'accord. Merci pour tout ! =D