2010-09-11 10 views
0

Je suis en train de créer un tas de pages HTML statiques à partir d'un seul modèle PHP. Je veux passer un tableau (une ligne dans une base de données MySQL) au fichier modèle .php, afin que je puisse utiliser le contenu en tant que variable et récupérer la page HTML. Quelle est la meilleure façon de faire cela? Une demande POST? Une fonction? Je boucle à travers les résultats de la requête MySQL dans le code suivant et créer une page .html pour chaque ligne, mais je ne suis pas sûr de savoir comment passer le tableau $ row au fichier « template.php »:passer tableau en tant que paramètre pour le fichier PHP

while ($row = mysql_fetch_array($result)) 
{ 

    $variableToPass = $row; 
    $dynamicsource = fopen('Template.php', 'r'); 
    $htmldata = fread($dynamicsource, 1235); 
    fclose($dynamicsource); 

    $targetfilename = "row/" 
     . $row['name'] 
     . ".html"; 
    $targetfile = fopen($targetfilename, 'w'); 
    fwrite($targetfile, $htmldata); 
    } 

le fichier template.php pourrait chercher, par exemple, comme:

<html> 
    <body> 
     <?php 
     include 'mySqlTests.php'; 
     print_r($variableToPass); 
     ?> 
     other text and stuff 
    </body> 
</html> 

Répondre

0

donc, en gros ce que vous cherchez à faire est de chercher des données à partir de la base de données, puis utilisez un fichier PHP comme modèle pour créer un fichier HTML.

La façon la plus simple de le faire est de simplement include le gabarit au point approprié dans le code du générateur de gabarit; vous pouvez mettre ob_start et ob_get_clean autour de l'appel pour capturer la sortie dans une chaîne au lieu de l'envoyer au client. Les variables de l'étendue à partir de laquelle le include est appelé seront disponibles dans le fichier inclus. Exemple:

<?php 
foreach ($rows as $row) { 
    ob_start(); 
    include 'template.php'; 
    $data = ob_get_clean(); 
    file_put_contents('target/' . $row['name'] . '.html'); 
} 

... et le modèle pourrait faire des choses comme:

Il y a quelques considérations avec cette approche si:

  • Si les modèles contenir un code dangereux, il sera exécuté.
  • Le modèle a accès à tous les variabls qui sont dans la portée au moment de l'inclusion, y compris les variables que vous ne voulez pas qu'il modifie. Cela peut être quelque peu atténué en mettant l'appel de modèle dans une fonction dédiée.

Une autre approche consiste à effectuer une simple recherche-remplacement sur le modèle chargé; Au lieu d'utiliser PHP comme langage de template, vous inventez le vôtre. C'est moins efficace, mais plus sûr, car vous limitez l'accès du modèle aux composants internes de votre programme. Une autre option est la base de données vers XML via XSLT route: chargez vos données, transformez-les en représentation XML, appliquez un modèle XSLT qui génère le code HTML (X). Cela offre à la fois flexibilité et sécurité grâce aux injections, mais XSLT est plutôt difficile à maîtriser, plus difficile à déboguer et la conversion au format XML est moins efficace que la route directe vers PHP.

Questions connexes