| Fixxx Profil : Penguin Pro | Reprise du message précédent : Bah, ca depend un peu de ce que tu veux faire... Si tu veux juste qu'on utilise page.php comme pivot pour nous orienter vers d'autres pages du site, un simple include() suffit.
Sinon je ne sais pas exactement pourquoi ca ne marche pas. Il y a une erreur qui survient, ou juste rien qui ne s'affiche? | |
Komm Profil : Penguin Pro | En fait je voudrais récupérer le contenu de page.php?id=$id
Mais il n'y a rien qui s'affiche sur la page créée, elle est totalement vide...
Je cherche à générer des pages html pour alléger un peu le site. ---------------
Mon Flickr
c2prods.com
The Unnamed Studios : Webdesign
| |
Fixxx Profil : Penguin Pro | On peut voir le code en entier s'il te plait pour voir ou ca coince? | |
Komm Profil : Penguin Pro | Well, here it is!
Code :
- $return = mysql_query("SELECT * FROM pages" );
- while ($data = mysql_fetch_array($return)) {
- $page = file_get_contents('page.php?id='$data['id']);
- touch($data['adress']);
- $fp = fopen($data['adress']);
- fwrite($fp, $page);
- fclose($fp);
- }
|
Mais en fait, c'est un problème tout bête : le file_get_contents ne permet pas de récupérer la page générée, mais simplement le code php. Or comme je copie le code dans un html, ça me met des vrais morceaux de php entiers dedans!
Je crains donc que ce soit insoluble. En attendant, je crée des fichiers php mais c'est moins léger... ---------------
Mon Flickr
c2prods.com
The Unnamed Studios : Webdesign
| |
Fixxx Profil : Penguin Pro | Avec un peu d'astuce, tu peux t'en sortir avec l'utilisation d'eval(). Cependant, je trouve ton code tres lourd. L'utilisation de fichiers et de la fonction eval() ralenti dramatiquement l'execution de ton script. Pourtant je suis pratiquement sur qu'il suffit d'utiliser include() si j'ai bien compris ce que tu veux faire  | |
Komm Profil : Penguin Pro | Bon en fait j'ai réussi en faisant un système de template
Merci beaucoup!!
Comme je génère de l'html, la fonction include ne fonctionne pas... Message édité par Komm le 29-03-2009 à 12:57:22 ---------------
Mon Flickr
c2prods.com
The Unnamed Studios : Webdesign
| |
Fixxx Profil : Penguin Pro | Bonsoir a tous!
J'ai besoin de me familiariser avec l'API DOM de PHP5 pour un projet, j'essaye donc de faire une classe pour un parser XML, meme si je garde les fonctions de parsage tres sommaires, puisque ce qui m'interesse est plutot le parcours d'un document DOM, ainsi que les solutions de parsage, que le parsage en lui-meme.
J'ai tout de meme un petit probleme:
Voici mon code:
Code :
- <?php
- class DOMParser
- {
- private $xml;
- private $tags
- public function __construct()
- {
- $this->xml = new DOMDocument();
- $this->tags = array('gras' => 'strong',
- 'liste' => 'ul',
- 'puce' => 'li');
- }
- public function display($file)
- {
- echo $this->parse($file);
- }
- private function parse($file)
- {
- $this->xml->load($file);
- $root = $this->xml->documentElement;
- $this->browse($root);
- return $this->xml->saveXML();
- }
- private function browse($element)
- {
- foreach($element->childNodes as $child)
- {
- if($child->hasChildNodes())
- $this->browse($child);
- else
- $this->parseTag($child);
- }
- $this->parseTag($element);
- }
- private function parseTag($element)
- {
- echo $element->nodeName;
- if(array_key_exists($element->nodeName, $this->tags))
- {
- $newNode = $this->xml->createElement($this->tags[$element->nodeName], $element->nodeValue);
- $parent = $element->parentNode;
- $parent->replaceChild($newNode, $element);
- }
- }
- }
- ?>
|
Et voici le document que je parse:
Code :
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <test>
- <gras>Document de Test</gras>
- <liste>
- <puce>Puce 1</puce>
- <puce>Puce 2</puce>
- </liste>
- </test>
|
Cependant, ceci ne fait que parser la premiere ligne, c'est-a-dire mettre en gras "Document de Test". Suite a une petite seance de debuggage a base d'echos, j'arrive a la conclusion que les nodes suivants ne sont meme pas envoyés a la fonction parseTag(). Par contre, si je mets <liste></liste> avant <gras></gras>, c'est liste et ses enfants qui sont parsés, mais pas gras. Ceci me pousse donc a croire que mon code ne parcours que la premiere branche de mon arboresence et s'arrete en suite, mais je n'arrive pas a comprendre pourquoi...
Merci d'avance pour votre aide!
PS: Desolé pour la mauvaise indentation, c'est du au BBCode du forum... Message édité par Fixxx le 14-04-2009 à 00:47:06
| |
lorien Profil : Penguin | à part un point virgule qui manque je vois pas trop...
ca te fais pas de parse error? | |
Fixxx Profil : Penguin Pro | lorien a écrit :
à part un point virgule qui manque je vois pas trop...
ca te fais pas de parse error?
|
J'ai changé le nom de la variable directement dans le forum, elle s'appelait $openingTags, mais je l'ai renommée $tags pour faire plus court. J'ai simplement oublié le point virgule en changeant le nom, donc cette erreur n'est pas presente dans mon code, d'ou l'absence de parse error
| |
coker T : y = f'(a)(x-a) + f(a) Profil : Top Penguin | Bonjour je suis actuellement en train de coder une interface admin, mais je bloque sur un point. J'ai un dossier css dans lequel se trouvent des dossiers, chaque dossier correspondant à un thème, mais il y a également des fichiers dans le dossier css. J'ai donc déjà réussi à exclure les fichiers et ne garder que les dossiers, mais maintenant j'aimerais pouvoir enregistrer le nom du dossier dans ma BDD seulement si il existe pas, et sur ça je sèche. Voilà mon début de code, mais la boucle qui liste le contenu du dossier me gêne un peu Code :
- $dir = "./css";
- if ($diro = opendir($dir))
- {
- while (($doc = readdir($diro)) !== false)
- {
- if ($doc != '.' AND $doc != '..')
- {
- $cc = $dir . '/' . $doc;
- if (is_dir($cc) == true)
- {
- $docc = str_replace(' ','_', $doc);
- echo $docc . '<br/>';
- $reponse = mysql_query("SELECT nom FROM themes ORDER BY nom ASC" );
- while ($donnees = mysql_fetch_array($reponse) )
- {
- echo $donnees['nom'] . '*<br/>';
- }
- }
- }
- }
- }
- else
- {
- echo 'Impossible d\'ouvrir le dossier' . $dir;
- }
| Merci de votre aide (ça fait depuis hier soir que je planche dessus et impossible de faire) Message édité par coker le 17-04-2009 à 11:52:33 ---------------

