[php] problem z scieżką zapisywania danych w pliku

Witam.

uczę się języka i natrafiłem na problem. robię taki mały formularzyk. w książce z której się uczę jest taki fragment kodu:

// otwarcie pliku w celu zapisania
  1. ścieżka względna, jak sama nazwa skazuje, zależy od miejsca startu - w tym przypadku od położenia pliku, którego fragment zaprezentowałeś.

  2. Jak w tym skrypcie wygląda zawartość zmiennej $DOCUMENT_ROOT?

czyli jak będzie ona wyglądała, bo nie za bardzo się orientuje.

no właśnie z tą zmienną też nie rozumiem do końca. została tylko nadana krótka forma… czyli

$DOCUMENT_ROOT = $_POST['DOCUMENT_ROOT'];

Hę? $DOCUMENT_ROOT wysyłany przez przeglądarkę? To jakaś pomyłka! (jeżeli nie wiesz co to $_POST to poczytaj) Takie rzeczy jak $DOCUMENT_ROOT powinny być ustawione w jakimś pliku typu config.php, żeby inne skrypty mogły je includować.

Znając życie i kanony sztuki, powinno być tak: w pliku config.php

$DOCUMENT_ROOT='C:\Program Files\Apache Group\Apache\htdocs\test'

lub równoważnie

$DOCUMENT_ROOT="C:\\Program Files\\Apache Group\\Apache\\htdocs\\test"

(jeżeli nie wiesz w czym jest różnica poczytaj) a w skrypcie który podałeś:

@$wp = fopen("$DOCUMENT_ROOT\\zamowienia.txt", 'ab');

lub

@$wp = fopen($DOCUMENT_ROOT.'\zamowienia.txt', 'ab');

ps. Zauważyłem buga w skrypcie, który podałeś:

Plik zamowienia.txt znajduje się w katalogu ‘test’ (według tego co napisałeś pod skryptem), a nie ‘zamowienia’ (tam gdzie ma wpisane fopen).

okej, zauważyłem coś takiego że na chwile obecną, po edytowaniu wiersza na podany przez Ciebie, czyli

@$wp = fopen("$DOCUMENT_ROOT\\zamowienia.txt", 'ab');

, plik tekstowy z zamówieniami pojawił się w c:\ . jak teraz zrobić by pojawiał się w folderze w którym jest reszta plików tj. formularz i skrypt php który go przetwarza? w pliku httpd.conf jest tak:

DocumentRoot "C:/Program Files/Apache Group/Apache/htdocs"

i nie rozumiem jeszcze tego do czego mnie odesłałeś, czyli z tym DOCUMENT_ROOT nie mam go przypisywać do $_POST ? nie rozumiem tego właśnie, dało by radę to jakoś po krótce wyjaśnić ? trzeba coś ruszać jeszcze coś z $DOCUMENT_ROOT oprócz tego co mam w fopen(); ?

To może tak: żeby ułatwić mi pomaganie Tobie, weź spakuj w zipa całą zawartość katalogu C:\Program Files\Apache Group\Apache\htdocs\test\ i wrzuć ja jakiś http://www.sendspace.pl/ czy http://www.wrzucaj.pl/ żebym mógł obejrzeć całość, bo na tych skrawkach informacji ciężko mi jest powiedzieć cokolwiek konstruktywnego.

okej, już rozwiązałem z tą scieżką chyba.

@ $wp = fopen("$DOCUMENT_ROOT\Program Files\Apache Group\Apache\htdocs\mysz\zamowienia.txt", 'ab');

w tym przypadku to jest ścieżka względna ?

wysłalem.

Już mam pełną jasność. (dla innych powiem tylko, że pliki dostałem na priva). W twoim skrypcie zmienna $DOCUMENT_ROOT jest niepotrzebna i należy się jej pozbyć i skazać na zapomnienie. To co napisałeś wyżej działa, bo ta zmienna jest pusta. To że w pliku httpd.conf jest DocumentRoot absolutnie nie ma wpływu na zmienne w php.

O ile dobrze Cię rozumiem, to chcesz żeby było tak:

@$wp = fopen('..\zamowienia\zamowienia.txt', 'ab');

