2012-04-12 14 views
0

Ich habe eine Seite mit einem WYSIWYG-Editor, den der Benutzer verwenden kann. Nach der Bearbeitung können sie eine Taste drücken, und das Javascript sollte die aktuelle Seite in eine save.php-Datei POST und aktualisieren Sie die Seite mit neuen Informationen.Warum überschreibt file_put_contents nicht?

Es gibt zwei Probleme. Die erste besteht darin, dass die Seite anfangs nicht mit der aktualisierten Datei geladen wird. Der Benutzer muss die Seite aktualisieren, um sie aktualisiert zu sehen (vielleicht dauert es nur eine zusätzliche Sekunde, um die Datei zu schreiben?). Das zweite Problem besteht darin, dass nach dem ersten Erstellen der temporären Datei diese nicht überschrieben werden kann. Daher wird die Seite nach der ersten Aktualisierung nie aktualisiert. Hier sind die Schnipsel Ich arbeite mit:

Javascript-Funktion auf der WYSIWYG-Editor Seite (editor.php):

function refresh(html,username,info) 
{ 
    $.post("save.php", { html: html, username: username }); 
    window.location = 'editor.php?info=' + info; 
} 

save.php Datei

$html = $_POST['html']; 
$username = $_POST['username']; 
file_put_contents('temp/' . $username . '.txt', $html); 
+6

GAPING SECURITY HOLE! 'username = ../save.php% 00' und' html = ThiefMaster

+1

Bereinigen Sie Ihre Daten immer richtig. Wenn Sie nicht wissen, wie, lesen Sie bitte ein Tutorial. –

+0

Welche Berechtigungen hat die Datei, wenn sie erstellt wird? – Jon

Antwort

1

Da der Browser die POST-Anforderung nicht ausgegeben haben, bevor auf die nächste Seite zu navigieren, verwenden Sie den Erfolg Rückruf von der Post die relocate zu tun:

function refresh(html,username,info) { 
    $.post("save.php", { html: html, username: username }, function() { 
    window.location = 'editor.php?info=' + info; 
    }); 
} 

Wie andere Leute haben bereits kommentiert, Daten direkt mit Von einem Formular-Post ohne Desinfektion ist es ein wirklich schlechter Plan und öffnet Ihren Server für alle Arten von bösartigen Angriffen. Sehen Sie sich einige dieser Fragen an: https://stackoverflow.com/search?q=sanitize+php

Wenn die Daten auf Ihrem Server in Ordnung sind, stellen Sie sicher, dass die Zugriffsberechtigungen für das Verzeichnis 'temp' Schreibzugriff vom Webserver-Benutzer erlauben (wenn Sie Zugriff darauf haben) SSH zu deinem Server, führe chmod go+w /path/to/temp aus, sonst können die meisten FTP-Programme auch Dateiberechtigungen setzen).

0

warum nicht fopen verwenden und fwrite?

einfach verwenden:

$html = $_POST['html']; 
$username = $_POST['username']; 
$file = "temp/" . $username . ".txt"; 

if (!file_exists($file)) { 
    $files = fopen($file, "x+"); 
} else { 
    $files = fopen($file, "w+"); 
} 

if(fwrite($files, $html)) { 
    echo "Success!"; 
} else { 
    echo "Failure!"; 
} 

für die PHP und die Refresh-Arbeit in js zu machen, versuchen, die Anweisung in der Erfolgsfunktion wie folgt setzen:

function refresh(html,username,info) { 
    $.post("save.php", { html: html, username: username }, 
      function (response) { 
      window.location = 'editor.php?info=' + info; 
      console.log(response);// for debugging :) 
      }); 
} 
+1

Warum sollte sich 'fopen' anders verhalten als' file_put_contents'? – Jon

+0

gut 'file_put_contents' funktioniert nicht, mit dem richtigen Code, unter der Annahme, dass der Rest seines Codes, die wir nicht sehen können, richtig ist, scheint es logisch zu versuchen' fopen', es ist nie für mich gescheitert. – CKKiller

+0

Ich habe auch versucht, fopen/fwrite, aber mit den gleichen Ergebnissen. Danke für die Erfolgsfunktion. – James

0

Die Ajax-Anforderung ist asynchrones so Der Schreibvorgang kann ausgeführt werden, wenn die Umleitung gestartet wird. Sie müssen den fertigen Exent der Aktion $ .post anhören, um die Weiterleitung durchzuführen.

Verwandte Themen