2011-09-23 3 views
0

Je vais avoir un petit problème avec un script je travaille, et ce que je suis en cours d'exécution dans:Enregistrer le code PHP pour le fichier en utilisant fwrite

tout d'abord un peu sur le fonctionnement de script . Il utilise réellement WordPress (c'est un plugin) et il rend les pages dynamiques basées sur divers paramètres qu'ils peuvent changer dans le backend. J'ajoute une fonctionnalité Exporter vers HTML où ils peuvent créer une version statique de cette page après qu'ils ont déjà créé la page dans le plugin.

Dans cette page exportée j'en ai besoin pour enregistrer une fonction PHP en haut du fichier, et une autre ailleurs dans la page. Voilà ce que je suis en train de faire:

$fbscript=file_get_contents('fbscript.txt'); 
$newcontent=str_replace('<!-- dont erase this line -->',$fbscript,$newcontent); 
$fbscript2=file_get_contents('fbscript2.txt'); 
$newcontent=str_replace('<!-- dont erase this line 2 -->',$fbscript2,$newcontent); 

Les 2 dont erase this line choses sont quelque part dans les pages dynamiques où il a besoin de mettre les scripts. C'est ce qui montre quelque part dans la page exportée:

<br /> 
<b>Notice</b>: Undefined index: signed_request in <b>C:\xampp\htdocs\wp\wp-content\plugins\easyfanpagedesign\default.theme\htmlpost-31345.php</b> on line <b>82</b><br /> 
<br /> 
<b>Notice</b>: Undefined offset: 1 in <b>C:\xampp\htdocs\wp\wp-content\plugins\easyfanpagedesign\default.theme\htmlpost-31345.php</b> on line <b>3</b><br /> 

donc je suppose que ce que je suis vraiment en train de demander comment puis-je enregistrer un fichier en utilisant fwrite avec une extension .php et un script php dans la fichier enregistré. Ceci est un exemple du script php je suis en train d'ajouter à la page enregistrée en utilisant fwrite (PHP SDK de Facebook):

<?php 
function parsePageSignedRequesttt($signed_request, $secret) { 
    list($encoded_sig, $payload) = explode('.', $signed_request, 2); 
    $sig = base64_url_decode($encoded_sig); 
    $data = json_decode(base64_url_decode($payload), true); 
    if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') { 
    return null; 
    } 
    $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true); 
    if ($sig !== $expected_sig) { 
    return null; 
    } 
    return $data; 
} 
function base64_url_decode($input) { 
    return base64_decode(strtr($input, '-_', '+/')); 
} 
?> 

Ceci est mon dossier complet de export.php qui fait tout:

<?php 
$content=$_POST['efpd_page_content']; 
$uistyle=$_POST['efpd_ui_style']; 
$app_id=$_POST['efpd_appid']; 
$the_fscripts=$_POST['efpd_fscripts']; 
$the_hscripts=$_POST['efpd_hscripts']; 
$bgstuff=$_POST['efpd_bgstuff']; 
$jquery=$_POST['efpd_jquery']; 
$jqueryui=$_POST['efpd_jqueryui']; 
$cycle=$_POST['efpd_cycle']; 
$copytext=$_POST['efpd_copytext']; 
$affstr=$_POST['efpd_affstr']; 
$the_style=$_POST['efpd_style']; 
$the_gwf=$_POST['efpd_gwfstyle']; 
$secret=$_POST['efpd_secret']; 

if(empty($secret)){$secret=999999;} 

$newcontent=file_get_contents($_POST['efpd_refurl']); 

$fbscript=file_get_contents('fbscript.txt'); 
$newcontent=str_replace('<!-- dont erase this line -->',$fbscript,$newcontent); 
$fbscript2=file_get_contents('fbscript2.txt'); 
$newcontent=str_replace('<!-- dont erase this line 2 -->',$fbscript2,$newcontent); 
$newcontent=str_replace('THE_SECRET',$secret,$newcontent); 

//die(var_dump($newcontent)); 

$int=rand(1,99999); 
$savefile = "htmlpost-$int.php"; 
$handle = fopen($savefile, 'w') or die("can't open file"); 
fwrite($handle,$newcontent); 
fclose($handle); 
echo "<a href='$savefile'>Right Click &gt; Save As to download the generated HTML page.</a>"; 
?> 
+0

Quelque part dans votre code doit être '$ _REQUEST ['signed_request']', n'est-ce pas? – Niko

+0

Ouais c'est dans le deuxième script qui est ajouté au milieu de la page (fbscript2.txt) – Jared

+0

Ok, c'est ce qui provoque ces erreurs qui apparaissent - parce que cette page semble être une application sur facebook et vous ne l'exécutez pas réellement là (maintenant?). – Niko

Répondre

2

Ok, donc votre problème est que vous ne pouvez pas référencer un fichier php de cette façon, car le serveur va l'analyser. Avoir un script séparé qui définit l'en-tête et en faire la cible de votre lien.

header('Content-type: text/plain'); 
header('Content-Disposition: attachment; filename="filename.php"'); 
readfile('filename.php'); 
exit; 
+0

Vous pouvez renoncer entièrement au lien et simplement avoir le code que j'ai fourni à la fin du script. Vous devez être sûr que vous ne produisez rien avant que les en-têtes ne soient envoyés jusqu'à la fin. – gview

+0

Où cela se passe-t-il juste avant l'écriture ou ailleurs? – Jared

+0

Non ce serait après que vous avez écrit et fermé le fichier. readfile le lira à nouveau et retournera le contenu dans le tampon. Remplacez votre variable $ savefile où j'avais filename.php. – gview

1

Bon, maintenant que vous avez mis à jour votre question, la solution est assez claire:

Vous obtenez ces résultats quand vous faites ce que dit votre lien, à droite? Vous faites un clic droit sur ce lien et faites "Enregistrer sous .." - mais vous ne sauvegardez pas vraiment le code php mais juste ce que le serveur sort comme le code php est d'abord exécuté par le serveur.

+0

Ouais mais je suis en train d'essayer de l'obtenir pour sauver le code PHP, pas pour l'exécuter. – Jared

+0

Le code PHP est dans le fichier, mais vous ne pouvez pas l'enregistrer sur votre disque local de cette façon. Voir la réponse de gview pour un code utile pour résoudre ce problème! – Niko

Questions connexes