| |
Fixxx Profil : Penguin Pro | Coker, j'ai essayé de comprendre ton code mais j'ai eu un peu de mal... Il faut prendre des bonnes habitudes pour coder.
Premierement l'indentation. Ici, je sais que c'est la faute du forum donc il faudrait alerter un admin pour voir si il ne peuvent pas changer cela. Je propose qu'on utilise Pasties ou encore CodePad le temps que cela s'arrange.
Deuxiemement, donne des noms clairs a tes variables: diro, docc, cc et compagnie ne renseignent pas directement sur leur utilité. Utilise des noms plus long, meme si tu peux utiliser des abbrevations, par exemple $openedDir, $currentFile, $newContent etc. Ca ne prend pas beaucoup plus de temps a ecrire, et pour relire c'est tellement mieux. Troisiemement, commente! Meme si pour l'instant tu connais le fonctionnement de ton code, dans trois semaines quand tu repassera dessus tu te demandera pourquoi un str_replace() la, ou un is_dir() ici. Tu n'a pas besoin de commenter longement, une phrase par bloc suffit en general
Quatriemement, plutot que de faire un code structuré de cette maniere:
Code :
- <?php
- if(is_object($myObject))
- {
- #Centaines de lignes de code
- }
- else
- {
- exit('Failure');
- }
- ?>
|
il vaut mieux utiliser:
Code :
- <?php
- if(!is_object($myObject))
- exit('Failure');
-
- #Centaines de lignes de code
- ?>
|
Comme ca, tu ne tombe pas dans le piege de la sur-indentation
Voila juste quelques bonnes pratiques a adopter pour coder clair. Meme si ce n'etait vraiment pas ta question Au moins, si tu fait comme ca, je pourrai t'aider vu que je comprendrais le fonctionnement de ton code... Message édité par Fixxx le 17-04-2009 à 12:09:51
| |
coker T : y = f'(a)(x-a) + f(a) Profil : Top Penguin | voilà j'ai essayé de commenter, et de mettre des variables plus expressives, par contre je comprend pas pour
où le palcer etc
Code :
- $dir = "./css";
- if ($dirOpen = opendir($dir))
- {
- while (($file = readdir($dirOpen)) !== false) //Liste le contenu du dossier
- {
- if ($file != '.' AND $file != '..')
- {
- $filePath = $dir . '/' . $file; //Chemin complet des fichiers pour voir si c'est un dossier
- if (is_dir($filePath) == true)
- {
- $file = str_replace(' ','_', $file); //Remplace ' ' du nom d'un dossier par '_'
- echo $file . '<br/>';
- $reponse = mysql_query("SELECT nom FROM themes ORDER BY nom ASC" );
- while ($donnees = mysql_fetch_array($reponse) )
- {
- echo $donnees['nom'] . '*<br/>';
- }
- }
- }
- }
- }
| ---------------

