Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Baza danych DOCUMENT_ROOT problem
Forum PHP.pl > Forum > PHP
bigos1995-95
Witam, mam problem z funkcja DOCUMENT_ROOT. Mam ksiażę Vademecum wydanie 4 z dołączoną płytką. Mam problem z kodem który nie może być zle napisany(z mojego blędu) poniewaz jest skopiowany z plytki ale nie dziala. Nie zapisuje zamowienia w pliku txt. Moglby ktos mi powiedziec dlaczego questionmark.gif

KODY

formularz.html

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>



przetworzzamowienie.php

Kod
<?php
  // utworzenie krótkich nazw zmiennych
  $iloscopon = $_POST['iloscopon'];
  $iloscoleju = $_POST['iloscoleju'];
  $iloscswiec = $_POST['iloscswiec'];
  $adres = $_POST['adres'];
  $adres = $_POST['adres'];
  $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
  $data=date('H:i, jS F Y');
?>

<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

  echo "<p>Zamówienie przyjęte o ".$data."</p>";

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

  $ilosc = 0;
  $ilosc = $iloscopon + $iloscoleju + $iloscswiec;
  echo "Zamówionych części: ".$ilosc."<br />";

  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');

  flock($wp, LOCK_EX);

  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));
  flock($wp, LOCK_UN);
  fclose($wp);

  echo "<p>Zamówienie zapisane.</p>";
?>
</body>
</html>
Tajgeer
Skrypt wyświetla jakieś błędy?
bigos1995-95
Warning: flock(): supplied argument is not a valid stream resource in c:\usr\krasnal\www\bigos\projektcd2\przetworzzamowienie.php on line 67

jest jakis blad albo nie wiem z @ $wp = fopen("$DOCUMENT_ROOT/../zamowienia/zamowienia.txt", 'ab'); w ksiazce jest cos napisane ze windows nie odczytuje takich ukosnikow (/) tylko takie (\) ale sprawdzalem to i dalej to samo wiec nie mam pojecia co jest.
alegorn
wyswietl sobie cala sciezke do jakiej probujesz sie odwolac, najprawdopodobniej od razu znajdziesz problem.
bigos1995-95
nie rozumiem gdzie ja mam sobie wyswietlic, moglbys jasniej ?
d3ut3r
  1. @ $wp = fopen("$DOCUMENT_ROOT/../zamowienia/zamowienia.txt", 'ab');


wywal ten znak @ , błąd jest w tej linii prawie na pewno plik który próbujesz otworzyć nie istnieje. żeby sprawdzić co chcesz otworzyć zrób sobie:

  1.  
  2. echo "$DOCUMENT_ROOT/../zamowienia/zamowienia.txt";
  3.  


to wyświetli Ci ścieżkę i sprawdź czy ten plik istnieje.
bigos1995-95
ten plik istnieje a zreszto funkcja "a" powinna sama sobie zrobić plik jesli go nie bedzie


definicja "a":

Otwarcie pliku do dodawania zawartosci, poczawszy od konca istniejacej zawartosci.Jezeli plik nie istnieje, nastapi proba jego utworzenia
d3ut3r
Tak masz rację poza jedną rzeczą, jeżeli fopen będzie się odwoływało do nieistniejącej lokalizacji (np ścieżka do folderu który nie istnieje) to plik nie zostanie utworzony. W tym samym manualu który cytujesz masz napisane:

Cytat
Returns a file pointer resource on success, or FALSE on error.


Więc po prostu usuń tą @ z przed $wp i zobaczysz co pierwsze wypluje błąd. Na logikę skoro flock krzyczy że podany argument nie jest prawidłowym zasobem, a zasób jest tworzony przez fopen to gdzie jest problem ?
bigos1995-95
ja i tak nadal nie wiem co jest , tworze folder(zamowienia) w folderze z cialem stronki i i tak nic sie nie dzieje i fakt jak usunalem @ to wyskoczyl mi blad z fopen ale co z tego jak nie wiem jak to naprawic.
d3ut3r
popróbuj z różnymi ścieżkami na przykład:

  1. $wp = fopen("zamowienia/zamowienia.txt", 'ab');
  2.  
  3. //lub
  4.  
  5. $wp = fopen("/zamowienia/zamowienia.txt", 'ab');
  6.  
  7. //...


ciężko tak na ślepo coś poradzić :/
alegorn
a jaki to blad..? byc moze nam wiecej powie niz tobie.

oczywiscie masz uprawnienia do CRUD'a?