okej, teraz wszystko super działa. Mam jeszcze ostatnie pytanie. w pliku zamówienia.txt każde zamówienie jest dopisywane w jednej linii, jak to zrobić by każde nowe było zapisywane w nowym wierszu. zmienna wygląda tak:

$ciagwyjsciowy = $date."\t".$iloscopon." Opon \t".$iloscoleju." Butelek oleju\t".$iloscswiec." Świec zapłonowych\t".$wartosc ." PLN\t". $adress. " \n";

jest tam symbol “\n” na końcu, ale w ogóle dziwnie jest odczytywany…

Zamień \t na \n lub na \r\n.

\t to znak tabulacji

\n to znak nowego wiersza

\r to znak powrotu karetki

samo \n wystarczy ale w windowsie jak to otworzysz to będzie sieczka mała, dlatego musi być \r\n. Chociaż zależy czym to otworzysz, dobry edytor tekstowy powinien poprawnie czytać samo \n.

Ogółem w unixie używa się tylko znaku końca wiersza (\n) a w windowsie obu (\r\n).

Zatem:

$ciagwyjsciowy = $date."\r\n".$iloscopon." Opon \r\n".$iloscoleju." Butelek oleju\r\n".$iloscswiec." Świec zapłonowych\r\n".$wartosc ." PLN\r\n". $adress. " \r\n";

Witam.

Ponownie pojawił się problem. Po wrzuceniu na serwer, gdy daje aby przetworzyło formularz to nie da rady zapisać tych zamówień w dokumencie tekstowym. jak się domyślam coś jest nie tak znów w tym fragmencie

@$wp = fopen('..\zamowienia\zamowienia.txt', 'ab');

.

bo na localhost normalnie tworzy dokument i wpisuje tam zamówienia.

pozdrawiam

A może na serwerze jest problem z uprawnieniami do plików i katalogów?

a jak to sprawdzić ?

normalnie to powinno utworzyć ten plik tekstowy na serwerze, tak ? jeżeli wpiszę taki kod

@$wp = fopen('..\zamowienia.txt', 'ab');

to powinno utworzyć w głównym katalogu ?

A może skasuj małpkę i zobacz jaki wypisze komunikat błędu.

W niewłaściwą stronę łamana, powinno być:

fopen(’…/zamowienia/zamowienia.txt’, …

oczywiście mają być odpowiednie uprawnienia.

po skasowaniu at nic się nie zmieniło w wyświetlanym komunikacie.

Zmiana ukośników też nie pomogła.

a jak sprawdzić te uprawnienia, lub ewentualnie zmienić je jeżeli jest możliwość ?

Witam!

Chciałem odświeżyć temat. Natknąłem się na ten sam problem, pewnie korzystaliśmy z tego samego podręcznika.

Po wpisaniu ścieżki:

@ $wp = fopen("E:/wamp/www/../zamowienia/zamowienia.txt","a",1);

otwiera plik, a po wpisaniu ścieżki:

@ $wp = fopen("$DOCUMENT_ROOT/.../zamowienia/zamowienia.txt","a",1);

wyskakuje komunikat "

Notice: Undefined variable: DOCUMENT_ROOT in E:\wamp\www\zamow\przetworzzamowienie.php on line 86

Warning: fopen(/…/zamowienia/zamowienia.txt) [function.fopen]: failed to open stream: No such file or directory in E:\wamp\www\zamow\przetworzzamowienie.php on line 86"

w phpinfo() odnalazłem informacje, że DOCUMENT_ROOT E:/wamp/www/

więc pojawiajacy się błąd jest tym mniej dla mnie logiczny.

Proszę o pomoc. Być może trzeba zmienić coś w konfiguracji. Szukam, ale nie mogę sobie z tym poradzić, a jestem początkujący.

A czy DOCUMENT_ROOT jest zmienną, czy stałą? Bo jeżeli twierdzi, że “Undefined variable: DOCUMENT_ROOT”, to może to być stała i trzeba zmienić kod na

@$wp = fopen(DOCUMENT_ROOT . "/../zamowienia/zamowienia.txt","a",1);

http://pl.php.net/manual/en/language.co … syntax.php

Nie $DOCUMENT_ROOT, a $_SERVER[‘DOCUMENT_ROOT’] ew. $_ENV[‘DOCUMENT_ROOT’]. Poza tym nie wiem czemu tak, a nie inaczej, ale nie wnikam ;].