Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Błędny zapis danych do pliku.
Forum PHP.pl > Forum > PHP
morfineusz
Witam, przeszukałem już forum i chyba całe google, nic nie znalazłem :/

Mam problem z funkcją zapisu pliku, zapełnieniem go danymi i pobraniem na komputer. Funkcja jest wywołana po kliknięciu w button.

Oto funkcja:
  1. FUNCTION save_at_drive()
  2. {
  3. $file="temporary/".$_SESSION['temp_name'].".html";
  4. fopen($file, "w");
  5. $current=file_get_contents($file);
  6. $current.=$_SESSION['note'];
  7. file_put_contents($file, $current);
  8.  
  9. header('Content-type: text/html;');
  10. header('Content-Disposition: attachment; filename="'.$_SESSION['note_tittle'].'.html"');
  11. header('Content-Length: '.filesize($file));
  12. header("Pragma: no-cache");
  13. readfile($file);
  14. unlink($file);
  15. }


Więc problem jaki występuje to:
1. Tworzenie pliku - OK
2. Wypełnienie pliku danymi wysłanymi z formularza ($_SESSION['note']) - OK (uwaga! w sesji jest zapisany tekst, np. "Mam problem z kodem")
3. Pobranie pliku - OK
4. Usunięcie tymczasowego pliku - OK
5. Otworzenie pliku z dysku ... NIE OK - a dlaczego? Już mówię...

Otóż, kiedy otwieram ściągnięty plik, znajduje się w nim tekst z sesji ("mam problem z kodem") + CAŁY KOD STRONY, w której została wywołana funkcja. O co chodzi?? :/

Dodam jeszcze, że póki plik nie zostanie ściągnięty na dysk (jest w postaci pliku tymczasowego). Zawiera w sobie tylko tekst z sesji.

Siedzę już nad tym parę godzin. Chciał bym iść z aplikacją dalej ale nie mam bladego pojęcia co jest grane :/ Pierwszy raz spotkałem się z takim problemem. facepalmxd.gif

Proszę o pomoc i serdecznie pozdrawiam.
nospor
No jesli po wywolaniu funkcji save_at_drive() generujesz normalnie dalej strone, co zapewne robisz, to nic dziwnego ze zwraca ci rowniez calą strone.
W funkcji save_at_drive() ma byc EXIT na koncu
morfineusz
Dzięki za podpowiedź, dodałem na koniec funkcji polecenie exit; Niestety :/ pomogło w dosłownie połowie smile.gif generuje mi z kodem i tekstem ale do połowy kodu tongue.gif

Może inaczej.

Plik index.php
  1. <?php INCLUDE ('functions.php'); ?>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <META http-equiv="content-type" content="text/html; charset=utf-8">
  6. <META name="Language" content="pl">
  7. <META name="Generator" content="Notepad++">
  8. <link rel="stylesheet" type="text/css" href="style.css" />
  9. <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  10. <script src="ckeditor/ckeditor.js"></script>
  11. <script src="ckeditor/adapters/jquery.js"></script>
  12. <script>
  13. $( document ).ready( function() {
  14. $( 'textarea#noteeditor' ).ckeditor();
  15. } );
  16. CKEDITOR.editorConfig = function( config ) {
  17. config.language = 'pl';
  18. config.uiColor = '#AADC6E';
  19. config.height = '100%';
  20. };
  21. </script>
  22. </head>
  23. <body>
  24. <div id="header">
  25. <div id="response">
  26. <?php response(); ?>
  27. </div>
  28. Fast-Note.Online
  29. </div>
  30.  
  31. <div id="container">
  32. <form method="POST">
  33. <div id="menu">
  34. <input type="text" name="note_tittle" value="Tytuł Notatki" onfocus="if(this.value == 'Tytuł Notatki'){this.value = '';}"
  35. onblur="if (this.value == '') {this.value = 'Tytuł Notatki';}" />
  36.  
  37. <input type="submit" name="save_at_drive" value="Zapisz plik na dysku"/>
  38.  
  39. <input type="text" name="e-mail_adress" value="Podaj E-mail..." onfocus="if(this.value == 'Podaj E-mail...'){this.value = '';}"
  40. onblur="if (this.value == '') {this.value = 'Podaj E-mail...';}" />
  41.  
  42. <input type="submit" name="send_via_mail" value="Wyślij na adres e-mail"/>
  43. </hr>
  44. </div>
  45. <textarea id="noteeditor" name="data"><?php show_from_memory(); ?></textarea>
  46. </form>
  47. </div>
  48. </body>
  49. </html>


