Partage
  • Partager sur Facebook
  • Partager sur Twitter

[mini-chat], Pleins de problèmes

Svp...

    16 janvier 2006 à 12:30:44

    Salut à tous!
    J'ai plusieurs problèmes avec mon minichat...
    La plus part des problèmes sont peut etre dut au fait que je suis en localhost, enfin j'en sais rien... :euh: :

    1. Lorsque je met des apostrophes, le message ne s'écrit pas, mais dans le tuto, ça marche o_O

    2. J'ai mis
      $message = htmlentities ($_POST['message']);
            $pseudo = htmlentities ($_POST['pseudo']);

    Mais ça ne change rien, le html marche toujours.

    3. J'ai essayer de mettre l'heure et j'ai fais comme écrit dans un autre topic.
    Mais l'heure est toujours celle du dernier message écrit! o_O

    $timestamp = time();

    [le<?php echo date('d\/m', $timestamp); ?> à <?php echo date('H\:i', $timestamp); ?>]


    Ca c'est les problèmes des choses qui marchent pas.

    Maintenant, c'est ce que je n'arrive pas à faire. :-°

    4.A la fin du TP, m@théo dit:

    Citation : M@théo

    Empêcher les messages en double. En effet, si vous actualisez la page (touche F5) pour voir s'il y a de nouveaux messages, votre navigateur va vous demander s'il doit renvoyer les informations... Si vous dites "oui", alors le message qu'il vient d'envoyer sera réenvoyé, ce qui fait qu'il apparaîtra en double !Pour éviter cela, il y a bien une solution : avant d'enregistrer un message, vous vérifiez que le dernier message posté n'est pas identique. Si c'est le même, vous n'enregistrez pas le message (sinon vous auriez eu un double !).



    Je n'y arrive pas, je ne sait pas comment faire avec les if...

    5. (last :lol: )

    Citation : M@théo

    Supprimer automatiquement les vieux messages. A chaque fois qu'un nouveau message va être posté, vous comptez le nombre total de messages dans la table. S'il y en a par exemple plus de 1000, vous supprimez le plus vieux, histoire de faire de la place pour pas trop encombrer votre base de données (à moins que vous ne préfériez garder un historique complet ;))



    :-°


    Bon, je sais que j'en demande beaucoup, mais bon..
    Avant j'avais encore d'autres question, mais j'ai fait une recherche :p .
    Et j'ai trouvé la réponse (ex, Enregistrer le pseudo).

    Mais là je ne trouve pas! :euh:

    Donc si vous pouviez m'aider, ce serait très sympa! :D

    Ce qui serait utilie, ce serait mon code ^^ :

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
        <head>
            <title>Mini-chat</title>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        </head>
        <style type="text/css">
        form
        {
        text-align:center;
        }
        input
        {
        font-size: medium;
        color: orange;
        font-weight: bold;
        }
        .messages
        {
        color: orange;
       
        }
         .messages2
        {
        color: #4B4B4B;

        }
        h2
        {
        color: #c04000;
         font-weight: bold;
         text-decoration: underline;
        }   
        .heure
        {
        font-size: small;
        } 
       
    div {
       width: 600px;
       height: 180px;
       text-align: justify;
      align: center;
    }

    .barres_defilement{
       overflow: auto;
       
    }

     
        </style>
        <body>


    <?php
    $timestamp = time();

    if (isset($_POST['pseudo']) AND isset($_POST['message'])) // Si les variables existent
    {
        if ($_POST['pseudo'] != NULL AND $_POST['message'] != NULL) // Si on a quelque chose à enregistrer
        {
            // D'abord, on se connecte à MySQL
            mysql_connect("localhost", "root", "");
            mysql_select_db("test1_sdz");

            // On utilise la fonction PHP htmlentities pour éviter d'enregistrer du code HTML dans la table
            $message = htmlentities ($_POST['message']);
            $pseudo = htmlentities ($_POST['pseudo']);
           
            // Ensuite on enregistre le message
            mysql_query("INSERT INTO minichat VALUES('', '".$pseudo."', '".$message."', '".$timestamp."')");

            // On se déconnecte de MySQL
            mysql_close();
        }
    }


    // Que l'on ait enregistré des données ou pas...
    // On affiche le formulaire puis les 10 derniers messages

    // Tout d'abord le formulaire :
    ?>



    <h2  align="center">La Shoutbox</h2>

    <?php

    // Maintenant on doit récupérer les 10 dernières entrées de la table
    // On se connecte d'abord à MySQL :
    mysql_connect("localhost", "root", "");
    mysql_select_db("test1_sdz");

    // On utilise la requête suivante pour récupérer les 15 derniers messages :
    $reponse = mysql_query("SELECT * FROM minichat ORDER BY ID DESC LIMIT 0,15");

    // On se déconnecte de MySQL
    mysql_close();

    // Puis on fait une boucle pour afficher tous les résultats :

    ?>
    <div class="barres_defilement" align="center">
    <?php
    while ($donnees = mysql_fetch_array($reponse) )
    {
    ?>

    <span class="messages"><strong><?php echo $donnees['pseudo']; ?></strong></span> <span class="heure">[le<?php echo date('d\/m', $timestamp); ?> à <?php echo date('H\:i', $timestamp); ?>]</span>:<br/> <span class="messages2"><?php echo $donnees['message']; ?><br/></span>
    <hr>

    <?php
    }
    // Fin de la boucle, le script est terminé !
    ?>
    </div>

    <form action="minichat.php" method="post">

    <p>

    <strong>Pseudo :</strong> <br />

    <input type="text" name="pseudo"

    <?
    if (isset($_POST['pseudo']) )
    {
    echo 'value="' .$_POST['pseudo']. '"';
    }
    ?>

    />


    <br /><br />
    <strong>Message :</strong> <br />
    <textarea name="message" cols="40" rows="4" tabindex="80"></textarea><br /><br />
    <input type="submit" value="Shoot" />
    </p>

    </form>

        </body>
    </html>


    Voilà! Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      16 janvier 2006 à 12:57:37

      Salut,

      Ton INSERT INTO ne me plait pas. Test ca:
      mysql_query("INSERT INTO minichat VALUES('', '$pseudo', '$message', '$timestamp')");


      Probleme 2) La fonction htmlentities permet de ne pas executer le html. Donc quand tu va afficher du code html via un htmlentities, ca va t'afficher <a href="www.siteduzero.com">site</a> et pas un vrai lien hypertexte cliquable comme ca => site.

      Probleme 3) Je ne suis pas sur, car tu ne nous donne pas tout ton code, mais je pense que tu t'es planté dans ton array.

      Probleme 4) Je pense que la c'est parce que tu n'as pas encore assez avancé dans les cours. Faire les condition IF/ELSEIF/ELSE c'est vraiment compliqué. Tu verra quand tu sera sur cette parti la du cours, tu va commencer à pouvoir t'éclater

      Probleme 5) J'ai un gros doute sur la syntaxe, alors dans le doute, je ne dit rien ^^
      • Partager sur Facebook
      • Partager sur Twitter
        16 janvier 2006 à 13:33:31

        salut et merci de ton aide!
        J'ai essayé ce que tu as dit:

        1. ALors, j'ai changé le INSERT TO, mais hélas, l'heure est toujours la même!

        2. Et bien, chez moi, ça donne quand m'eme un lien, c'est bizarre!

        3. Je t'ai donné tout le code à la fin ^^ .

        4. Bin, je suis au chapitre du Tp avec le mini-chat, donc j'ai lu le if etc...
        Mais je ne sais pas quoi mettre pour dire à PHP: si message == message, n'nvoie pas message.
        Sinon, envoie le message.

        Je crois qu'il faut faire un truc du genre, mais avec quelle égalité?

        5. C'est pas grave ^^


        Voilà, merci beaucoup :)
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          16 janvier 2006 à 13:58:18

          4.
          tu fais une requete sql pour recherche le dernier message poste puis ensuite

          if ($lastmessage != $message)
          {
             //tu enregistres $message dans la bdd
          }
          else
          {
             //tu ne l'enregistre pas et tu renvoyes une erreur.
          }


          pense a gerer le cas ou il n'y a pas de message dans la bdd


          5.
          Avant d'afficher les messages tu fais une requete qui supprime les entrees superieures a 1000.


          pour 1,2 et 3 j suis trop fatigué que pour lire ton code :euh::(
          • Partager sur Facebook
          • Partager sur Twitter
            16 janvier 2006 à 14:59:43

            Bon, je vais essayer pour le 4.

            Et pour le 5, justement, j'avais pensé faire ça, mais j'ai oublié de dire qqch.
            Voilà, qaund je teste mon mini chat, j'écrit pleins de messages et ensuite je vais dans MysQl et j'effaces les messages que j'ai entrés!
            Mais quand je récris un message le ID n'est pas 0 mais 17 par exemple.
            Là, j'ai par exemple, 4 messages mais les ID sont 313, 314, 315 et 316 !
            Je fais surement qqch de mal, mais quoi?
            Mais merci beaucoup de ton aide!
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              16 janvier 2006 à 15:11:44

              tu dois pas regarder l'id, tu dois compter le nombre de message dans ta table grace à SELECT COUNT(*). Puis ensuite du supprimer celui avec l id le plus grand grace a la fonction sql MAX(id). Théoriquement, en supprimant un seul enregistrement, c'est assez vu que tu vérifie le nombre d'enregistrement avant chaque ajout. Mais tu peux t'amuser à compter le nombre d enregistrement au dessus de 1000 et supprimer ceux la (ca fait un peu jouer le cerveau :) par contre c est pas vraiment utile, sauf si t'implemente cette fonctionalite apres avoir déjà depasser le nombre max de massage que tu veux.
              • Partager sur Facebook
              • Partager sur Twitter
                16 janvier 2006 à 15:41:47

                hmm, je ne connais pas SELECT COUNT et MAX(id).
                Mais ce serait possible, que l'id, à chaque fois qu'on effaces un message, soit = 1000?
                Car si oui, après on pourrais faire qqch du genre:

                DELETE FROM minichat WHERE id='1001'.
                Enfin, c'est une idée...

                EDIT: Pour le 4. Tu me dis de faire: if ($lastmessage != $message)

                mais la variable lastmessage elle n'existe pas...
                donc je dois faire comment?

                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  16 janvier 2006 à 16:08:52

                  Tout est possible, mais si tu veux que ton id soit 1000, tu dois pas mettre le champ id en auto increment mais t en occupe tout seul. J pense que ca complique beaucoup la méthode. Surtout que le premier élement sera celui avec l id 1 et le dernier avec l id 1000. donc tu dois décaler tous les élements pour supprimer celui en premier place (j sais pas si tu m suis?)

                  dans ce que j'ai dis au dessus j me suis un petit peu trompé, c'est l indice le plus petit que tu dois supprimer vu que ca sera le plus vieux message. il y a donc la fonction MIN(id) pour ca.

                  SELECT COUNT(*) FROM table; ca te renvoye le nombre d'enregistrement qu il y a dans ta table
                  SELECT MIN(id) FROM table; ca te renvoye l'id le plus petit de ta table.


                  pour le $lastmessage != $message.

                  $lastmessage tu dois le recuprer dans ta bdd via une requete sql :-)
                  genre
                  $lastmessage=mysql_fetch_array(mysql_query("SELECT contenu FROM message WHERE id=(SELECT MAX(id) FROM message))");
                  et ca serait plutot $lastmessage[0] != message

                  edit: j'avais une parenthèse de trop :-°
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 janvier 2006 à 16:22:59

                    SI tu fais VIDER dans phpMyAdmin, ca remet les id à 0.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 janvier 2006 à 16:25:09

                      Alors, j'a fait ceci:

                      <?php

                      // Maintenant on doit récupérer les 10 dernières entrées de la table
                      // On se connecte d'abord à MySQL :
                      mysql_connect("localhost", "root", "");
                      mysql_select_db("test1_sdz");

                      // On utilise la requête suivante pour récupérer les 10 derniers messages :
                      $reponse = mysql_query("SELECT * FROM minichat ORDER BY ID DESC LIMIT 0,15");
                      $numeromessage = mysql_query("SELECT COUNT(*) FROM minichat");
                      $id_petit = mysql_query("SELECT MIN(id) FROM minichat");
                      // On se déconnecte de MySQL
                      mysql_close();

                      // Puis on fait une boucle pour afficher tous les résultats :

                      ?>


                      Puis maintenant je dois faire DELETE, mais je DELETE quoi?
                      MIN(id)?
                      --> DELETE from minichat WHERE Min(ID)?

                      hmm, je suis pas sur.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        16 janvier 2006 à 16:31:29


                        DELETE FROM minichat WHERE id=(SELECT MIN(id) FROM minichat);


                        si t as déjà l id minmum tu fais WHERE id=$idminimum
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 janvier 2006 à 16:34:03

                          le code que tu m'as donné regroupe les 3 en 1 non?
                          (
                          $numeromessage = mysql_query("SELECT COUNT(*) FROM minichat";

                          $id_petit = mysql_query("SELECT MIN(id) FROM minichat");

                          et le DELETE)

                          EDIT: JE l'ai testé, mais rien ne se passe....
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            16 janvier 2006 à 16:37:11

                            non, pas le COUNT

                            n'oublie pas un truc du style


                            if ($nombretotaldemessage == 1000) // dans le cas ou on est sur de ne pas avoir plus de 1000 records
                            {
                               mysql_query("DELETE FROM minichat WHERE id=(SELECT MIN(id) FROM minichat)");
                            }
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 janvier 2006 à 16:47:41

                              Je vais me suicidé^^

                              // Tout d'abord le formulaire :
                              ?>



                              <h2  align="center">La Shoutbox</h2>

                              <?php

                              // Maintenant on doit récupérer les 10 dernières entrées de la table
                              // On se connecte d'abord à MySQL :
                              mysql_connect("localhost", "root", "");
                              mysql_select_db("test1_sdz");


                              $nombretotaldemessage = mysql_query("SELECT COUNT(*) FROM minichat");

                              if ($nombretotaldemessage == 5) // dans le cas ou on est sur de ne pas avoir plus de 1000 records
                              {
                                 mysql_query("DELETE FROM minichat WHERE id=(SELECT MIN(id) FROM minichat)");
                              }

                              // On utilise la requête suivante pour récupérer les 10 derniers messages :
                              $reponse = mysql_query("SELECT * FROM minichat ORDER BY ID DESC LIMIT 0,4");
                              // On se déconnecte de MySQL
                              mysql_close();

                              // Puis on fait une boucle pour afficher tous les résultats : ...


                              edit: je crois que l'erreur est dans la place de notre if et delete..
                              je dois le mettre ou?
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                16 janvier 2006 à 16:51:14

                                essaye

                                $nombretotaldemessage = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM minichat"));

                                if ($nombretotaldemessage[0] == 5) // dans le cas ou on est sur de ne pas avoir plus de 1000 records
                                {
                                   mysql_query("DELETE FROM minichat WHERE id=(SELECT MIN(id) FROM minichat)");
                                }

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 janvier 2006 à 16:58:22

                                  Hmmm, j'ai essayé,
                                  et pour voir ce qui ne va pas j'ai fait dans mon message:

                                  <?php echo $nombretotaldemessage; ?>


                                  et il me répond à chaque fois: Array...

                                  EDIT:
                                  J'ai placé ton code tout en haut de la page comme ceci:

                                  <?php

                                  // TEST D'EFFACEMENT
                                  // On se connecte d'abord à MySQL :
                                  mysql_connect("localhost", "root", "");
                                  mysql_select_db("test1_sdz");


                                  $nombretotaldemessage = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM minichat"));

                                  if ($nombretotaldemessage[0] == 5) // dans le cas ou on est sur de ne pas avoir plus de 1000 records
                                  {
                                     mysql_query("DELETE FROM minichat WHERE id=(SELECT MIN(id) FROM minichat)");
                                  }


                                  mysql_close();



                                  ?>
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 janvier 2006 à 17:00:54

                                    Fais printf($nombretotaldemessage);
                                    je crois que ca marchera mieux qu'un echo.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      16 janvier 2006 à 17:02:04

                                      n'oublie pas, le résultat d'une requete donne un array.

                                      c'est normal que
                                      <?php echo $nombretotaldemessage; ?>
                                      ne fonctionne pas.
                                      avec
                                      <?php echo $nombretotaldemessage[0]; ?>
                                      ca va mieux?
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        16 janvier 2006 à 17:07:07

                                        aa ok, pour le array... suis-je bête ^^
                                        donc j'ai vérifé, ça indique à chaque fois le numéro de tous les messages,c'est bon!
                                        Mais les message ne s'effacent pas...
                                        Je n'ai pas mis de "else"; c'est pour ça?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          16 janvier 2006 à 17:12:33

                                          pourquoi faire un else?

                                          t as verifier que le nom des champs etc sont bon dans la requete?
                                          sinon essaye toujours la requete via phpmyadmin

                                          et n'oublie pas que ca n'efface que si t as un nombre de message = a 5.
                                          pourquoi ne pas mettre >= 5 ?
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            16 janvier 2006 à 17:21:53

                                            J'ai essayé mais cette fois en faisant:
                                            mysql_query("DELETE FROM minichat WHERE pseudo='The_Greek22'");

                                            et ça marche!

                                            J'en déduit que la faute se trouve ici: WHERE id=(SELECT MIN(id) FROM minichat)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Anonyme
                                              16 janvier 2006 à 17:30:17

                                              apparement on ne pourrait pas faire des requetes imbrique dans un DELTE avec mysql :/

                                              faut faire une premiere requete qui va trouevr le minimum et dans une deuxieme faire DELETE FROM minichat WHERE id=$idminimum[0]
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                16 janvier 2006 à 17:51:20

                                                lol, ne paniquons pas...

                                                j'ai fait ce que tu as dit:

                                                  <?php

                                                // TEST D'EFFACEMENT
                                                // On se connecte d'abord à MySQL :
                                                mysql_connect("localhost", "root", "");
                                                mysql_select_db("test1_sdz");


                                                $nombretotaldemessage = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM minichat"));
                                                $idminimum[0] = mysql_query("SELECT MIN(ID) FROM minichat");
                                                if ($nombretotaldemessage[0] >= 5) // dans le cas ou on est sur de ne pas avoir plus de 1000 records
                                                {
                                                   mysql_query("DELETE FROM minichat WHERE ID='$idminimum[0]'");
                                                }


                                                mysql_close();



                                                ?>


                                                j'ai fait un echo sur le idminimum:

                                                <?php echo $idminimum[0] ?>


                                                Et ça m'affiche toujours
                                                Resource id #4


                                                Alors, j'ai corrigé déjà le "id" qui est en fait en Majuscule dans ma table...
                                                mais je suis pas sur qu'on met le [0] après $idminimum...
                                                lorsqu'on fait:

                                                $idminimum[0] = mysql_query("SELECT MIN(ID) FROM minichat");


                                                enfin, je pense qu'on s'approche, mais merci de ton aide et ta patience ^^
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Anonyme
                                                  16 janvier 2006 à 17:54:51

                                                  en effet, on le met pas :-)
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    16 janvier 2006 à 18:00:25

                                                    Naaan pas de idminimum[0] !!!
                                                    Mon dieu, vous avez lu les cours php ???
                                                    Si tu veux l'id minimum, tu n'a qu'à prendre le premier en triant dans l'odre croissant :


                                                    <?php

                                                    // On se connecte d'abord à MySQL
                                                    mysql_connect("localhost", "root", "");
                                                    mysql_select_db("test1_sdz");

                                                    $temp = mysql_query("SELECT COUNT(*) FROM minichat");
                                                    $nombretotaldemessage = mysql_fetch_array($temp);

                                                    $temp = mysql_query("SELECT id FROM minichat ORDER BY ID ASC LIMIT 0,1");
                                                    $temp2 = mysql_fetch_array($temp);
                                                    $idminimum = $temp2['ID'];

                                                    if ($nombretotaldemessage[0] >= 5) // dans le cas ou on est sur de ne pas avoir plus de 1000 records
                                                    {
                                                       mysql_query("DELETE FROM minichat WHERE ID='".$idminimum."'");
                                                    }


                                                    mysql_close();



                                                    ?>
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      16 janvier 2006 à 18:01:10

                                                      OK, mais là, le echo n'affiche rien du tout :(
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        16 janvier 2006 à 18:02:38

                                                        quel echo ???

                                                        <?

                                                        echo $idminimum;

                                                        ?>
                                                        ???

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Anonyme
                                                          16 janvier 2006 à 18:06:03

                                                          ermm parce que ca ne marche pas en prenant l'id minimum?
                                                          c'est pourtant ce qui est le plus logique.

                                                          pourquoi LIMIT 0,1 ??
                                                          LIMIT 1 n'est pas suffisant?

                                                          pourquoi SELECT id et ORDER BY ID ??? sql n'est pas sensible a la casse?
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            16 janvier 2006 à 18:07:59

                                                            Non, j'ai posté en même temps que toi!
                                                            Ok, tout va bien!
                                                            Merci beaucoup Benzawal et Gyscos.

                                                            Et par la même occasion, j'ai réussi à réparer le problème numero 2 ^^
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              16 janvier 2006 à 18:12:19

                                                              Oooops pour le id en minuscule, j'ai oublié de changer là.
                                                              Pour le LIMIT 0,1 ca veut dire qu'il commence à 0 (le debut) et qu'il n'en prend qu'un.

                                                              Et, euh... en fait j'ai jamais fait MIN(id) c'est tout lol
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              [mini-chat], Pleins de problèmes

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown