Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: fwrite oraz $_POST - pomocy
Forum PHP.pl > Forum > PHP
elipsa
Mam wielki problem - otóż posiadam formularz, który metodą POST przekazuje pewną informację do skryptu php (pole formularza ma name="Napisano"). Skrypt ten ma utworzyć nowy plik tekstowy i zapisać tę informację w nim. Wygląda to tak:
  1. <?php
  2. $tresc=$_POST[Napisano];
  3.  
  4. $tresc=stripslashes($tresc);
  5. $tresc=ereg_replace("r", "", $tresc);
  6. $tresc=str_replace("n", " <br> ", $tresc);
  7.  
  8. $akcja=fopen("plik.txt", "w");
  9. flock($akcja, 2);
  10. fwrite($akcja, $tresc);
  11. flock($akcja, 3);
  12. fclose($akcja);
  13. ?>


Otóż to działało bez zarzutu dopóki nie admini nie zaczęli coś zmieniać w php na serwrze. Teraz plik jest tworzony, ale pusty - informacja się nie zapisuje.

Bardzo proszę o pomoc, bo już nie w głowę zachodze co jto jest!

blink.gif
KG-
Prawdopodobnie to wina praw dostępu, najlepiej będzie jeśli ustalisz która funkcja zawodzi.
fopen, flock, fwrite i fclose zwracają false w przypadku błędu, dodatkowo fopen zwraca komunikat na poziomie E_WARNING w przypadku niepowodzenia więc możesz włączyć
  1. <?php
  2. error_reporting(E_ERROR | E_WARNING);
  3. ?>
elipsa
Nie ma żadnego błędu. W dodatku wszystko działa poprawnie, jeżeli zamiast zmiennej z tablicy POST fwrite ma zapisać cokolwiek innego, np. takie coś zadziała bez zarzutu:

  1. <?php
  2. $akcja=fopen("plik.txt", "w");
  3. flock($akcja, 2);
  4. fwrite($akcja, "lalala");
  5. flock($akcja, 3);
  6. fclose($akcja);
  7. ?>


