Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z zapisem w pliku txt
Forum PHP.pl > Forum > PHP
zenoon
Dopiero co zacząłem uczyć się php i kupiłem sobie książkę "php i MySQL vademecum..." wyd. Helion. Pierwszym zadaniem w nim jest stworzenie sklepu z częściami samochodowymi. Gdy już mamy takie coś to trzeba zamówienia zapisywać (w pliku txt). W książce jest taki kod:


Kod
<?php
  // utworzenie krótkich nazw zmiennych
  $iloscopon = $_POST['iloscopon'];
  $iloscoleju = $_POST['iloscoleju'];
  $iloscswiec = $_POST['iloscswiec'];
  $adres = $_POST['adres'];
  $adres = $_POST['adres'];

  $DOCUMENT_ROOT = $_POST['DOCUMENT_ROOT'];
?>

<html>
<head>
  <title>Części samochodowe Janka — wyniki zamówienia</title>
</head>
<body>
<h1>Części samochodowe Janka</h1>
<h2>wyniki zamówienia</h2>
<?php

$data=date('H:i, jS F');

  echo '<p>Zamówienie przyjęte o ';

  echo $data;
  echo '</p>';
  echo '<p>Zamówienie Państwa wygląda następująco: </p>';

  $ilosc=0;
  $ilosc=$iloscopon+$iloscoleju+$iloscswiec;

  if( $ilosc == 0 )
  {
   echo 'Na poprzedniej stronie nie zostało złożone żadne zamówienie!<br />';
  }
  else
  {
   if ( $iloscopon>0 )
     echo $iloscopon.' opon<br />';
   if ( $iloscoleju>0 )
     echo $iloscoleju.' butelek oleju<br />';
   if ( $iloscswiec>0 )
     echo $iloscswiec.' świec zapłonowych<br />';
  }

  $wartosc=0.00;

  define('CENAOPON', 100);
  define('CENAOLEJU', 10);
  define('CENASWIEC', 4);

  $wartosc =$iloscopon * CENAOPON + $iloscoleju * CENAOLEJU + $iloscswiec * CENASWIEC;

  $wartosc=number_format($wartosc, 2, '.', ' ');

  echo '<P>Wartość zamówienia wynosi '.$wartosc.'</P>';

  echo '<P>Adres wysyłki to '.$adres. '</P>';

  $ciagwyjsciowy = $data."\t".$iloscopon." opon \t".$iloscoleju." butelek oleju\t"
               .$iloscswiec." swiec zapłonowych\t".$wartosc
               ."PLN/t". $adres."\n";

  // otwarcie pliku w celu dopisywania
@ $wp = fopen("$DOCUMENT_ROOT/../zamowienia/zamowienia.txt", 'ab');

  if (!$wp)
  {
   echo '<p><strong> Zamówienie Państwa nie może zostać przyjęte w tej chwili.  '
       .'Proszę spróbować później.</strong></p></body></html>';
   exit;
  }

  fwrite($wp, $ciagwyjsciowy, strlen($ciagwyjsciowy));
  fclose($wp);

  echo '<p>Zamówienie zapisane.</p>';
?>
</body>
</html>




Niestety gdy wrzucam to na serwer i próbuję zapisać to do pliku zamowienia.txt to za każdym razem mam komunikat niepowodzenia. Nie wiem co jest nie tak. Proszę o pomoc!

Z góry wielkie dzięki i sorry za tak debilne pytania.
eai
Pokaż jaki błąd wywala.
zenoon
nie wywala błędu bo dałem przecież instrukcję:

Kod
@ $wp = fopen("$DOCUMENT_ROOT/../zamowienia/zamowienia.txt", 'ab');
if (!$wp)  {   echo '<p><strong> Zamówienie Państwa nie może zostać przyjęte w tej chwili.  '
.'Proszę spróbować później.</strong></p></body></html>';  
exit;  }


i wyswietla sie tylko ta notka. a jesli jej nie ma to ma problem z odczytem (2 razy) raz zapisem i raz z zamknieciem
Cysiaczek
Sprawdź, czy masz prawo zapisu do katalogu zamowienia.
Możesz tez sprawdzić, czy $DOCUMENT_ROOT jest utworzona, bo byc może jej nie ma, a to oznaczm że ściezka do pliku zamowienia.txt jest niepoprawna.

Pozdrawiam
zenoon
wszystko jest na miejscu. i nie wiem co zrobic dry.gif
Cysiaczek
Pokaż komunikat błędu w takim razie.
zenoon
Kod
Warning: fopen() [function.fopen]: open_basedir restriction in effect. File(/../zamowienia/zamowienia.txt) is not within the allowed path(s): (/home) in /home/l/i/v/livesgood/www/szukaj/rozdzial_02/przetworzzamowienie.php on line 65