| |
Fixxx Profil : Penguin Pro | Pour le exit(), c'etait pour le code d'avant, tu avait fais un enorme bloc if, suivi d'un else avec un seul echo dedans. Dans ce cas la, il vaut mieux inverser la condition, pour mettre un if d'une ligne, et en suite ecrire ton code. Mais vu que tu as enlevé le dernier else, il n'y a plus de probleme.
D'ailleurs, voici un petit pastie avec ton code pour que l'on voit l'indentation: http://pastie.org/449767.
Pour ce qui est de ton probleme, une fois que tu as determiné si ton fichier était un dossier, tu veux enregistrer le nom de ce dossier dans la BDD seulement si il n'existe pas, puis afficher tous les themes presents c'est ca?
Je n'ai pas testé, mais quelque chose dans ce genre la: http://pastie.org/449796 devrait marcher  | |
coker T : y = f'(a)(x-a) + f(a) Profil : Top Penguin | oui c'est ça, je veux enregistrer le nom du dossier dans la BDD seulement si il n'existe pas
j'ai testé le code, mais ça n'enregistre rien ---------------

| |
Fixxx Profil : Penguin Pro | Tu as regardé dans la BDD ou seulement sur la page du script? Parce que sur la page du script, c'est normal, vu qu'il n'y a pas d'echos. Par contre si tu execute le script plus bas sur la page, ca devrait t'afficher quelque chose .
Fait tout de meme un echo de $reponse->occurences avant de tester si c'est egale a 0, et fait aussi un echo de $file pour voir ce que ca donne. A partir de la on pourra debugger  | |
coker T : y = f'(a)(x-a) + f(a) Profil : Top Penguin | | |
Fixxx Profil : Penguin Pro | Ouaip, j'ai du oublié d'echapper une apostrophe
Sinon, pour le nom du topic, pourquoi pas, je suis pas contre Malheuresement je n'ai pas ce pouvoir
PS: Est-ce que quelqu'un sait a quel point la superglobale $_SERVER est sure? Est-ce que je peux m'y fier completement ou est-ce qu'elle risque d'etre modifiée par l'utilisateur? Message édité par Fixxx le 17-04-2009 à 16:43:23
| |
coker T : y = f'(a)(x-a) + f(a) Profil : Top Penguin | je reviens encore avec une question, les nom de dossier enregistré dans la BDD me servent en fait à lire un fichier readme.txt
j'utilise donc fgets() pour lire le fichier, j'aimerais savoir si c'est possible de limiter la lecture à une ligne pour faire la mise en forme sur cette ligne, ensuite lecture de la ligne suivante pour l'autre mise en forme et enfin la 3ème et les lignes suivante pour la mise en forme ---------------

