Problème de récupération d'une donnée

Fermé
Braxx - 6 févr. 2014 à 12:00
le_joker_fou Messages postés 764 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 7 août 2014 - 7 févr. 2014 à 13:54
Bonjour, alors voilà j'ai programmer un système de forum. Qui a la base ne requière pas de connexion. C'est un système standard de poste d'articles avec la possibilité de poster des commentaires sans connexion seulement en mettant un nom quelconque et le corps du commentaire. Une fois le commentaire validé, il s'affiche parmi les autres commentaires de l'article concerné avec le nom qui a été entrer ainsi que le corps du commentaire.

Cependant j'ai ajouté une table membres a mon programme avec un système de connexion, inscription, déconnexion qui marche sans fautes

Désormais je souhaite modifier les commentaires, de sorte a supprimer la saisi du nom de commentateur afin qu'à la validation du commentaire, le nom qui s'affiche avec le corps du commentaire soit celui de la personne connecter. Je met ce code en ligne

Voici la page connexion :
<?php require 'connexionBDD.php' ?>
        
<?php
$login = $_POST["login"];
$mdp = $_POST["mdp"];
try{
$req = "select * from membres";
$qid =  $bdd->query($req);

$qid->execute();

while ($row = $qid->fetch())
{
    if($login == $row['membre_pseudo'])
    {
        if($mdp == $row['membre_mdp']) 
        {
            session_start();
            $_SESSION['login'] = $login;
            $_SESSION['pwd'] = $mdp;
            header('location: index1.php');
        } 
    }
}
$qid->closeCursor();
}
catch (PDOException $error)
{
        die ("Erreur de connexion : ". $error->getMessage());
}
?>



Page des fonctions utilisé :
function inserer_commentaire($id,$membre_commentaire,$corps_commentaire)
{
    mysql_query("insert into commentaires(id_article,membre_commentaire,corps_commentaire, date_commentaire) values('$id','$membre_commentaire','$corps_commentaire',NOW())");
}