j.
bigos1995-95
d3ut3r, a nie mógłbyś sprawdzić tego po prostu na swoim komputerze i powiedziec mi wtedy w czym jest problem ? Bo ja jestem początkujący z php jestem na 3 rozdziale książki Vademecum wydanie 4 i tutaj często powtarza mi się ta zmienna $DOCUMENT_ROOT a ja nadal nie wiem jak zrobic tak aby bylo dobrze
viking
Najlepiej wywal tę książkę do kosza i weź coś na czasie. Ukrywanie błędów przez @ to prosta droga do porażki. Po co tam jest przepisywanie POST?
Zainteresuj się czymś takim realpath(dirname(__FILE__)). Takich podstaw możesz się z materiałów w sieci nauczyć 100x lepiej. Książkę od Javy sobie lepiej kup gdzie będą wzorce i dobre praktyki opisane a nie źle wklepany banalny kod.
bigos1995-95
sorry ale nie potrzebuje porad co do książek , taka książkę sobie wybrałem i z takiej będę korzystał i nie mów że jest zła bo wszystko jest bardzo dokładnie opisane poza tym jednym i opinie o tej książce są wszystkie pozytywne. a poza tym po jakiego grzyba piszesz jakieś glupie posty skoro nawet nie umiesz mi pomoc ?
viking
Sorry mistrzu. Problem w tym że ci pomogłem i napisałem jak możesz spróbować zdobyć ścieżkę. Najwyrażniej to było za trudne. Twoja cudowna książka niestety nie obejmuje jednej prostej funkcji file_put_contents
bigos1995-95
najwyraźniej tak albo źle mi wytlumaczyles smile.gif a co do ksiazki moze funckja file_put_contents jest w dalszej czesci ksiazki nie wiem jestem poczatkujacy w php. I tak miedzy nami, napisalem na tym forum zeby sie czegos dowiedziec a nie kłocic sie z użytkownikami wiec dalsze sprzeczanie sie nie ma sensu
BaN
Co do wyrzucania książek, to jednak nie popieram, mimo że zgadzam się, że może być nieaktualna, ale może zawiera jakieś ciekawe informacje?

@bigos1995-95 jak już sie pewnie zorientowałeś jest zła ścieżka do pliku 'zamowienia.txt'. Jeśli chcesz wykorzystywać fopen, flock, fwrite i fclose zamiast file_put_contents i zrobić przykłady z książki, to w katalogu gdzie masz pliki 'formularz.htm' i 'przetworzzamowienie.php' załóż folder 'zamowienia' o ile jeszcze nie masz, następnie zamiast:
  1. $wp = fopen("$DOCUMENT_ROOT/../zamowienia/zamowienia.txt", 'ab');

wpisz tak jak chciał @viking
  1. $wp = fopen(realpath(__FILE__) . "/zamowienia/zamowienia.txt", 'ab');

albo
  1. $wp = fopen(dirname(__FILE__) . "/zamowienia/zamowienia.txt", 'ab');

albo jeśli masz PHP w wersji co najmniej 5.3, to
  1. $wp = fopen(__DIR__ . "/zamowienia/zamowienia.txt", 'ab');


Stałe __DIR__ i __FILE__ są opisane na stronie Magiczne stałe
viking
Ja też nie mam zamiaru się kłócić tylko nie widzę sensu czytania książki która od samego początku przedstawia złe nawyki, wygląda jak napisana dla PHP 4 (mocno nieaktualna) i pewnie nie wspomina o bezpieczeństwie. Bo więcej dowiesz się z lektury manuala PHP. Dobra książka nie opisuje (i to w dodatku źle) jak krok po kroku coś napisać tylko uczy myślenia. Prawda jest taka że większość książek dla PHP to przedruki dokumentacji które zupełnie nic nie wnoszą. Dlatego poleciłem Ci coś do Javy bo uwierz mi że nauczysz się 100x więcej a mimo wszystko oba języki są dość podobne i płynnie można między nimi przechodzić (czy też płynnie przejść do PHP jeśli poznasz Javę).
Przykładowo. Przepisywanie zmiennych dla samego podstawienia (kilka pierwszych linijek) nie ma zupełnie sensu bo tylko zapychasz pamięć. Gdyby chociaż tam było filtrowanie albo walidacja jeszcze można by zrozumieć. Tworzona jest data bez sprawdzania ustawień strefy czasowej serwera. Co to za dokument bez deklaracji DOCTYPE? Po co:
  1. echo "<p>Zamówienie przyjęte o ".$data."</p>"

Chyba bo to jest składnia z "" żeby nie łączyć bezsensownie ciągów. A jak już to ''. Co się stanie jak wpiszesz np w inpucie $iloscopon = 'aaa'; Po co $wartosc=0.00;? Rzutowanie typów do poczytania z dokumentacji. Deklaracja stałych w takiej samej ilości jak zmiennych. Tak się nie pisze. A z tego przykładu można wnioskować że to normalka. Ukrywanie błędów - błędów się nie ukrywa tylko poprawia. No i wspomnianych kilka funkcji do zapisu zamiast jednej. Jak widzisz prawie w każdej linii jest błąd dlatego uważam że to jest książka do kosza. Jeśli uczyć to porządnie tym bardziej że świeże umysły się za to zabierają.
bigos1995-95
Dzięki za dokładne opisanie, zaraz to sprawce. A co do książki to może i masz racje, ale też nie mam porównania i jak powiedziałem wczesniej dopiero zaczynam zabawe z tym jezykiem a przed zakupem Vademecum oczywiście przeczytałem troche postow i pisali ze ksiazka jest bardzo dobra wiec ja kupilem za 100 zl to raczej jej nie wyrzuce do kosza bo za przeproszeniem "pieniedzmi nie sram"

Dobra, dzieki BaN wszystko działa
a co do tego DOCUMENT_ROOT to jest jakas przestarzała funkcja czy co jest z nia nie tak ze nie dziala questionmark.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.