Zamiszczam link do konfiguracji php na serwerze. Może to coś komuś powie :-(

http://jerzy.sopot.pl/skrypty/php_info.php
thornag
  1. <?php
  2. $tresc=$_POST[Napisano];
  3.  
  4. $tresc=stripslashes($tresc);
  5. $tresc=ereg_replace("r", "", $tresc);
  6. $tresc=str_replace("n", " <br> ", $tresc);
  7.  
  8. echo $tresc;
  9.  
  10. $akcja=fopen("plik.txt", "w");
  11. flock($akcja, 2);
  12. fwrite($akcja, $tresc);
  13. flock($akcja, 3);
  14. fclose($akcja);
  15. ?>


Sprobuj tak i powiedz czy widzisz na ekrenie zawartos zmiennej.
elipsa
Tak, zawartość zmiennej się wyświetla.

Wymyśliłem coś takiego, ale nie wiem czy to poprawnw (ale chyba działa):

  1. <?php
  2. $tresc=$_POST[Napisano];
  3.  
  4. $tresc=stripslashes($tresc);
  5. $tresc=ereg_replace("r", "", $tresc);
  6. $tresc=str_replace("n", " <br> ", $tresc);
  7.  
  8. setcookie("tresc", $tresc, time()+60);
  9.  
  10. $akcja=fopen("plik.txt", "w");
  11. flock($akcja, 2);
  12. fwrite($akcja, $_COOKIE[tresc]);
  13. flock($akcja, 3);
  14. fclose($akcja);
  15. ?>


Jak się zapisze zmienną z POST w ciasteczku, to coś takiego fwrite zapisze, a jak ma zapisać bezpośrednio z POST, to tego nie robi. O co tu może chodzić? A można zapisać wartośćz tablicy POST jeszcze gdzieś indziej? worriedsmiley.gif
skowron-line
a moze sprobuj inny tryb zapisu do pliku

P.S
  1. <?php
  2. $tresc=str_replace("n", " <br> ", $tresc);
  3. ?>

nielepiej bylo uzyc
  1. <?php
  2. $tresc = nl2br("$tresc");
  3. ?>


ale to nie istotne
elipsa
A co to znaczy z tym trybem zapisu?
skowron-line
  1. <?php
  2. $akcja=fopen("plik.txt", "w");
  3. ?>

zamiast w daj "ab"
elipsa
Nie działa :-/

Wygląda to tak, jak gdyby php uparło się, aby nie zapisywać do pliku czegoś przesłanego metodą POST. Dla próby dałem metodą GET i wtedy zadziałało. Czy gdzieś w ustawieniach php (php.ini?) można coś takiego ustawić?

A co myślicie o sztuczce z ciasteczkiem?
skowron-line
wiesz jezeli dziala to chyba mozna to nazwac dobra metoda ale wiesz ja osobiscie nie wiem ale ciasteczko moze miec ograniczona ilosc znakow
elipsa
No tyak, ale można jakoś inaczej?
skowron-line
  1. <?php
  2. $tresc=$_POST[Napisano];
  3.  
  4. $tresc=stripslashes($tresc);
  5. $tresc=ereg_replace("r", "", $tresc);
  6. $tresc=str_replace("n", " <br> ", $tresc);
  7.  
  8. echo $tresc;
  9.  
  10. $akcja=fopen("plik.txt", "w");
  11. flock($akcja, 2);
  12. fwrite($akcja, "cos");
  13. flock($akcja, 3);
  14. fclose($akcja);
  15. ?>

a probowales tak.A moze jeszcze jedna mysl moze zmienna daj w cudzyslow
zobacz czy zwyklego stringa zapisze nie ze zmiennej.
pozdrowki
elipsa
Z cudzysłowem podwójnym, pojedynczym i bez jest to samo. Najgorsze, że to wszystko działało, dopóki ostatnio nie padł serwer. Wgrali na nowo php i teraz są same niespodzianki. Dlatego też zastanawiam się, czy jest może jakaś dyrektywa w php zabraniająca skryptom zapis do pliku danych przesłanych metodą POST.
thornag
raczej nie, bo zapisujesz te dane do zwyklej zmiennej.

Sprobuj jesio dla elegancji zmienic $_POST[Napisano]; na $_POST['Napisano'];
elipsa
Ja już się poddaję - 2 dni nad tym myślałem i nic. Widać są na tym świecie rzeczy "dla zmysłów niepojęte", skoro nawet tu, na takim forum nikt nie zna odpowiedzi.
.radex
Cytat(thornag @ 28.07.2006, 11:40 ) *
raczej nie, bo zapisujesz te dane do zwyklej zmiennej.

Sprobuj jesio dla elegancji zmienic $_POST[Napisano]; na $_POST['Napisano'];


Nie znam się dobrze na tym ale czy apostrofy nie robią też różnicy w działaniu ? Bo jak ja raz napisałem skrypt z odwołaniem do POST bez apostrofów to wyskoczył mi błąd
thornag
Nie wiem czy apostrofy to konwencja, elegancja czy moze cos wymaganego co roznie dziala na roznych konfiguracjach serwera. Jednak wszyscy gonia do ich uzywania wiec lepiej sobie zlych nawykow nie wyrabiac. Jesli na jakims problemie maja pojawic sie problemy po nie ma ' to lepiej dodac je od razu wtedy przy przenosinach nie ma przykrych niespodzianek smile.gif
nospor
Cytat
Nie znam się dobrze na tym ale czy apostrofy nie robią też różnicy w działaniu ? Bo jak ja raz napisałem skrypt z odwołaniem do POST bez apostrofów to wyskoczył mi błąd


Cytat
Nie wiem czy apostrofy to konwencja, elegancja czy moze cos wymaganego co roznie dziala na roznych konfiguracjach serwera. Jednak wszyscy gonia do ich uzywania wiec lepiej sobie zlych nawykow nie wyrabiac. Jesli na jakims problemie maja pojawic sie problemy po nie ma ' to lepiej dodac je od razu wtedy przy przenosinach nie ma przykrych niespodzianek


A teraz idziemy do manuala i sie juz wiecej nie zastanawiamy czy to tradycja, wymysl chorych ludzi czy może blad:
http://pl2.php.net/manual/pl/language.types.array.php
Cytat
Co wolno, a czego nie w tablicach?
Dlaczego zapis $foo[bar] jest niepoprawny?

W starych skryptach można spotkać taką składnię:

$foo[bar] = 'coś';
echo $foo[bar];
// itd.

Ten zapis jest niepoprawny, ale działa. Dlaczego zatem jest niepoprawny? Powód jest to, co opisano w rozdziale składnia, że pomiędzy nawiasami kwadratowymi ('[' i ']') musi znajdować się wyrażenie. Oznacza to, że można używać czegoś takiego:

echo $arr[ foo(true) ];

Jest to przykład użycia wartości zwracanej przez funkcję jako indeksu tablicy. php zna też stałe, więc można spotkać zastosowanie E_*.

$opis_błędu[E_ERROR] = "Wystąpił poważny błąd";
$opis_błędu[E_WARNING] = "php wysłało ostrzeżenie";
$opis_błędu[E_NOTICE] = "To jest tylko nieformalna uwaga";

Proszę pamiętać, że E_ERROR jest także ważnym identyfikatorem, tak jak bar w pierwszym przykładzie. Ale ostatni przykład znaczy to samo co:

$opis_błędu[1] = "Wystąpił poważny błąd";
$opis_błędu[2] = "php wysłało ostrzeżenie";
$opis_błędu[8] = "To jest tylko nieformalna uwaga";

ponieważ E_ERROR znaczy to samo co 1, itd.

W takiem razie, jak to możliwe, że $foo[bar] działa? To działa, ponieważ bar, zgodnie z jego zapisem powinien być stałą. Jednakże w tym przypadku nie instnieje stała o nazwie bar. php teraz zakłada, że masz na myśli bar literalnie, czyli jako łańucuch "bar", tylko że zapomniałeś napisać cudzysłowów.
Więc dlaczego tak jest źle?

Kiedyś w przyszłości grupa php może chcieć dodać jeszcze jedną stałą lub słowo kluczowe i wtedy będziesz miał kłopot. Dla przykładu, obecnie już nie można używać słów empty i default, gdyż są to specjalne słowa kluczowe.

Poza tym, jeśli dotąd argumenty nie przekonują cię: ta składnia jest po prostu odrzucona i kiedyś może przestać działać.

Notatka: Po przełączeniu error_reporting na E_ALL, zobaczysz, że php generuje ostrzeżenie, kiedy tylko powyższa składnia zostanie użyta. Tak samo generowane będą ostrzeżenia odnośnie innych odrzuconych "udogodnień". (umieść w swoim skrypcie linię error_reporting(E_ALL)winksmiley.jpg
elipsa
No, już sobie poradziłem i nie miało to żadnego związku z apostrofami. Zauważyłem, że po rekonfiguracji php zapisywało mi plik 2 razy, tylko że za drugim razem zmienna z tablicy POST była już pusta. W efekcie miało się wrażenie, że php po prostu nie zapisuje zmiennej z tablicy POST do pliku. Wystarczy więc coś takiego:

  1. <?php
  2. $tresc=$_POST["Napisano"]; // mogą sobie być te apostrofy, ale to i tak nic nie zmienia :-/
  3.  
  4.  
  5. if($tresc!="") {
  6.  
  7. $tresc=stripslashes($tresc);
  8. $tresc=ereg_replace("r", "", $tresc);
  9. $tresc=str_replace("n", " <br> ", $tresc);
  10.  
  11. $akcja=fopen("plik.txt", "w");
  12. flock($akcja, 2);
  13. fwrite($akcja, $tresc);
  14. flock($akcja, 3);
  15. fclose($akcja);
  16.  
  17. }
  18. ?>


I to działa!

Nie wiem, o co tu dokładnie chodzi i dlaczego probem jest akurat ze zmienną POST (bo zmienna z GET działa). Jakby ktoś potrafił to zjawisko wyjaśnić, to byłoby bardzo fajnie. Pozdrawiam wszystkich zainteresowanych tym tematem.
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.