function recup_commentaire($id)
{
    $id=(int)$id;
    $commentaires = array();
    $sql = mysql_query("select
    membre_commentaire,
    corps_commentaire,
    DATE_FORMAT(date_commentaire,'%d/%m/%Y %H:%i:%S') as date_commentaire
    FROM commentaires where id_article='$id' order by id_commentaire desc 
    ")or die(mysql_error());
    
    while($row=mysql_fetch_assoc($sql))
    {
        $commentaires[] = $row;
    }
    
    return $commentaires;
    
}
?>




Voici mon index
<?php
            $articles = recup_article();       
            foreach ($articles as $article)
            {
                echo "<h2><a href='post_article.php'>".$article['titre_article']."</a></h2>";
                echo "<h4> Posté par : ".$article['membre_article']." le " .$article['date_article']."<hr /></h4>";
                echo "<p>**".$article['corps_article']."** <a href='#' id=".$article['id_article'].">(".($article['totales_commentaires']==NULL?0:$article['totales_commentaires']).") commentaire(s)</a>, dernier commentaire posté le " .($article['dernier_commentaire']==NULL?'(Aucun commentaire trouvé)':$article['dernier_commentaire'])."<hr /></p>";

                ?>
                <div id="loader<?php echo $article['id_article']; ?>" class="loader">
                    <img src="images/loading.gif" alt="loader"/>
                </div>
                <div id="feedback<?php echo $article['id_article'];?>"></div>

                <form method="POST" action="" id="form<?php echo $article['id_article']; ?>">
                    <p>Ecrire un commentaire : </p>
                    <textarea rows="4" cols="20" id="corps_commentaire"></textarea>
                    <input type="submit" value="Poster" id="submit"/>
                </form>
                <?php     
            }
            ?>


Et voici la partie de mon programme qui traite l'affichage du nom de la personne, corps commentaire, date du commentaires via une autre page.
<?php
session_start();

include('function.php');
require 'connexion.php';
$log = $_SESSION['login'];
$pass = $_SESSION['pwd'];
    if(isset($_POST['id'])&&isset($_POST['corps_commentaire']))
    {
        $id = (int)$_POST['id'];
        $requete = "select distinct membre_pseudo from membres where membre_pseudo = ".$log." and membre_mdp = ".$pass;
        $result = mysql_query($requete)or die(mysql_error());
        $membre_commentaire = mysq_result($result);
        $corps_commentaire = mysql_real_escape_string(htmlspecialchars($_POST['corps_commentaire']));
        
        if(!empty($corps_commentaire))
        {
            inserer_commentaire($id,$membre_commentaire,$corps_commentaire);
            
            $commentaires = recup_commentaire($id);
        
            foreach ($commentaires as $commentaire) {
                echo "<h4> commentaire posté par : ".$commentaire['membre_commentaire']."
                    le ".$commentaire['date_commentaire']."</h4><p>".$commentaire['corps_commentaire']."</p><hr />";
            }
        }
    }

?>






4 réponses

le_joker_fou Messages postés 764 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 7 août 2014 239
6 févr. 2014 à 12:25
Salut,

Premièrement, es-tu sur que les commentaires s'enregistrent bien en base?
Car après lecture de ton code, la requête suivante :
mysql_query("insert into commentaires(id_article,membre_commentaire,corps_commentaire, date_commentaire) values('$id','$membre_commentaire','$corps_commentaire',NOW())");

devrait te renvoyer une erreur en te spécifiant que "$membre_commentaire" est un array et non un string, ajoute un mysql_error();

Deuxièmement, mes cheveux se sont dressés en voyant ça :
<?php
$login = $_POST["login"];
$mdp = $_POST["mdp"];
try{
$req = "select * from membres";
$qid =  $bdd->query($req);

$qid->execute();

while ($row = $qid->fetch())
{
    if($login == $row['membre_pseudo'])
    {
        if($mdp == $row['membre_mdp']) 
        {
            session_start();
            $_SESSION['login'] = $login;
            $_SESSION['pwd'] = $mdp;
            header('location: index1.php');
        } 
    }
}
$qid->closeCursor();
}
catch (PDOException $error)
{
        die ("Erreur de connexion : ". $error->getMessage());
}
?>

Visiblement tu as un gros problème de sécurité, mot de passe en claire dans la base. Et surtout, tu sélectionnes tous les membres pour ensuite parcourir tes résultats si tu as 10 membres ça passe, mais imagine le jour ou tu auras 2000 membres le temps que cela va prendre pour la connexion.
0
Salut le_joker_fou, Oui les commentaires s'enregistre bien dans la base j'ai vérifier. merci de ta réponse, pourrais-tu me proposer une solution dans le programme. Car je débute dans tout ça j'ai plusieurs difficultés
0
le_joker_fou Messages postés 764 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 7 août 2014 239
Modifié par le_joker_fou le 6/02/2014 à 15:40
Salut,

Prmière chose, place des or die(mysql_error()) après toutes tes requêtes. Cela te permettra de voir si tu as une requête qui plante.

Ensuite pour la connexion des membre, je serais plus prudent de hasher les mots de passe. Exemple en sha1() :
echo sha1('mot_de_passe');

L'avantage du hash c'est qu'il n'est pas réversible. Si ta base se fait pirater, le pirate aura plus de mal pour trouver les mot de passe en claire. Enfin après il existe des technique pour mais ce n'est pas le sujet ici.

Pour la connexion tu recherches d'abord le membre et ainsi tu compares les hash des mots de passe entre-eux
//On recherche le membre par son login
$membre_query = mysql_query("SELECT * FROM membres WHERE login='$login';")or die(mysql_error());
$membre = mysql_fetch_assoc($membre_query);

//Si on a un membre
if(!empty($membre) && (mysql_num_rows($membre_query) == 1)) {
 //On compare les hashs des mots de passe
 if($membre['password'] == sha1($password)) {
  echo "connecté";
 } else {
  echo "échec";
 }
} else {
 echo "fail";
}


Une fois que tu auras bien maitrisé les bases PHP, je t'invite à faire des recherches sur la sécurité web, il existe de nombreux sites qui en parlent

Attention : cela est un exemple basique, qui est encore grandement "sécurisable".
0
La correction que tu m'a fais c bien pour la connexion?
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
6 févr. 2014 à 16:39
Quelques remarques :

Pas besoin de placer des "or die()" partout si tu utilises les exceptions PDO (aussi, il ne pas que PDO soit en mode silencieux pour voir les messages d'erreurs). Evite également d'utiliser les fonctions mysql_* qui sont obsolète depuis un bon moment.
https://www.php.net/manual/fr/pdo.error-handling.php

Ton exemple est moins sécurisé que celui proposé par Braxx car en utilisant directement tes variables post sans échapper les caractères spéciaux, ton code offre une belle faille d'injection sql.
En utilisant PDO, il faut utiliser les requêtes préparées ou la méthode PDO::quote() pour échapper les caractères spéciaux dans les requêtes sql.
https://www.php.net/manual/fr/pdo.prepare.php
http://www.php.net/manual/fr/pdo.quote.php

Concernant le hashage des mots de passe, sha1 ou md5 ne sont pas conseillé. Préfère l'utilisation de la nouvelle api de hashage de php 5.5, ou la fonction crypt().
https://www.php.net/manual/fr/faq.passwords.php

Pour finir, tant qu'à vérifier l'existence du login dans la requête, pourquoi ne pas vérifier également la correspondance du mot de passe dans la requête sql ?
0
le_joker_fou Messages postés 764 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 7 août 2014 239
7 févr. 2014 à 13:54
Ton exemple est moins sécurisé que celui proposé par Braxx 
Concernant le hashage des mots de passe, sha1 ou md5 ne sont pas conseillé.

D'où ma dernière ligne : Attention : cela est un exemple basique, qui est encore grandement "sécurisable".


Pour finir, tant qu'à vérifier l'existence du login dans la requête, pourquoi ne pas vérifier également la correspondance du mot de passe dans la requête sql ?
J'évite de le faire dans un but d'amélioration de la sécurité. Si tu te prends une injection SQL et que celle-ci passe, elle va forcément te retourner un résultat et donc identifier le membre. Dans mon code, si je me prends une injection SQL qui me renvoi un résultat (la plupart du temps le premier enregistrement de la base) il faut obligatoirement que le mot de passe saisi correspondent à celui de mon premier enregistrement en base.
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
6 févr. 2014 à 17:04
Salut,

Ton problème n'est pas définie : tu ne dis pas ce qui ne marche pas et ce que tu attends. Peux tu également préciser si tu as un message d'erreur ?

Attention au mélange des APIs :
Dans connexion.php, il semble que tu utilises PDO tandis que dans le reste de ton code tu utilises l'api MySQL (fonctions mysql_*).
Je te conseil d'utiliser toujours la même api pour éviter plusieurs problèmes. Puisque l'api MySQL est obsolète, préfère MySQLi ou PDO.

Toujours dans connexion.php, supprime les lignes vides entre tes balises php, celles-ci peuvent empêcher la session php de s'initialiser correctement (tu peux aussi placer l'instruction session_start() dès le début de ton fichier php).
https://www.php.net/session_start

Bonne journée
0