Plik functions.php
  1. <?php
  2. FUNCTION response()
  3. {
  4. if(isset($_POST['save_at_drive']))
  5. {
  6. save_to_memory($_POST['data'],$_POST['note_tittle']);
  7. save_at_drive();
  8. }
  9. }
  10.  
  11. FUNCTION save_to_memory($var1, $var2)
  12. {
  13. $temp_name=rand(0,99999)."-".date('Y-m-d');
  14. $note=$var1;
  15. $note_tittle=$var2;
  16. $_SESSION['temp_name']=$temp_name;
  17. $_SESSION['note']=$note;
  18. $_SESSION['note_tittle']=$note_tittle;
  19. }
  20.  
  21. FUNCTION show_from_memory()
  22. {
  23. if(isset($_SESSION['note'])) echo $_SESSION['note'];
  24. else echo "Start writting your note.";
  25. }
  26.  
  27. FUNCTION save_at_drive()
  28. {
  29. $file="temporary/".$_SESSION['temp_name'].".html";
  30. fopen($file, "w");
  31. $current=file_get_contents($file);
  32. $current.=$_SESSION['note'];
  33. file_put_contents($file, $current);
  34.  
  35. header('Content-type: text/html;');
  36. header('Content-Disposition: attachment; filename="'.$_SESSION['note_tittle'].'.html"');
  37. header('Content-Length: '.filesize($file));
  38. header("Pragma: no-cache");
  39. readfile($file);
  40. unlink($file);
  41. }
  42. ?>


Może to nie przez tą funkcję robi taki błąd? Może gdzieś po drodze popełniłem błąd?
nospor
facepalmxd.gif

Napisalem wyraznie: na koncu funkcji a nie na poczatku i na koncu..... EXIT powoduje natychmiastowe zakonczenie pracy skryptu. NATYCHMIASTOWE.

Poza tym, nie mozesz generowac zadnego kodu zarowno przed jak i po funkcji save_at_drive. Do przegladarki ma isc tylko i wylacznie plik, ktorych chcesz zwrocic. Nic wiecej
morfineusz
A więc, po kolejnych godzinach kombinowania, szukania i denerwowania się, doszedłem do tego że wina leży po stronie drugiej części funkcji save_at_drive()
  1. FUNCTION save_at_drive()
  2. {
  3. $file="temporary/".$_SESSION['temp_name'].".html";
  4. fopen($file, "w");
  5. $current=file_get_contents($file);
  6. $current.=$_SESSION['note'];
  7. file_put_contents($file, $current);
  8.  
  9. header('Content-type: text/html;');
  10. header('Content-Disposition: attachment; filename="'.$_SESSION['note_tittle'].'.html"');
  11. header('Content-Length: '.filesize($file));
  12. header("Pragma: no-cache");
  13. readfile($file);
  14. unlink($file);
  15. }


Wyłączając z kodu tej funkcji wszystkie header'y. Funkcja generuje mi plik o losowej nazwie, z zawartością z pola TEXTAREA. Dopiero przy ściągnięciu tego pliku, do wnętrza pliku zostaje dodany cały KOD pliku w którym funkcja save_at_drive() została wywołana. Niestety dalej nie mam pojęcia jak to naprawić :/ Stawiam największe piwo za pomoc! smile.gif
nospor
Przeciez ci napisalem: nie mozesz wysylac nic innego procz pliku, ktorych chcesz dac do pobrania. A Ty ciagle i uparcie generujesz cala strone razem z plikiem.

Jesli nadal nie potrafisz czytac ze zrozumieniem to ten kawalek:
<?php response(); ?>
ktory masz teraz w srodku strony, daj zaraz na samym poczatku:

<?php INCLUDE ('functions.php'); ?>
<?php response(); ?>

Oraz dopisz TYLKO JEDEN EXIT na koncu funkcji, o ktorej ci juz pisalem. JEDEN EXIT na koncu a nie na koncu i poczatku...
morfineusz
Dzięki, nie wiedziałem o co dokładnie chodzi z generowaniem strony smile.gif Wczoraj poradziłem sobie z problemem dodając do funkcji save_at_drive ob_clean i flush. Zadziałało, zaraz sprawdzę jeszcze twoje wskazówki. Jeżeli chodzi o dodanie ob_clean i flush, DZIAŁA. Ale pojawił się problem z kodowaniem znaków smile.gif


Ok, sprawdziłem twoje rozwiązanie. Zniknęły oby dwa problemy, czyli generowanie pliku działa jak należy i kodowanie znaków również pozostało UFT-8

Serdecznie dziękuję za pomoc. Teraz pozostaje Ci podać dane do wysyłki dużego piwa smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.