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


marrtin
Auteur
Réponse acceptée

Ok d'accord. Merci pour tout ! =D

Monte nous un peu ton code stp.

marrtin
Auteur

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>

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

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

marrtin
Auteur

Voici ma table news : http://www.e-loader.net/image:KCTZuZii46.JPG

et ma table admin : http://www.e-loader.net/image:1EbnmdazR9.JPG

Sinon oui je les nommés id_login

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

marrtin
Auteur

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'] . "')";

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
Auteur

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 ?!

Ç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
Auteur

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.

marrtin
Auteur

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..."

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']);
marrtin
Auteur

Ok d'accord, pour info j'utilise un petit éditeur mais pas en BBcode en HTML :

http://corpocrat.com/2008/12/18/free-wysiwyg-textarea-html-editor/

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
Auteur

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

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
Auteur

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

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);
}