[PHP] Y'a des fois où je me dis que je suis vraiment barje LOL

Y'a des fois où je me dis que je suis vraiment barje LOL [PHP] - PHP - Programmation

Marsh Posté le 09-08-2004 à 22:44:36    

Donc... Je me suis mis au PHP hier.
Et puis évidement j'attaque un truc complèxe d'entrée de jeu...
 
Après quelques minutes d'effort j'ai réussi à pondre de truc d'autiste :sol: (chuis bon pour passer au perl je crois :D)
 
 


displayPattern(getInfos(26, "t1.typtie, t1.sigtie, t1.nomtie", "and t2.sigtie = '$_GET[sigtie]'", "order by t1.nomtie" ), 'Episodes :<br/>', 'displayPattern(getInfos(23, "t1.typtie, t1.sigtie, t1.nomtie", "and t2.sigtie = \'$row->sigtie\'", "order by t1.nomtie" ), \'\', \'<a href=\"episode.php?typtie=$row->typtie&amp;sigtie=$row->sigtie\">$row->nomtie</a><br/>\');');
 
 
function displayPattern($resultset, $title, $pattern)
{
   if (mysql_num_rows($resultset) > 0)
   {
      eval("echo(\"$title\" );" );
      while ($row = mysql_fetch_object($resultset))
      {
         if (strpos($pattern, 'displayPattern(') > -1)
         {
            eval($pattern);
         }
         else
         {
            eval("echo(\"$pattern\" );" );
         }
      }
   }
}
 
// (La fonction "getInfos()" est sans intérêt ici)


 
MagicBuzz ou comment faire du eval récursif pour pas se faire chier à écrire des fonctions plus completes :D
 
En fait, grossomodo :
-> displayPattern prends en paramètre un resultset d'une requ$ete, un "titre" et un "pattern", contenant des appels aux colonnes du resultset.
Donc, un petit eval d'un echo du pattern dans une boucle sur le resultset et j'obtiens la liste de mes lignes mises en page selon mon pattern, sans devoir faire du code spécifique.
 
Maintenant, je me dis... Mais le problème, c'est que le resultset, je le retrouve d'une requête faisant une simple jointure. Moi j'ai besoin de pousser sur deux niveaux, et j'ai pas envie de réécrire la fonction getInfos car bien trop complexe pour ne pas y passer deux heures...
Alors pourquoi pas ne pas détourner le eval du pattern pour lancer de façon résursive la fonction display, avec le getInfos appelé pour chaque ligne retournée par le premier résultset...
 
Et v'là le travail.
 
Je crois que je peux direct l'envoyer à l'auteur de cet article :sol:  
http://mindprod.com/unmain.html
 
C'est le revers de vouloir faire du trop générique on fini par faire du illisible :D

Reply

Marsh Posté le 09-08-2004 à 22:44:36   

Reply

Marsh Posté le 09-08-2004 à 23:37:38    

klair comen t trop barG :ouch:


---------------
LoD 4 ever && PWC spirit|Le topak de l'iMP-450|inDATOUNEwe trust
Reply

Marsh Posté le 09-08-2004 à 23:58:39    

Bah comme dirais ma grand-mère : "Du moment que c'est pas tout cafouéré c'est que ça doit marcher" :D
 
Tiens, sinon, rapidement, vu que t'es dans le coin :D
 
Tu peux me dire si cette url fonctionne ?
 
http://php.manga-torii.com:180

Reply

Marsh Posté le 10-08-2004 à 00:00:47    

Arjuna a écrit :

Bah comme dirais ma grand-mère : "Du moment que c'est pas tout cafouéré c'est que ça doit marcher" :D
 
Tiens, sinon, rapidement, vu que t'es dans le coin :D
 
Tu peux me dire si cette url fonctionne ?
 
http://php.manga-torii.com:180

404


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 10-08-2004 à 00:04:45    

Hmm.
 
Déjà, comme un boulet, j'ai pas de page par défaut...
 
http://php.manga-torii.com:180/index.php
 
Mais bon, j'ai créé le DNS y'a quelques minutes, donc il faut certainement le temps qu'il se propage.
 
En attendant, ça donne quoi ça ? (ça devrait marcher par contre)
 
