web-dev-qa-db-fra.com

Création d'un sitemap XML avec PHP

J'essaie de créer un planite qui sera automatiquement mise à jour. J'ai fait quelque chose de similiaire avec mon flux RSS, mais ce planite refuse de travailler. Vous pouvez le voir en direct à http://designdeluge.com/sitemap.xml Je pense que le problème principal est que ce n'est pas reconnaître le PHP code. Voici tout ce que la source:

 <?php 


include 'includes/connection.php';

header("Content-type: text/xml");

echo '<?xml version="1.0" encoding="UTF-8" ?>';

?>

<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">

    <url>
        <loc>http://designdeluge.com/</loc>
        <lastmod>2010-04-20</lastmod>
        <changefreq>weekly</changefreq>
        <priority>1.00</priority>
    </url>

    <url>
        <loc>http://designdeluge.com/about.php</loc>
        <lastmod>2010-04-20</lastmod>
        <changefreq>never</changefreq>
        <priority>0.5</priority>
    </url>

    <?php

    $entries = mysql_query("SELECT * FROM Entries");

    while($row = mysql_fetch_assoc($entries)) {
    $title = stripslashes($row['title']);
    $date = date("Y-m-d", strtotime($row['timestamp']));

    echo "

    <url>
        <loc>http://designdeluge.com/".$title."</loc>
        <lastmod>".$date."</lastmod>
        <changefreq>never</changefreq>
        <priority>0.8</priority>
    </url>";

 } ?>

</urlset>

Le problème est que l'URL dynamique (par exemple, celles tirées de la base de données) ne sont pas générées et que le planite ne validera pas. Merci!

Edit: En ce moment, j'essaie simplement de faire fonctionner le code. Je l'ai configuré comme un PHP fichier sur mon serveur de test local. Le code ci-dessus est utilisé. Donc, rien ne ne s'affiche rien à l'écran ou dans la source. Je pense que j'ai fait Une erreur de syntaxe, mais je ne trouve rien. Toute aide est appréciée!

Edit 2: Ok, je l'ai eue les gars. Apparemment, je devais faire écho à la Déclaration XML avec PHP. Le code final est affiché ci-dessus. Merci pour ton aide!

16
williamg

J'ai utilisé le code de William (merci) et avec quelques petites modifications qui ont fonctionné pour moi.

Je pense que la ligne:

header("Content-type: text/xml");

devrait être la deuxième ligne après le sommet <?php

Incidemment, juste un petit point à quelqu'un d'autre qui la copie, mais il y a un seul caractère d'espace avant le <?php Dans la première ligne - si vous le copiez par inadvertance, comme vous l'avez fait, vous passerez un peu de temps à essayer de déterminer pourquoi le code ne fonctionnera pas pour vous!

Je devais modifier un peu la déclaration de MySQL Sélectionnez un peu aussi.

Enfin, dans la sortie, j'ai utilisé un domaine varié $ de sorte que ce morceau de code puisse être utilisé comme modèle sans qu'il soit nécessaire d'y réfléchir (à condition que vous utilisiez le même nom de la table à chaque fois). Le variabe est ajouté au fichier ConnectDB.PHP qui est inclus dans la connexion à la base de données.

Voici ma version de travail du code de William:

<?php 
header("Content-type: text/xml");
echo '<?xml version="1.0" encoding="UTF-8" ?>';
include 'includes/connectdb.php';
?>

<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">

    <url>
        <loc>http://www.DOMAIN.co.uk/</loc>
        <priority>1.00</priority>
    </url>

    <?php

    $sql = "SELECT * FROM pages WHERE onshow = 1 ORDER BY id ASC";
    $result = mysql_query($sql,$conn);      
    while($row = mysql_fetch_array($result))
    { 
    $filename = stripslashes($row['filename']);
    ?>
    <url>
        <loc>http://www.<?php echo "$domain"; ?>/<?php echo "$filename" ?></loc>
        <changefreq>monthly</changefreq>
        <priority>0.5</priority>
    </url>

 <?php } ?>

</urlset>
5
Chris9