Warning: fopen(/../zamowienia/zamowienia.txt) [function.fopen]: failed to open stream: Operation not permitted in /home/l/i/v/livesgood/www/szukaj/rozdzial_02/przetworzzamowienie.php on line 65

Warning: fwrite(): supplied argument is not a valid stream resource in /home/l/i/v/livesgood/www/szukaj/rozdzial_02/przetworzzamowienie.php on line 67

Warning: fclose(): supplied argument is not a valid stream resource in /home/l/i/v/livesgood/www/szukaj/rozdzial_02/przetworzzamowienie.php on line 68
eai
Nie znajduje pliku. Sprawdz ścieżke. Prawa do zapisu.
Cysiaczek
/../zamowienia/zamowienia.txt

tak wygląda twoja ścieżka zapisu - pisałem, żebyś sprawdził, czy masz $DOCUMENT_ROOT - ne srawdziłeś, i widać, że nie masz jej. Zresztą. Nawet, gdyby była, to i tak skrypt sie nie wykona, bo nie masz uprawnień do wychodzenia poza swój katalog domowy. Zrób tak:
  1. <?php
  2. $wp = fopen("zamowienia/zamowienia.txt", 'ab');
  3. ?>


Zadziała.
zenoon
sprawdziłem i chyba wszystko się zgadza. Ale wyjaśnię Wam wszystko:

strona, na której to mam: http://livesgood.ovh.org/naukaphp/formularz.html

formularz wyglada nastepujaco:
Kod
<html>
<head>
  <title>Części samochodowe Janka</title>
</head>
<body>
<h1>Części samochodowe Janka</h1>
<h2>Formularz zamówienia</h2>

<form action="przetworzzamowienie.php" method=post>
<table border=0>
<tr bgcolor=#cccccc>
  <td width=150>Produkt</td>
  <td width=15>Ilość</td>
</tr>
<tr>
  <td>Opony</td>
  <td align=left><input type="text" name="iloscopon" size=3 maxlength=3></td>
</tr>
<tr>
  <td>Olej</td>
  <td align=left><input type="text" name="iloscoleju" size=3 maxlength=3></td>
</tr>
<tr>
  <td>Świece Zapłonowe</td>
  <td align=left><input type="text" name="iloscswiec" size=3 maxlength=3></td>
</tr>
<tr>
  <td>Adres</td>
  <td align=left><input type="text" name="adres" size=40 maxlength=40></td>
</tr>
<tr>
  <td colspan=2 align=center><input type=submit value="Złóż zamówienie"></td>
</tr>
</table>
</form>

</body>
</html>


plik php już podałem. w katalogu mam formularz.html i przetworzzamowienie.php. w katalogu zamowienia (jest on o folder wyżej niż formularz) mam plik zamowienia.txt. nie wiem co dalej. ustawiłem chmody zamowienia.txt na 777 i przetworzzamowienie.php na 755
Cysiaczek
A prawa do katalogu zamowienia? To właśnie prawa dostępu do tego katalogu musisz ustawić.
zenoon
w jaki sposób?
Cysiaczek
Nie rozbrajaj mnie tongue.gif Ta samo jak ustawiłeś do plików. Zresztą tutaj napisałem przed chwilą.
zenoon
sorry w takim razie ze cie rozbroilem ale jak napisalem USTAWILEM CHMOD NA 777 I TO NIC NIE DALO!
Cysiaczek
  1. <?php
  2. $DOCUMENT_ROOT = $_POST['DOCUMENT_ROOT'];
  3. ?>


Nie masz w swoim pliku zawierającym formularz pola, które nazywa się DOCUMENT_ROOT
Jako, że istenieje tablica zmiennych serwera, to spóbuj:
  1. <?php
  2. $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
  3. ?>


Jednak używasz w ścieżce ../, co oznacza cofanie się w górę, Nie bardzo możesz przez to otrzymać poprawny katalog - takiego po prostu nie ma. Sprawdziłem - u mnie pokazuje coś takiego

/usr/local/apache2/htdocs/../zamowienia/zamowienia.txt

Czy to wygląda na poprawną ścieżkę? Raczej nie.

Dlatego mówię - odnieś się do katalogu <zamowienia> w taki sposób
  1. <?php
  2. $wp = fopen("zamowienia/zamowienia.txt", 'ab');
  3. ?>


Powyższy zapis mówi o tym, ze chcsz zapisac plik <zamowiania.txt> w katalogu <zamowienia> znajdującym sie w jakimś innym katalogu (np w twoim katalogu głównym). Teraz ustaw chmod na 777 dla katalogu, a nie dla pliku zamowienia. Napisałeś, że ustawiłeś dla plikuów zamowienia,txt i dla przetworzzamowienie.php. To za mało.
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.