http://linuxfaq.manga-torii.com:180/index.php
 
Sinon, c'est que j'ai un problème avec la config d'Apache :sweat:


Message édité par Arjuna le 10-08-2004 à 00:19:49
Reply

Marsh Posté le 10-08-2004 à 00:48:59    

donc tu as un probléme avec apache..


---------------
LoD 4 ever && PWC spirit|Le topak de l'iMP-450|inDATOUNEwe trust
Reply

Marsh Posté le 10-08-2004 à 08:31:37    

il a un problème avec PHP aussi :whistle:
 
pourquoi faire des eval? ça n'a aucun sens ici :??:


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 10-08-2004 à 09:28:01    

drasche a écrit :

il a un problème avec PHP aussi :whistle:
 
pourquoi faire des eval? ça n'a aucun sens ici :??:


Parceque t'as lu la fonction et son fonctionnement ?

Reply

Marsh Posté le 10-08-2004 à 09:30:25    

c'est qui Coralie ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 10-08-2004 à 09:40:01    

Harkonnen a écrit :

c'est qui Coralie ?


 
[:cupralf]


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 10-08-2004 à 09:40:01   

Reply

Marsh Posté le 10-08-2004 à 10:09:18    

Arjuna a écrit :

Parceque t'as lu la fonction et son fonctionnement ?


de tête, j'aurais dit qu'elle fait le même genre de choses que son homonyme Javascript :D


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 10-08-2004 à 12:10:10    

Harkonnen a écrit :

c'est qui Coralie ?


Coralie, c'est le nom du serveur.
T'as vu ça écrit où ?
 
C'est con, je ne peux pas y accéder depuis mon boulot :sweat:


Message édité par Arjuna le 10-08-2004 à 12:10:46
Reply

Marsh Posté le 10-08-2004 à 12:10:32    

drasche a écrit :

de tête, j'aurais dit qu'elle fait le même genre de choses que son homonyme Javascript :D


Je parle de ma fonction, pas de eval() :o

Reply

Marsh Posté le 10-08-2004 à 12:12:27    

Arjuna a écrit :

Coralie, c'est le nom du serveur.
T'as vu ça écrit où ?


 
:D devines...


---------------
IVG en france
Reply

Marsh Posté le 10-08-2004 à 12:16:04    

Arjuna a écrit :

Je parle de ma fonction, pas de eval() :o


ah :o
mais je parlais pas de ta fonction moi :o
edit: moi j'ai pas une fonction mais carrément une classe pour construire mes requêtes SQL :D (pas en PHP, stro lent :o)


Message édité par drasche le 10-08-2004 à 12:16:54

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 10-08-2004 à 12:26:50    

uriel a écrit :

:D devines...


Bah y'en a un peut partout en fait :whistle:

Reply

Marsh Posté le 10-08-2004 à 13:08:01    

Arjuna a écrit :

Bah y'en a un peut partout en fait :whistle:


ouais, mais bon, y a plus secure comme password...

Reply

Marsh Posté le 10-08-2004 à 14:06:57    

gizmo a écrit :

ouais, mais bon, y a plus secure comme password...


C'est un faux pour tromper l'ennemi :whistle:


Message édité par Arjuna le 10-08-2004 à 14:07:03
Reply

Marsh Posté le 10-08-2004 à 23:31:52    

Arf :)
 
MagicBuzz ou la passion d'écrire une usine à gaz pour affier 3 liens à l'écran :D
 


function displayPattern($resultset, $title, $pattern)
{
   mysql_query("create temporary table IF NOT EXISTS tmp_".getmypid()." (str varchar(255) not null)" );
   
   $res = mysql_query("select * from tmp_".getmypid());
   if (mysql_num_rows($res) == 0)
   {
      mysql_query("insert into tmp_".getmypid()." values ('dummy')" );
      $tableAlreadyExists = 0;
   }
   else
   {
      $tableAlreadyExists = 1;
   }
   
   if (mysql_num_rows($resultset) > 0)
   {
      eval("\$mystr = \"$title\";" );
      mysql_query("insert into tmp_".getmypid()." values ('$mystr')" );
      if (strpos($pattern, 'displayPattern(') > -1)
      {
         while ($row = mysql_fetch_object($resultset))
         {
            eval($pattern);
         }
      }
      else
      {
         while ($row = mysql_fetch_object($resultset))
         {
            eval("\$mystr = \"$pattern\";" );
            mysql_query("insert into tmp_".getmypid()." values ('$mystr')" );
         }
      }
   }
   
   if ($tableAlreadyExists == 0)
   {
      $res = mysql_query("select distinct str from tmp_".getmypid()." where str != 'dummy'" );
      if (mysql_num_rows($res) > 1)
      {
         while ($row = mysql_fetch_object($res))
         {
            echo($row->str);
         }
      }
      mysql_query("drop table tmp_".getmypid());
   }
}


 
Cette légère complexification à cause d'un problème évident à ma solution...
 
