Bug pour générer un fichier Sitemap

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [RÉGLÉ] Bug pour générer un fichier Sitemap

    Mon environnement
    J 3.9.14, php 7.x, mysqli

    Bonjour,

    J'ai besoin de générer un fichier "sitemap index" et tous les fichiers "sitemap" décrivant les urls construites à partir d'une table spécifique de ma BDD.
    Je bute stupidement sur l'écriture d'une instruction php. Voici l'extrait de mon script :

    Code PHP:
    define ("SITE", "... url de mon site ...");
    $traitement = true;
    if ( file_exists('sitemap-1.xml') ) {  // effacement des éventuels fichiers sitemap précédents
          if( @unlink('sitemap-*') !== true ) {
                $traitement = false;
          }        
    }
    if ($traitement) {
    // préparation du fichier "sitemap-index.xml"
    $xml1 = fopen('sitemap-index.xml',"w");
    fwrite($xml1, "<?xml version='1.0' encoding='UTF-8'?>\n" .
                  "<sitemapindex xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>\n" .
                  "<sitemap>\n" .
                  "<loc>" . SITE . "/</loc>\n" .
                  "</sitemap>\n");
    L'instruction :

    Code PHP:
    fwrite($xml1, "<?xml version='1.0' encoding='UTF-8'?>\n" .
                  "<sitemapindex xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>\n" .
                  "<sitemap>\n" .
                  "<loc>" . SITE . "/</loc>\n" .
                  "</sitemap>\n");
    me génère systématiquement l'erreur système :

    --> syntax error, unexpected end of file, expecting variable (T_VARIABLE) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN)

    QUESTION : quel cador en php pourrait me sortir de mon guêpier ?
    Merci pour votre aide.
    Dernière édition par Visiteur à 01/01/2020, 10h34

  • #2
    Salut,

    Essaye de construire ta chaîne avant dans une variable et de n'envoyer que celle-ci dans la fonction
    Code:
    $lachaine = "<?xml version='1.0' encoding='UTF-8'?>\n" .
                  "<sitemapindex xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>\n" .
                  "<sitemap>\n" .
                  "<loc>" . SITE . "/</loc>\n" .
                  "</sitemap>\n";
    fwrite($xml1, $lachaine);
    Dol.
    Je préfère éclairer que briller.” - “J'ai peut-être l'air froid, mais je suis pas givré.- "ça dépend ça dépasse"
    Ne m'envoyez pas de message privé pour résoudre vos problèmes sans y avoir été invité.
    Dolmenhir : tailleur de site web depuis 1997. Spécialiste Joomla depuis 2005. https://www.dolmenhir.fr

    Commentaire


    • #3
      Envoyé par dolmenhir Voir le message
      Salut,

      Essaye de construire ta chaîne avant dans une variable et de n'envoyer que celle-ci dans la fonction
      Code:
      $lachaine = "<?xml version='1.0' encoding='UTF-8'?>\n" .
      "<sitemapindex xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>\n" .
      "<sitemap>\n" .
      "<loc>" . SITE . "/</loc>\n" .
      "</sitemap>\n";
      fwrite($xml1, $lachaine);
      Dol.
      Bonjour et merci Dol,

      Je viens d'appliquer à la lettre cette règle ... mais j'ai toujours la même erreur !

      Commentaire


      • #4
        Bonjour,
        Il ne manquerait pas l'accolade fermante de if ($traitement) {...
        UP, le plugin universel à découvrir sur https//up.lomart.fr
        bgMax
        , AdminOrder, MetaData, Zoom, ArtPlug, Custom, Memo, Filter, ... sur http://lomart.fr/extensions

        Commentaire


        • #5
          Envoyé par lomart Voir le message
          Bonjour,
          Il ne manquerait pas l'accolade fermante de if ($traitement) {...
          Bonjour et merci lomart,

          Je viens encore de vérifier. Elle est bien présente en fin de script :

          Code PHP:
          }else{
          echo 
          "<br />Les fichiers de travail 'sitemap-*.xml' ne peuvent pas être effacés (traitement impossible) !";
          }
          mysqli_close($conn); 

          Commentaire


          • #6
            Pourtant il manque quelque chose avant la fin du script : unexpected end of file

            Les éditeurs permettent de visualiser l'appairage des accolades et autres
            UP, le plugin universel à découvrir sur https//up.lomart.fr
            bgMax
            , AdminOrder, MetaData, Zoom, ArtPlug, Custom, Memo, Filter, ... sur http://lomart.fr/extensions

            Commentaire


            • #7
              Envoyé par lomart Voir le message
              Pourtant il manque quelque chose avant la fin du script : unexpected end of file

              Les éditeurs permettent de visualiser l'appairage des accolades et autres
              J'ai bien lu, bien vu . Et malgré de nombreuses vérifications dans mon éditeur -Geany sous Linux, très pratique et complet- je ne trouve rien d'anormal. Tout est bien appairé !

              Commentaire


              • #8
                Bonsoir,
                qui dit php ... suppose écrire un script avec les bonnes instructions suivant la version de php du serveur

                Questions :
                - quelle est la version exacte de php sur ton serveur ?
                - tu as écris toi même ce script ou tu l'as "récuperée" quelque part ?
                - si tu es sur un site Joomla, pourquoi utiliser un tel script ? tu as des extensions pour cela ... sauf si tu as une raison précise que je ne connais pas
                - peut on avoir l'intégralité du code ? (pour trouver une éventuelle erreur)

                si personne ne peut t'aider ...... il faudrait peut être t'orienter sur un forum dédié a PHP
                Ce forum, vous l'aimez ? il vous a sauvé la vie ? Vous y apprenez chaque jour ? Alors adhérez à l'AFUJ https://www.joomla.fr/association/adherer
                Cette année, le JoomlaDay FR a lieu à Bruxelles, les 20 et 21 mai 2022, plus d'infos et inscriptions : www.joomladay.fr

                Commentaire


                • #9
                  Envoyé par manu93fr Voir le message
                  Bonsoir,
                  qui dit php ... suppose écrire un script avec les bonnes instructions suivant la version de php du serveur

                  Questions :
                  - quelle est la version exacte de php sur ton serveur ?
                  - tu as écris toi même ce script ou tu l'as "récuperée" quelque part ?
                  - si tu es sur un site Joomla, pourquoi utiliser un tel script ? tu as des extensions pour cela ... sauf si tu as une raison précise que je ne connais pas
                  - peut on avoir l'intégralité du code ? (pour trouver une éventuelle erreur)

                  si personne ne peut t'aider ...... il faudrait peut être t'orienter sur un forum dédié a PHP
                  Bonjour Manu, et merci,

                  J'apprécie ton aide, même si pour la forme j'apprécierais moins d'agressivité et ne pas être toujours pris pour une 'bille' sur un ton professoral. Il n'est nullement interdit de rester courtois, amical, même dans le dévouement gratuit.
                  Sans vouloir me vanter, j'ai de longues années d'expérience derrière moi et en informatique. Mais je ne sais pas tout, et je sais apprécier l'entraide que l'on a plaisir à vivre dans l'univers de l'open source (adepte de Linux & évidemment de Joomla). Et j'aime apprendre, chaque jour.
                  Voici mes réponses à tes questions précises :

                  1. sur serveur d'O2switch, je bénéficie de la version 7.2.25 de Php. Et le paramètre "XML activé (lire et écrire des fichiers xml)" est bien à 'oui',
                  2. j'ai écrit moi-même ce script, en me basant sur un modèle de génération simple de sitemap après avoir pris le temps de vérifier le bon fonctionnement de ce dernier,
                  3. pourquoi utiliser ce script et non pas une extension disponible sur joomla.org ? Je ne méconnais pas l'existence de telles extensions (cf. osmap) pour générer un sitemap simple. Mais ici, j'ai besoin de générer un fichier "sitemap index" qui va contenir un nombre important de fichiers "sitemap-xx.xml" contenant chacun 1000 urls que je dois construire à partir d'une table de ma BDD. S'il existe une extension disponible pour réaliser ceci, je suis preneur. Mais je n'en connais pas !
                  4. bien évidemment, je peux fournir l'intégralité de mon script. Si je ne l'ai pas fait, c'est volontairement : devant l'erreur rencontrée, j'ai commencé par longtemps en rechercher les motifs. Ne trouvant pas, j'ai documenté chaque ligne de mon script puis j'ai relâché progressivement une à une chaque ligne pour détecter précisément l'instruction qui déclenchait mon erreur. Et j'ai trouvé que c'était l'instruction que je me contente de soumettre ici dans mon propre sujet de forum. Je pensais avoir adopté une démarche responsable, et non primaire. Étant bien conscient que ce forum Joomla -même s'il possède un sous-forum spécialisé "développements"- n'est pas un forum de programmation.
                  5. pour ton dernier conseil, c'est très exactement la démarche que j'ai adoptée pour ma recherche de solution : avant de venir poster ici sur le forum Joomla, j'ai posté sur des sites spécialisés en programmation php & sql (ex: commentcamarche.net) ... mais sans résultats notables. De guerre lasse, je suis alors venu ici.

                  Pourquoi écrire "... si personne ne peut t'aider ..." alors que j'ai déjà apprécié et remercié par exemple ici les aides qualifiées de dolmenhir & lomart, et ô combien de daneel ? Je ne me plains pas, bien au contraire, et je continue à rechercher la solution finale ne serait-ce que par satisfaction intellectuelle et personnelle.

                  ps: sincèrement, j'apprécie ces aides -la tienne comprise- d'autant plus que l'on est en plein weekend de fêtes peu propices aux prises de têtes informatiques. En toute amitié.
                  Dernière édition par Visiteur à 22/12/2019, 06h55

                  Commentaire


                  • #10
                    À toutes fins utiles, et suivant le desiderata de manu93fr, voici le script complet qui dysfonctionne :

                    Code PHP:
                    {source}
                    <?php
                    $conn 
                    mysqli_connect('... mes données personnelles de connexion à la BDD...');
                    $req "SELECT nom, prenom, profession, specialite, code_profession, b5, mode_exercice, cp_ville, a3 FROM table WHERE ((cp_ville > ' ') AND (a3 = 'C') AND !((code_profession = '60') AND (b5 = 'S')) OR (code_profession = '86') OR (code_profession = '50') OR (code_profession = '21') OR (code_profession = '28') OR (code_profession = '98'))";
                    $resultat $conn->query("SET NAMES utf8");
                    $resultat $conn->query($req) or die('Erreur SQL !'$req .'' $conn->connect_error());
                    $num 0;
                    $nb 1;
                    $nbt 1;
                    define ("SITE""... url de mon site ...");
                    $traitement true;
                    if ( 
                    file_exists('sitemaps/sitemap-1.xml') ) {
                          if( @
                    unlink('sitemaps/sitemap-*') !== true ) {
                                
                    $traitement false;
                          }        
                    }
                    if (
                    $traitement) {
                    // préparation du fichier "sitemap-index.xml"
                    $xml1 fopen('sitemaps/sitemap-index.xml',"w");
                    $lachaine "<?xml version='1.0' encoding='UTF-8'?>\n" .
                                
                    "<sitemapindex xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>\n" .
                                
                    "<sitemap>\n" .
                                
                    "<loc>" SITE "/sitemaps/sitemap.xml</loc>\n" .
                                
                    "</sitemap>\n";
                    fwrite($xml1$lachaine);
                    while(
                    $arr mysqli_fetch_array($resultat)) {
                    if (
                    $nb == 1) {
                    // on crée un nouveau fichier sitemap-x.xml
                    $num $num 1;
                    $fich 'sitemaps/sitemap-' .$num'.xml';
                    echo 
                    "<br />création du fichier $fich ";
                    $xml2 fopen($fich'w');
                    $lachaine "<?xml version='1.0' encoding='UTF-8'?>\n" .
                                
                    "<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'\n" .
                                
                    "        xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'\n" .
                                
                    "        xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9'\n" .
                                
                    "        'http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'>\n";
                    fwrite ($xml2$lachaine);
                    // on complète le fichier sitemap index
                    $lachaine "<sitemap>\n<loc>" SITE "/sitemaps/sitemap-" .$num".xml</loc>\n</sitemap>\n";
                    fwrite($xml1$lachaine);
                    }
                    // on complète le fichier sitemap-x.xml
                    if ($arr[3] == '') {
                    $spec trim($arr[2]);
                    }else{
                    $spec trim($arr[3]);
                    }
                    // on supprime le code postal devant le nom de ville pour ne conserver que le seul nom de ville
                    $ville trim(substr($arr[7],7));
                    $ville2 strtoupper($ville);
                    $pos strpos($ville2"CEDEX");
                    if (
                    $pos === false) {
                    // cette ville n'est pas suivie du Cedex
                    $vil $ville;
                    }else{
                    // on va supprimer 'CEDEX ...' après le nom de ville
                    $ll strlen($ville) - $pos;
                    $vil substr($ville, -$ll);  
                    }
                    $prat trim($arr[1]). '-' .trim($arr[0]);
                    $lachaine "<url>\n<loc>" SITE "/" .$spec"/" .$vil"/" .$prat"</loc>\n</url>\n";
                    fwrite($xml2$lachaine);
                    $nb $nb 1;
                    $nbt $nbt 1;

                    if (
                    $nb 10) {
                    // pour les tests (mettre 1000 ensuite dans le if au lieu de 10)
                    $lachaine "</urlset>\n";
                    fwrite($xml2$lachaine);  
                    fclose($xml2);
                    $nb 1;  
                    }
                    // on se contente des 25 premières lignes de la table pour les tests (if à enlever ensuite)
                    if ($nbt 25) break;
                    }
                    // fin du traitement
                    $lachaine "</urlset>\n";
                    fwrite($xml2$lachaine);  
                    fclose($xml2);
                    $lachaine "</sitemapindex>\n";
                    fwrite($xml1$lachaine);
                    fclose($xml1);
                    }else{
                    echo 
                    "<br />Les fichiers de travail 'sitemaps/sitemap-*.xml' ne peuvent pas être effacés (traitement impossible) !";
                    }
                    mysqli_close($conn);
                    ?>
                    <br /><br /><p>FIN du TRAITEMENT</p>
                    <p class="droite"><a href="">Retour à la page d'accueil</a></p>
                    {/source}
                    ps: j'ai bien vérifié que le dossier "sitemaps" à la racine de mon site est bien "modifiable"
                    Dernière édition par Visiteur à 22/12/2019, 07h24

                    Commentaire


                    • #11
                      Pour information, la version Pro de JSitemap permet de créer des sitemaps à partir de requêtes MySQL que l'utilisateur peut construire "sur mesure". Je n'ai jamais utilisé mais ça a l'air très puissant.
                      Tous les services pour les sites Joomla! : sécurité, nettoyage de sites piratés, hébergement, SEO, applications Fabrik, migration, compatibilité mobiles, accessibilité, ...
                      Administrateur certifié Joomla! 3
                      https://www.betterweb.fr

                      Commentaire


                      • #12
                        Envoyé par jfque Voir le message
                        Pour information, la version Pro de JSitemap permet de créer des sitemaps à partir de requêtes MySQL que l'utilisateur peut construire "sur mesure". Je n'ai jamais utilisé mais ça a l'air très puissant.
                        Bonjour jfque, et merci pour cette information.
                        Mais si je rencontre un problème dans l'écriture du script, ce n'est pas dans la requête Mysql fort simple à partir de ma table de BDD. C'est tout bêtement quand je lance l'écriture d'une ligne dans un fichier de type sitemp.xml.
                        Nombre de "spécialistes php" m'avouent ne pas comprendre pourquoi cette erreur !

                        Bon dimanche !

                        Commentaire


                        • #13
                          J'apprécie ton aide, même si pour la forme j'apprécierais moins d'agressivité et ne pas être toujours pris pour une 'bille' sur un ton professoral. Il n'est nullement interdit de rester courtois, amical, même dans le dévouement gratuit.
                          AH ben ça m'apprendra a vouloir t'aider ... a quel moment j'ai été "agressif" ?
                          Je te pose juste des questions pour comprendre .... mais bon ...

                          Sans vouloir me vanter, j'ai de longues années d'expérience derrière moi et en informatique....
                          et bien si, tu le fais là .... pas la peine de te justifier, je ne t'ai pas juger et je ne t'ai pas pris de haut

                          Pourquoi écrire "... si personne ne peut t'aider ..." alors que j'ai déjà apprécié et remercié par exemple ici les aides qualifiées de dolmenhir & lomart, et ô combien de daneel ? Je ne me plains pas, bien au contraire, et je continue à rechercher la solution finale ne serait-ce que par satisfaction intellectuelle et personnelle.
                          là, je ne comprends pas ton étonnement, je ne fais QUE te conseiller un forum dédié au PHP si personnes ici ne peut t'aider ici .... car on est pas tous des "cadors" en PHP (pour reprendre ton expression
                          Ce forum, vous l'aimez ? il vous a sauvé la vie ? Vous y apprenez chaque jour ? Alors adhérez à l'AFUJ https://www.joomla.fr/association/adherer
                          Cette année, le JoomlaDay FR a lieu à Bruxelles, les 20 et 21 mai 2022, plus d'infos et inscriptions : www.joomladay.fr

                          Commentaire


                          • #14
                            Envoyé par lendrevi Voir le message
                            À toutes fins utiles, et suivant le desiderata de manu93fr, voici le script complet qui dysfonctionne :

                            Code PHP:
                            {source}
                            <?php
                            $conn 
                            mysqli_connect('... mes données personnelles de connexion à la BDD...');
                            $req "SELECT nom, prenom, profession, specialite, code_profession, b5, mode_exercice, cp_ville, a3 FROM table WHERE ((cp_ville > ' ') AND (a3 = 'C') AND !((code_profession = '60') AND (b5 = 'S')) OR (code_profession = '86') OR (code_profession = '50') OR (code_profession = '21') OR (code_profession = '28') OR (code_profession = '98'))";
                            $resultat $conn->query("SET NAMES utf8");
                            $resultat $conn->query($req) or die('Erreur SQL !'$req .'' $conn->connect_error());
                            $num 0;
                            $nb 1;
                            $nbt 1;
                            define ("SITE""... url de mon site ...");
                            $traitement true;
                            if ( 
                            file_exists('sitemaps/sitemap-1.xml') ) {
                            if( @
                            unlink('sitemaps/sitemap-*') !== true ) {
                            $traitement false;
                            }
                            }
                            if (
                            $traitement) {
                            // préparation du fichier "sitemap-index.xml"
                            $xml1 fopen('sitemaps/sitemap-index.xml',"w");
                            $lachaine "<?xml version='1.0' encoding='UTF-8'?>\n" .
                            "<sitemapindex xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>\n" .
                            "<sitemap>\n" .
                            "<loc>" SITE "/sitemaps/sitemap.xml</loc>\n" .
                            "</sitemap>\n";
                            fwrite($xml1$lachaine);
                            while(
                            $arr mysqli_fetch_array($resultat)) {
                            if (
                            $nb == 1) {
                            // on crée un nouveau fichier sitemap-x.xml
                            $num $num 1;
                            $fich 'sitemaps/sitemap-' .$num'.xml';
                            echo 
                            "<br />création du fichier $fich ";
                            $xml2 fopen($fich'w');
                            $lachaine "<?xml version='1.0' encoding='UTF-8'?>\n" .
                            "<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'\n" .
                            " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'\n" .
                            " xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9'\n" .
                            " 'http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'>\n";
                            fwrite ($xml2$lachaine);
                            // on complète le fichier sitemap index
                            $lachaine "<sitemap>\n<loc>" SITE "/sitemaps/sitemap-" .$num".xml</loc>\n</sitemap>\n";
                            fwrite($xml1$lachaine);
                            }
                            // on complète le fichier sitemap-x.xml
                            if ($arr[3] == '') {
                            $spec trim($arr[2]);
                            }else{
                            $spec trim($arr[3]);
                            }
                            // on supprime le code postal devant le nom de ville pour ne conserver que le seul nom de ville
                            $ville trim(substr($arr[7],7));
                            $ville2 strtoupper($ville);
                            $pos strpos($ville2"CEDEX");
                            if (
                            $pos === false) {
                            // cette ville n'est pas suivie du Cedex
                            $vil $ville;
                            }else{
                            // on va supprimer 'CEDEX ...' après le nom de ville
                            $ll strlen($ville) - $pos;
                            $vil substr($ville, -$ll);
                            }
                            $prat trim($arr[1]). '-' .trim($arr[0]);
                            $lachaine "<url>\n<loc>" SITE "/" .$spec"/" .$vil"/" .$prat"</loc>\n</url>\n";
                            fwrite($xml2$lachaine);
                            $nb $nb 1;
                            $nbt $nbt 1;

                            if (
                            $nb 10) {
                            // pour les tests (mettre 1000 ensuite dans le if au lieu de 10)
                            $lachaine "</urlset>\n";
                            fwrite($xml2$lachaine);
                            fclose($xml2);
                            $nb 1;
                            }
                            // on se contente des 25 premières lignes de la table pour les tests (if à enlever ensuite)
                            if ($nbt 25) break;
                            }
                            // fin du traitement
                            $lachaine "</urlset>\n";
                            fwrite($xml2$lachaine);
                            fclose($xml2);
                            $lachaine "</sitemapindex>\n";
                            fwrite($xml1$lachaine);
                            fclose($xml1);
                            }else{
                            echo 
                            "<br />Les fichiers de travail 'sitemaps/sitemap-*.xml' ne peuvent pas être effacés (traitement impossible) !";
                            }
                            mysqli_close($conn);
                            ?>
                            <br /><br /><p>FIN du TRAITEMENT</p>
                            <p class="droite"><a href="">Retour à la page d'accueil</a></p>
                            {/source}
                            ps: j'ai bien vérifié que le dossier "sitemaps" à la racine de mon site est bien "modifiable"
                            reponse courte -> je mettrai des accolades autour de BREAK;
                            je n'ai pas essayé de comprendre ton code dans les détails .... mais j'ai un doute sur la requête ... as tu vérifié qu'elle renvoyait bien quelque chose car tu ne fais pas ce controle en sortie

                            Voila .. ma ptite contribution a ton problème ... ne m'en demande pas plus
                            Bon dimanche !
                            Dernière édition par manu93fr à 22/12/2019, 16h11
                            Ce forum, vous l'aimez ? il vous a sauvé la vie ? Vous y apprenez chaque jour ? Alors adhérez à l'AFUJ https://www.joomla.fr/association/adherer
                            Cette année, le JoomlaDay FR a lieu à Bruxelles, les 20 et 21 mai 2022, plus d'infos et inscriptions : www.joomladay.fr

                            Commentaire


                            • #15
                              @ manu93fr,

                              Que de bavardage pour ne rien dire. Peut-être que l'on peut passer au fond de mon problème puisque tu dis m'aider.
                              Ai-je bien répondu à tes questions ? Cela me semble plus important.

                              ps: ce post vient de se croiser avec ta réponse de 16h11 : merci donc.

                              Oui, ma requête mysql fonctionne bien et me sélectionne les lignes attendues (je l'ai également vérifié en mode "phpmyadmin" en direct sur ma bdd).
                              Et par ailleurs, l'erreur intervient avant d'entrer dans la boucle de traitement de la variable $resultat.
                              Quand à mettre des accolades autour de "break" :
                              1. ce serait l'écriture standard d'un "if",
                              2. mais on peut l'écrire en abrégé comme je l'ai fait, quand on n'a pas besoin de gérer le "else". Ce qui est le cas ici.
                              Dernière édition par Visiteur à 22/12/2019, 16h32

                              Commentaire

                              Annonce

                              Réduire
                              Aucune annonce pour le moment.

                              Partenaire de l'association

                              Réduire

                              Hébergeur Web PlanetHoster
                              Travaille ...
                              X