Aller au contenu

MS-DOS_1991

Hubmaster
  • Compteur de contenus

    442
  • Inscrit(e) le

  • Dernière visite

Messages postés par MS-DOS_1991

  1. Merci de ta réponse :)

    Je pense que la meilleure solution serait d'implémenter ta méthode de parsing du portal dans ta classe forum, ainsi le contexte serait déjà là, et il ne devrait plus y avoir de problème...

    Le problème est que c'est déjà le cas :wacko:

    class Forum

    {

    private $db // ==> contient la classe Database qui gère la base de Donnée en MySQLi

    function autre_methode($arg)

    {

    return $this->db->query("SELECT .........");

    }

    function parsePortalBlockContent ( ... )

    {

    ...

    $sql_result = $this->autre_methode($arg);

    ...

    }

    }

    Ou alors je t'ai mal compris :hypocrite:

  2. Bonjour à tous :)

    J'ai découvert la fonction preg_replace_callback il y a peu de temps, et l'utilise pour gérer le parsing d'un portail en xml... En gros, pour chaque noeud de mon fichier, j'appelle la fonction parsePortalBlockContent qui est définie dans ma classe Forum

    Le problème est que cette fonction appelle une autre méthode de la classe Forum qui elle-même utilise une méthode de la classe Database dont la variable dans la classe Forum est $db (euh... tout le monde suite là ? :wacko: )

    class Forum
    {
    private $db // ==> contient la classe Database qui gère la base de Donnée en MySQLi

    function autre_methode($arg)
    {
    return $this->db->query("SELECT .........");
    }

    function parsePortalBlockContent ( ... )
    {
    ...
    $sql_result = $this->autre_methode($arg);
    ...
    }

    et mon appel de callback se fait ainsi:

    <?php if ($block->parse_content != 1) : echo $block->content; else : echo preg_replace_callback('!\{(.*)\|(.*)\}!', array('Forum', 'parsePortalBlockContent'), $block->content); endif; ?>

    Le problème est que PHP m'affiche une superbe Erreur Fatale:

    Fatal error: Using $this when not in object context in ... on line ...
    ... Une idée ? :smartass:

    P.S: J'ai essayé de remplacer $this->autre_methode() par self::autre_methode() mais cela ne marche que pour les méthodes de classe, pas pour les variables comme $db :(

  3. C'est une excellente idée, idée que j'ai d'ailleurs implémentée dans mon blog sur les nouilles :lol:

    Le fait de cacher un élément en JavaScript est très simple : il te suffit d'attribuer un ID au bloc de contenu que tu souhaites rendre visible / invisible, puis de mettre le code suivant à la fin de ta page :

    <script type="text/javascript">
    document.getElementById('id_du_bloc_a_cacher').style.display = 'none';
    </script>

    Bien entendu, tu peux cacher ainsi plusieurs blocs (voire tous) afin de présenter une page "propre" au visiteur ;)

  4. Ca y est ! ça supprime :fete:

    $document = new DomDocument();
    $document->load('././inc/online_users.xml');

    $guests = $document->getElementsByTagName('guests');
    foreach ($guests AS $guests)
    {
    $users = $guests->getElementsByTagName('user');
    foreach ($users AS $user)
    {
    $found = false;
    foreach ($user->childNodes AS $node)
    {
    if ($node->nodeType != XML_ELEMENT_NODE)
    continue;

    if ($found)
    {
    echo 'current_user';
    if ($node->tagName == 'last_activity_time')
    {
    $new_last_activity_time = $document->createElement('last_activity_time', 123);
    $user->replaceChild($new_last_activity_time, $node);
    continue;
    }
    }
    // Si on se trouve dans le bloc <user> du visiteur courant (on ne le savait pas encore)
    // Alors on passe au <tag> suivant
    elseif ($node->tagName == 'ip' && $node->nodeValue == $_SERVER['REMOTE_ADDR'])
    {
    $found = true;
    continue;
    }
    // Si on n'est pas dans le bloc <tag> de l'utilisateur courant et que l'utilisateur de ce tag est inactif depuis trop longtemps
    elseif ($node->tagName == 'last_activity_time' && time()-$node->nodeValue > 180)
    {
    echo 'user_to_be_removed';
    $guests->removeChild($user);
    }
    }
    }
    }
    $document->save('././inc/online_users.xml');

    Il me reste encore cependant à "updater" le noeud <last_activity_time></last_activity_time> en lui assignant la valeur du timestamp courant obtenu avec time().

    J'ai épluché la doc et malheureusement, le seul moyen de modifier le contenu d'un noeud semble être... d'en créer un autre puis de remplacer l'ancien par le nouveau :rolleyes:

    Mon code affiche bien "current_user", reconnaît bien le tag <last_activity_time> et la fonction replaceChild ne renvoie pas d'erreur, pourtant le noeud n'est pas mis à jour :mad2:

    edit (le dernier ^_^) : C'est bon, tout fonctionne .

    Ce n'est pas (si) compliqué le DOM XML (mais alors c'est lourd :rolleyes: )

  5. Oui, c'est ce que j'avais fait ;)

    Voilà où j'en suis pour le moment :

    $document = new DomDocument();
    $document->load('././inc/online_users.xml');

    $guests = $document->getElementsByTagName('guests');
    foreach ($guests AS $guests)
    {
    $users = $guests->getElementsByTagName('user');
    foreach ($users AS $user)
    {
    foreach ($user->childNodes AS $node)
    {
    if ($node->nodeType != XML_ELEMENT_NODE)
    continue;

    // Si on sait que l'on se trouve dans le bloc <user> du visiteur courant
    // Alors on met a jour les valeurs (lastactivity, etc)
    if ($found)
    {
    if ($node->tagName == 'last_activity_time')
    $node->nodeValue = time();
    }
    // Si on se trouve dans le bloc <user> du visiteur courant (on ne le savait pas encore)
    // Alors on passe au <tag> suivant
    elseif ($node->tagName == 'ip' && $node->nodeValue == $_SERVER['REMOTE_ADDR'])
    {
    $found = true;
    continue;
    }
    // Si on n'est pas dans le bloc <tag> de l'utilisateur courant et que l'utilisateur de ce tag est inactif depuis trop longtemps
    elseif ($node->tagName == 'last_activity_time' && time()-$node->nodeValue > 180)
    $guests->removeChild($user);
    }
    }
    }

    Mais je suis un peu perdu et je pense que mon code est redondant :$

  6. Je me permet de re-poster car j'ai vraiment du mal avec le DOM :unsure:

    Voici mon code

    foreach ($online_users->guests->user AS $user)
    {
    if ($user->ip == $_SERVER['REMOTE_ADDR'])
    {
    $user->last_activity_time = time();
    $user->last_activity_url = $_SERVER['REQUEST_URI'];
    $found = true;
    $online_users->asXML('././inc/online_users.xml');
    }
    elseif (time()-$user->last_activity_time > 180)
    {
    $dom = new DOMDocument();
    $dom_sxe = dom_import_simplexml($online_users);
    // Que mettre ici ?
    $online_users = simplexml_import_dom($dom_sxe);
    $online_users->asXML('././inc/online_users.xml');
    }
    }

    Je veux importer mon objet simplexml dans un objet DOM, pour ensuite supprimer le noeud <user> en cours d'analyse depuis le DOM, réimporter l'objet dans simplexml et sauvegarder le fichier...

    Le problème est qu'il faut connaitre la position du noeud pour le détruire, l'idéal serait une méthode "current_item()" mais ... ça m'étonnerais que ce soit aussi simple :wacko:

    Quelqu'un sait-il comment faire ?

  7. Bonjour :)

    Je viens de me mettre au XML avec la librairie SimpleXML intégrée à PHP 5. Tout marche parfaitement et j'arrive en 2 lignes à afficher tout ce que je veux de mon fichier :thumbsup:

    Le problème, c'est qu'il n'y a apparemment pas de fonction removeNode() ou removeChild() intégrée à cette classe, ce qui fait que je ne peux pas supprimer le noeud courant (utile dans mon cas car je fais un compteur de conenctés ;) )

    Dans la doc PHP, quelqu'un a écrit une classe, extendedSimpleXML (class extendedSimpleXML extends SimpleXMLElement) qui contient une méthode removeNode...

    Voici donc mon fichier XML (membres et invites sont séparés ;) ):

    <?xml version="1.0" encoding="windows-1250"?>
    <online_users>
    <members>
    </members>
    <guests>
    <user>
    <ip>01.234.56.789</ip>
    <last_activity_time>1157100123</last_activity_time>
    <last_activity_url>/forums/index.php?show_forums</last_activity_url>
    </user>
    <user>
    <ip>12.345.67.890</ip>
    <last_activity_time>1157100456</last_activity_time>
    <last_activity_url>/forums/index.php?show_forums</last_activity_url>
    </user>
    <user>
    <ip>23.456.78.901</ip>
    <last_activity_time>1157100789</last_activity_time>
    <last_activity_url>/forums/index.php?show_forums</last_activity_url>
    </user>
    <user>
    <ip>34.567.89.012</ip>
    <last_activity_time>1157101234</last_activity_time>
    <last_activity_url>/forums/index.php?show_forums</last_activity_url>
    </user>
    </guests>
    </online_users>

    et le code PHP :

    $online_users = simplexml_load_file('././inc/online_users.xml');
    $online_users = new extendedSimpleXML($online_users->asXML());
    foreach ($online_users->guests->user AS $user)
    if ($user->ip == $_SERVER['REMOTE_ADDR'])
    {
    $user->last_activity_time = time();
    $user->last_activity_url = $_SERVER['REQUEST_URI'];
    $found = true;
    $online_users->asXML('././inc/online_users.xml');
    }
    elseif (time()-$user->last_activity_time > 180)
    {
    $user->removeNode();
    $online_users->asXML('././inc/online_users.xml');
    }

    if (!$found)
    {
    $user = $online_users->guests->addChild('user');
    $user->addChild('ip', $_SERVER['REMOTE_ADDR']);
    $user->addChild('last_activity_time', time());
    $user->addChild('last_activity_url', $_SERVER['REQUEST_URI']);
    $online_users->asXML('././inc/online_users.xml');
    }

    Le problème est que la fonction removeNode() me fait apparemment sortir directement de ma boucle foreach, ce qui fait que je ne peux supprimer qu'un élément à la fois :(

    ... Une idée ?

    P.S : ah oui, SimpleXML me supprime l'indentation lorsque je rajoute des éléments... Est-il possible de la restaurer ?

  8. "L'url du site d'où vient le visiteur de la page (pas toujours renseigné ou exact)"

    Oui, car certains Pare-Feus (ex: Norton Internet Security 200x) vident cette variable ou bien la remplacent par des chaines de caractères aléatoires :)

  9. Bonjour à tous

    Je développe un forum et cherche en ce moment à coder la fonction qui permet à l'utilisateur de distinguer les forums lus de ceux qu'il n'a pas encore lu :cool:

    J'ai réfléchi et ai trouvé (tout seul comme un grand :smartass: ) la solution qui me paraît être la meilleure :

    * Quand un visiteur visite un forum, on ajoute son id dans un champ f_read de la table forums (pareil pour les sujets)

    -> Concrètement, ça donne :

    UPDATE forums
    SET f_read = f_read + ', 1'
    WHERE f_id = 3

    -> Ce qui donnera à terme quelque chose du genre f_read = '123, 54, 1, 2, 48, 87987, 654'

    (bien entendu, dès qu'un membre poste dans le forum, je vide ce champ ^^ )

    * Ensuite, pour lister les forums, on fait une condition qui regarde si l'id du membre est dans la liste :

    SELECT [...] CASE WHEN 1 IN (f_read) THEN '1'
    ELSE '0'
    END AS f_read

    ... et j'affiche mes belles icones lu / non lu :P

    Seulement voilà, je fais directement appel au champ f_read dans ma requête (avec IN (f_read) ) et MySQL me renvoie toujours 0 même quand mon id est dans le champ :(

    Je pense que c'est parce qu'il interprète mon champ comme du texte (et l'entoure donc avec des guillemets) et non comme une "suite de nombres séparés par des virgules" ...

    En effet, la requête suivante marche parfaitement :

    SELECT [...] CASE WHEN 1 IN (123, 54, 1, 2, 48, 87987, 654) THEN '1'
    ELSE '0'
    END AS f_read

    Ce qu'il faudrait, c'est covnertir le contenu du champ en un format de suite que MySQL comprendrait, mais je sèche...

    Des idées ?

    P.S: Arf, on a pas le droit à assez de smileys dans nos messages : P

    Edit : Mes explications me semblent un peu confuses, n'hésitez donc pas à me poser des questions ^ ^

  10. Salut :)

    Juste un petit post pour te donner un petit conseil d'optimisation PHP :

    while (list($libelle,$type,$num_voit,$groupe,$class_dep,$class_arr,$nb_t,$km,$nom,$prenom) = $db->get_row())

    est moins rapide que

    $current_car = 0;
    while ($current_car < $db->num_rows)
    {
    $car = $db->get_row();
    // Tes opérations ici
    // print_r ($car);
    // echo $car['num_voit'];
    // etc
    $current_car++;
    }

  11. Bah là je suis pas trop d'accord, même si phpbb connait quelques souci de temps en temps il peut faire tourner des gros voir des très gros forums

    Voir http://www.gaiaonline.com/forum/index.php (l'un des plus gros forums sur la toile => voir les stats en bas de page c'ezst impressionant)

    => même si ça n'en a pas l'air c'est bien un phpbb :)

    Bien sûr, mais le serveur qui l'héberge est un monstre, alors que celui qui héberge forum.hardware.fr est seulement un demi-monstre :whistling:

  12. Salut :)

    Pour un forum à fort trafic, évites PhpBB : il est mauvais en termes de rapidité et trop souvent la proie des script-kiddies :thumbsdown:.

    MesDiscussions.net quand à lui fait tourner l'un des plus gros forums au monde sans souffrir : Forum Hardware mais il te faudra mettre les mains dans le cambouis si tu souhaites le personnaliser (hideux par défaut :whistling: )

    Sinon, tu peux aller faire un tour sur OpenSourceCMS qui liste les différents scripts de forum gratuits ;)

    P.S: Si tu peux attendre quelques temps, je suis en train de développer le Newbie-Forum qui devrait entrer en version finale début août si tout va bien :hypocrite:

  13. A noter que l'on peut échapper le nom des champs avec des guillemets inversés ` pour éviter ces problèmes :

    `timestamp` | `force`

    Attention toutefois : cette synthaxe n'est je crois supportée que par MySQL :rolleyes:

×
×
  • Créer...