Au départ, je n'avais que deux cas possible lors d'appels "récursifs" :
-> Rechercher tous les fils des fils de l'entité en cours.
-> Rechercher le père du père de l'entité en cours.
 
Dans ces deux cas, aucun doublon possible (enfin, normalement, puisque dans certains cas la première peut ramener des doublons)
 
Mais là, j'ai dû implémenter une couche au dessus :
-> Recherche de tous les pères des fils de l'entité courante.
 
Evidement, tous les fils ont au moins en père commun l'entité courante... Du coup doublon !
Alors j'ai trifouillé un peu, et j'ai rien trouvé de plus goret (fiable en tout cas) que de passer par une table temporaire et faire un distinct dessus.
 
Ca donne donc l'usine à gaz ci-dessus :D
Ca me sert par exemple à afficher la série contenue dans un coffret de DVD, sâchant qu'un même coffret contient plusieurs DVD, et que tous ces DVD traîtent de la même séries (mais ils peuvent très bien aussi contenir plusieurs films différents...). Et vu que ça me gonflait de faire des relations redondantes (donc immainteables pour les éditeurs d'articles)...
 
C'est joli nan ? :D
 
Bon, plus sérieusement, je profite du fait que je vous ai posté mon code pour vous poser trois questions :
 
1) Comment savoir si une table existe déjà ? Là j'ai rien trouvé de mieu que de tenter de la créer dans tous les cas, compter les lignes, et si aucune, mettre une ligne 'dummy' dedans pour qu'un appel récursif ne puisse pas croire qu'il  a lui aussi créé la table (problème qui m'a bouffé plus d'une heure avant de comprendre ce qu'il se passait, je suis vert).
Bah ouais, parceque ma ligne 'dummy' elle est pas là pour clarifier les choses dans le bordel ambiant du code/algo.
PS: je ne veux pas que l'utilisateur du site puisse avoir accès à la base "mysql", donc c'est rappé pour avoir la liste des tables, deplus il s'agit d'une table temporaire, donc je ne suis même pas sûr qu'elle serait listée dedans.
 
2) getmypid() permet-il d'être certain d'obtenir un numéro unique pour un chargement de page donné ? D'après la doc, je n'arrive pas à savoir si c'est le pid du moteur PHP ou d'un pool de process, etc. Ceci est très important pour éviter les collisions de tables temporaires (je suis en connection persistante, donc malgré le scope réduit des tables temporaires, je pense que tout le site se partage les mêmes tables...)
 
3) Plutôt que faire un select * puis un mysql_num_rows(), y'a un moyen plus rapide de savoir si une table contient des données (bah ouais, parceque vu l'usine à gaz que j'ai fait, j'ai intérêt à l'optimiser à mort maintenant...)


Message édité par Arjuna le 11-08-2004 à 00:20:30
Reply

Marsh Posté le 11-08-2004 à 00:12:54    

je pense que tu peux poster avec ton ancien pseudo maintenant, tout le monde sait qui tu es :o

Reply

Marsh Posté le 11-08-2004 à 00:16:18    

Vivi mais bon, j'en prépare un nouveau :D Vous croyez que Coralie existe déjà ? :D
 
PS: parmis mes questions, la première s'est résolue toute seule après une modif de dernière minute juste avant mon post : le $title étant maintenant écrit dans la table si une ligne est trouvée (même si le titre est vide) fait que j'ai d'entrée de jeu une ligne dans la table, avant l'appel "récursif" avec eval(), donc plus besoin de ma ligne "dummy" :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed