Partage
  • Partager sur Facebook
  • Partager sur Twitter

Table temporaire ou pas ?

    7 juin 2007 à 10:10:50

    Bonjour à tous !

    J'ai besoin de stocker des informations recupérées sur une page php pour m'en reservir sur une autre page. Est ce qu'il est judicieux de creer une table temporaire (sachant que je veux stocker toujours le meme type de données) et de la supprimer quand j'en ai plus besoin ou y'a t-il une autre methode plus simple ?

    Pour vous aider j'ai par exemple besoin de stocker un score, voire si des options ont deja été utilisées par un joueur...


    Merci pour votre aide !
    • Partager sur Facebook
    • Partager sur Twitter
      7 juin 2007 à 10:18:53

      Sessions.

      Les tables temporaires sont très rarement une bonne idée.
      • Partager sur Facebook
      • Partager sur Twitter
        7 juin 2007 à 10:26:35

        Si c'est juste pour la passer à une autre page et si tu as un formulaire pour passer sur cette page autant fair un <input hidden> non?
        • Partager sur Facebook
        • Partager sur Twitter
          7 juin 2007 à 10:33:47

          On évite les input hidden quand il s'agit de mémoriser un score... :)

          Les input hidden et autres get servent à mémoriser l'id d'une news à éditer par exemple :

          - Tu cliques sur "?page=edit&news=5"
          - Tu arrives sur une page formulaire d'édition
          - Tu mémorises ton &news=5 en hidden ou en get
          - Tu valides le formulaire, et tu récupères le $_POST['news'] ou le $_GET['news']

          Utiliser une session dans ce cas empêcherait d'éditer 2 news à la fois.

          Par contre, pour un score ou un truc de ce genre (options, etc), c'est $_SESSION et rien d'autre (+ bdd si c'est pas temporaire). D'une part c'est plus maniable, d'autre part c'est sécurisé.

          Les input hidden ne sont qu'à utiliser sur des formulaires en plusieurs temps.
          • Partager sur Facebook
          • Partager sur Twitter
            7 juin 2007 à 13:04:49

            Merci à tous pour vos réponses.

            J'ai une autre question en complément car je n'arrive à trouver la réponse dans les tutos.

            En fait j'interroge une table ma base de cette facon :

            $reponse = mysql_query("SELECT * FROM question ORDER BY rand() LIMIT 1");

            while ($donnees = mysql_fetch_array($reponse) )
            {


            Mon but est donc d'interroger ma table selectionner une rangée à la fois... Ma requete normalement doit stocker la ou les rangées deja selectionnées pour que le random ne les selectionne plus. Je dois selectionner une rangée à chaque page PHP. Comment puis je passer de page en page l'information sur les rangées deja selectionnées ?


            Merci encore !
            • Partager sur Facebook
            • Partager sur Twitter
              7 juin 2007 à 14:48:13

              Si ça concerne un seul utilisateur, tu peux faire une variable de session, un array, dans lequel tu ajoutes tous les id de lignes déjà chargées. Donc :

              if (! isset($_SESSION['rangees_select'])){
                  $_SESSION['rangees_select']=array();
                  $condition='';
              } else {
                  $condition = ' WHERE id NOT IN ('.implode(',',$_SESSION['rangees_select']).')';
              }
              $reponse = mysql_fetch_assoc(mysql_query('SELECT * FROM question'.$condition.' ORDER BY rand() LIMIT 1'));
              $_SESSION['rangees_select'][]=$reponse['id'];


              Le code est complet. J'étais parti pour faire l'implode de la variable de session directement dans la requête, mais t'aurais eu une erreur si la variable de session était vide : IN () ne fonctionne pas. Bref, c'est un peu moins joli, mais ça va ^^
              • Partager sur Facebook
              • Partager sur Twitter
                7 juin 2007 à 14:59:02

                Merci pour ton aide Veldryn mais j'y comprends pas grand chose...

                En fait pour simplifier ton explication je vais te detailler...

                Dans la première page je lis une rangée de facon aleatoire. Ensuite, c'est uniquement a partir de la deuxième page que je veux faire le test pour ne pas reselectionner une rangée deja lue...

                Donc quel code je mets dans la première page et quel code je mets dans la deuxième ?


                PS : quand j'essaye sur la première page de remplacer mon code par le tien il me met ca :

                Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\affich.php on line 30

                Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\affich.php on line 33



                Merci encore, et désolé car je débute...
                • Partager sur Facebook
                • Partager sur Twitter
                  7 juin 2007 à 15:06:12

                  Mon code est complet, c'est à dire qu'il fait à la fois page 1 et page 2.

                  Le principe :

                  - Si la variable de session n'existe pas, c'est qu'on ouvre la page pour la première fois (= page 1). On crée la variable de session, et on n'a pas de condition (= on tire une question au hasard parmis toutes)
                  - Si la variable de session existe, on a déjà ouvert la page et tiré une question. Elle contient donc une liste de questions qu'on n'a plus le droit de tirer. La condition dit : "blabla sauf les questions qui ont déjà été tirées".

                  Ensuite, on exécute la requête avec la condition (éventuellement vide).

                  Pour que ça marche, il faut :

                  - Un session_start() tout en haut de la page (Active les notices avec error_reporting(E_ALL) pour t'aider à éviter les erreurs bêtes)
                  - Et... euh... C'est tout ^^

                  Par contre, étant donné que la requête ne retourne qu'un seul élément, j'ai dégagé le while ($donnees = mysql_fetch...) (Sert à rien de faire une boucle quand tu sais qu'il n'y a qu'un élément). Par contre, j'ai pas renommé réponse, alors c'est peut-être ça qui te perturbe. J'aurais dû l'appeler $donnees :p Parce que avec mon code, si t'essaies d'y ajouter :

                  while ($donnees = mysql_fetch_array($reponse))


                  Ca buggera inévitablement ;) (Et c'est probablement ce qui t'est arrivé :) )
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 juin 2007 à 15:20:15

                    Donc, dans la suite de mon code, il faut que je remplace tous les $donnees par $reponse ?

                    <table>
                             <tr><td>Sujet :</td><td><input type='text' name='question' size='100' value='<?php echo $donnees['question']?>'></td></tr>
                             <tr><td>Réponse A :</td><td><input type="submit" name="rep" size='20' value='<?php echo $donnees['rep_a']?>'></td><td>Réponse B :</td><td><input type="submit" name="rep" size='20' value='<?php echo $donnees['rep_b']?>'></td></tr>
                             <tr><td>Réponse C :</td><td><input type="submit" name="rep" size='20' value='<?php echo $donnees['rep_c']?>'></td><td>Réponse D :</td><td><input type="submit" name="rep" size='20' value='<?php echo $donnees['rep_d']?>'></td></tr>
                            </table>
                    </fieldset>
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 juin 2007 à 15:31:42

                      Ou, plus simplement, que tu renommes $reponse en $donnees =) (Ce qui est plus logique, vu que $reponse ne contient pas une reponse sq, mais des données :) )

                      Et ça t'évitera d'en oublier, ça fait 1 seul truc à modifier ^^
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 juin 2007 à 15:34:30

                        Il me met cette erreur :

                        Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource


                        Et il me remplit plus rien dans le champ reservé à la question et sur les boutons submit...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 juin 2007 à 15:40:35

                          Bon, on va passer au débuggage classique d'une erreur de ce type :

                          $requete = "SELECT ...."; (Tu recopies la requêtes ici)
                          $reponse = mysql_query($requete) OR DIE (mysql_error().'<br />'.$requete);
                          $donnees = mysql_fetch_assoc($reponse);


                          Ca plantera normalement avant la fin, mais cette fois avec un message d'erreur exploitable (Et n'hésite pas à copier ce code et à le réutiliser partout, ou mieux : à en faire une fonction... T'en auras TOUJOURS besoin).
                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 juin 2007 à 15:47:18

                            J'ai donc mis ce code :

                            if (! isset($_SESSION['rangees_select'])){
                                $_SESSION['rangees_select']=array();
                                $condition='';
                            } else {
                                $condition = ' WHERE id NOT IN ('.implode(',',$_SESSION['rangees_select']).')';
                            }
                            //$donnees = mysql_fetch_assoc(mysql_query('SELECT * FROM question'.$condition.' ORDER BY rand() LIMIT 1'));
                            //$_SESSION['rangees_select'][]=$donnees['id'];
                            $requete = "SELECT * FROM question'.$condition.' ORDER BY rand() LIMIT 1";
                            $reponse = mysql_query($requete) OR DIE (mysql_error().'<br />'.$requete);
                            $donnees = mysql_fetch_assoc($reponse);



                            Voici l'erreur :

                            0Erreur de syntaxe près de ''. WHERE id NOT IN (,,,,,,,,,,,,).' ORDER BY rand() LIMIT 1' à la ligne 1
                            SELECT * FROM question'. WHERE id NOT IN (,,,,,,,,,,,,).' ORDER BY rand() LIMIT 1


                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 juin 2007 à 15:51:23

                              Hé, quand on modifie mon code, je décline toute responsabilité en cas de bug, hein :p

                              J'avais mis des guillemets *simples* autour de la requête, tu les as remplacés par des doubles : Ca casse toute la concaténation (Et c'est d'ailleurs un coup de chance que ça n'ait pas provoqué de parse error :p )

                              $requete = "SELECT * FROM question'.$condition.' ORDER BY rand() LIMIT 1";

                              A remplacer par :
                              $requete = 'SELECT * FROM question'.$condition.' ORDER BY rand() LIMIT 1';


                              (On voit vite la différence avec la coloration syntaxique)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                7 juin 2007 à 15:58:24

                                Je suis un boulet pour les guillemets... :p

                                Voici la nouvelle erreur :

                                0Erreur de syntaxe près de ',,,,,,,,,,,) ORDER BY rand() LIMIT 1' à la ligne 1
                                SELECT * FROM question WHERE id NOT IN (,,,,,,,,,,,,) ORDER BY rand() LIMIT 1
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  7 juin 2007 à 16:01:25

                                  Tu n'as pas de champ "id" dans ta table. Or, c'est celui que j'utilise (Naïvement, je considère que toutes les tables ont un champ "id" ^_^ )

                                  Bref, remplace id par n'importe quel champ unique de ta table question (Un champ "Primary key" ou "Unique key" de préférence). Si tu n'en as pas, ajoute un champ id INT, en clef primaire + auto_increment à ta table.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    7 juin 2007 à 16:11:54

                                    Citation : undefined

                                    En fait j'en avais un mais c'etait ID... J'ai pas fait gaffe ! Ca marche niquel maintenant.

                                    Je te remercie de m'avoir aidé.


                                    Et par contre sur le meme code, j'avais un autre soucis que j'avais posté un peu plus tot : ICI.
                                    Je ne sais pas si sans trop t'embeter tu peux aussi m'aider avec ça...


                                    En tout cas vraiment un grand merci !!!




                                    Finalement j'ai encore une erreur qui est apparue, j'avais pas du bien actualiser...

                                    Erreur de syntaxe près de ',,,,,,,,,,,,)ORDER BY rand() LIMIT 1' à la ligne 1
                                    SELECT * FROM question WHERE ID NOT IN (,,,,,,,,,,,,,)ORDER BY rand() LIMIT 1
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Table temporaire ou pas ?

                                    × 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