| |
Fixxx Profil : Penguin Pro | Si tu veux formater une ligne d'un fichier texte, il te suffit de faire un while(!feof($file)) avec un fgets() dedans pour pouvoir mettre en forme chaque ligne non? Du style:
Code :
- $file = fopen('readme.txt', r);
- while(!feof($file))
- {
- print '<p>'.fgets($file).'</p>;
- }
|
Sinon, pour repondre auto-repondre a ma question sur $_SERVER au cas ou cela interesserai quelqu'un, l'utilisateur ne peut pas en modifier les composants, a part HTTP_REFERER et les informations envoyées par le User Agent. On peut donc se fier aux autres informations. Cependant, les informations emises dependent des serveurs, il y en a parfois plus, parfois moins, mais selon le CGI 1.1, les valeurs suivantes doivent etre presentes: http://hoohoo.ncsa.uiuc.edu/cgi/env.html. Voila
Message édité par Fixxx le 17-04-2009 à 17:44:42
| |
coker T : y = f'(a)(x-a) + f(a) Profil : Top Penguin | en fait, il y a une ligne auteur, une autre nom et une description, la mise en forme dépend du type de la ligne, sur le nom j'aimerais mettre un lien, si je fais comme indiquer (et ce que j'avais commencé à faire) toutes les lignes seront en lien ---------------

| |
Fixxx Profil : Penguin Pro | Ce que tu pourrais faire c'est une variable $i que tu incremente a chaque tour de boucle. Si $i % 3 = 0, tu sais que c'est la ligne auteur, si $i % 3 = 1, tu sais que c'est la ligne nom et ainsi de suite  | |
coker T : y = f'(a)(x-a) + f(a) Profil : Top Penguin | désolé Fixxx, j'arrive pas à comprendre, j'ai créer $i qui vaut 0, ensuite dans la bouche j'ajoute +1, et si $i est égal à 1 bah j'affiche, mais ça marche pas
http://pastie.org/449944 ---------------

| |
Fixxx Profil : Penguin Pro | Alors, deja, il faut incrementer $i apres le if, et apres, ce n'est pas $i qui doit etre egale a 0, mais le modulo de $i avec 3 (vu que tu as trois lignes differentes.
http://pastie.org/450064
D'ailleurs, pour le bien de ton serveur, utilise mysql_fetch_assoc() a la place de mysql_fetch_array(). En effet, la deuxieme fonction va te faire un tableau associatif (nom => Jean-Paul) et un tableau numerique (1 => Jean-Paul), alors que la premiere solution va seulement te donner un tableau associatif, soit deux fois moins de memoire utilisé par ton serveur. Il te dira merci  | |
coker T : y = f'(a)(x-a) + f(a) Profil : Top Penguin | pourrais-tu m'expliquer à quoi sert ($i % 3), et qu'est ce qu'un modulo, y a certains trucs qui m'échappent un peu avec PHP
et merci pour l'astuce, je vais corriger ça  ---------------

| |
Fixxx Profil : Penguin Pro | Bien sur, le modulo est la cinquieme operation arithmetique de PHP, ainsi que de nombreux autres langages de programmation (C/C++, JS, ActionScript, Java, etc.). Il est donc a considerer au meme titre qu'une addition, une soustraction, une multiplication, ou encore une division. Le signe du modulo est %. Ce que le modulo d'un nombre a par un nombre n renvoit, soit a % n, est le reste de la division euclidienne de a par n (a/n). Voila pour la theorie, voici maintenant quelques exemples:
4 % 2 = 0, car 4 = 2*2 + 0.
5 % 3 = 2, car 5 = 3*1 + 2.
10 % 9 = 1 car 10 = 9*1 + 1.
Dans notre exemple, ce qui nous interesse, c'est de savoir si la ligne qu'on considere est la premiere, la deuxieme ou la troisieme d'un bloc de 3 lignes, et non pas si c'est la 34eme ou la 59eme ligne du fichier. On va donc diviser le numero de la ligne actuelle ($i) par 3, et regarder ce qu'il reste. On va donc faire un modulo.
Si $i vaux 0, on est a la premiere ligne, $i % 3 = 0, on sait donc que l'on est a la ligne 1/3
Si $i vaux 5, on est a la sixieme ligne, $i % 3 = 2, on est donc a la ligne 2/3 du bloc de ligne commencant a la ligne 4.
Et ainsi de suite
J'espere que tu as compris le fonctionnement, parce que le modulo est quand meme tres puissant et plutot simple a utiliser! Message édité par Fixxx le 17-04-2009 à 21:37:59
| |
coker T : y = f'(a)(x-a) + f(a) Profil : Top Penguin | donc le modulo affiche le reste d'une division euclidienne pour résumer? ---------------

| |
| |