Błędy PHP w kodzie z książki

Odpowiedz Nowy wątek
2011-10-26 16:08
0

Witam, dopiero zaczynam nauk z php. Robie to przy pomocy pewnej ksiazki. Oto pliki doslownie przepisane z ksiazki.
Tu plik z formularzem:

<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> 

a tu kod php, gdzie wystepuja bledy:

<?php
$iloscopon = $_POST['iloscopon'];
$iloscoleju = $_POST['iloscoleju'];
$iloscswiec = $_POST['iloscswiec'];
$adres = $_POST['adres'];
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$data=date('H:i. jS F Y');
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
      <title>Wynik zamowienia</title>
</head>
<body>

<h1>Czesci  samochodowe</h1> 
<h2>  Wyniki zamowienia</h2>

<?php 
echo "<p> Zamowienie przyjete o ".$data."</p>";
echo "<p> Zamowienie Panstwa wyglada nastepujaco: </p>";

$ilosc = 0;
$ilosc = $iloscopon+$iloscoleju+$iloscswiec;
echo "Zamowionych czesci: ".$ilosc."<br/>";

if($ilosc ==0)
echo "Nie zlozono zamowienia <br/>";

else
{
  if($iloscopon>0)
  {echo $iloscopon."opon<br />";}
  if($iloscoleju>0)
  {echo $iloscoleju."oleju <br />";}
  if($iloscswiec>0)
  {echo $iloscswiec."swiec<br />";}

}
$wartosc = 0;
define('CENAOPON'. 100);
define('CENAOLEJU'. 10);
define('CENASWIEC'. 4);

$wartosc = CENAOPON*$iloscopon + CENAOLEJU*$iloscoleju + CENASWIEC*$iloscswiec;
//$wartosc = number_format($wartosc. 2.'.''. '' ');
echo "<p> Wartosc zamowienia wynosi ".$wartosc."</p>";
echo "<p>Adres wysylki to ".$adres."</p>";
$ciagwyjsciowy = $data."\t".$iloscopon." opon \t".$iloscoleju." butelek oleju\t".
$iloscswiec. " swiec\t".$wartosc."PLN\t".$adres."\n";

//otwarcie pliku
@ $wp = fopen("$DOCUMENT_ROOT/zamowienia.txt".'ab');
flock($wp. LOCK_EX);

if(!$wp)
{echo "<p><strong> BLAD ZAMOWIENIA</strong></p></body></html>";
exit;}

fwrite($wp. $ciagwyjsciowy. strlen($ciagwyjsciowy));
flock($wp. LOCK_UN);
fclose($wp);

echo "<p> Zamowienie zapisane.</p>";
?>

</body>
</html> 

Mam błędy takiej tresci:
Warning: define() expects at least 2 parameters, 1 given in C:\xampp\htdocs\przetworzzamowienie.php on line 43

Warning: define() expects at least 2 parameters, 1 given in C:\xampp\htdocs\przetworzzamowienie.php on line 44

Warning: define() expects at least 2 parameters, 1 given in C:\xampp\htdocs\przetworzzamowienie.php on line 45

Notice: Use of undefined constant CENAOPON - assumed 'CENAOPON' in C:\xampp\htdocs\przetworzzamowienie.php on line 47

Notice: Use of undefined constant CENAOLEJU - assumed 'CENAOLEJU' in C:\xampp\htdocs\przetworzzamowienie.php on line 47

Notice: Use of undefined constant CENASWIEC - assumed 'CENASWIEC' in C:\xampp\htdocs\przetworzzamowienie.php on line 47

ORAZ BLAD:
Warning: flock() expects at least 2 parameters, 1 given in C:\xampp\htdocs\przetworzzamowienie.php on line 56

Rozumiem,ze chodzi o to,ze brakuje jakiegos jednego parametru.. Czy ta ksiazka wydana w 2009r jest juz nieaktualna i nie wszytskie przyklady beda dzialac?
I ostatnie pytanie - korzystam z xamppa. Wszystkie pliki trzymam w folderze htdocs, łacznie z plikiem zamowienia txt - czy sposob na jego otwarcie zawarty w kodzie jest prawidlowy?

edytowany 2x, ostatnio: Demonical Monk, 2011-10-26 17:13

Pozostało 580 znaków

2011-10-26 16:30
1
define('CENAOPON'. 100);
fopen("$DOCUMENT_ROOT/zamowienia.txt".'ab');
flock($wp. LOCK_EX);
fwrite($wp. $ciagwyjsciowy. strlen($ciagwyjsciowy));
flock($wp. LOCK_UN);

Kropka w PHP łączy ciągi znaków.
Parametry przekazywane funkcji rozdziela się przecinkiem.

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

To już w ogóle...
Znak @ podaje się przez nazwą funkcji; np.$cośtam = @funkcja()

exit;

Takie coś nie istnieje.
Jeżeli wywołujesz funkcję bez parametrów, to nawiasy i tak muszą być.

I jeszcze cd.początku skryptu, to można by sprawdzić, czy zmienne zostały zainicjowane (inaczej, czy formularz został rzeczywiście przesłany, czy plik został po prostu uruchomiony z przeglądarki bez podawania parametrów).

if ((!isset($_POST['iloscopon'])) && (!isset($_POST['iloscoleju'])) && (!isset($_POST['iloscswiec'])) && (!isset($_POST['adres'])))
 die("Formularz nie został przesłany.");

Poza tym, w samym HTML'u są błędy...


edytowany 1x, ostatnio: Patryk27, 2011-10-26 16:31
Błąd z przecinkami spowodowała słaba jakość PDF-a ;/ ale dzięki ;) co do fopen to chodziło mi o to czy dobrze podaje adres pliku do otwarcia? plik znajduje sie w tym samym folderze? I gdzie w HTMLu sa błędy? - SzeWa 2011-10-26 17:23

Pozostało 580 znaków

2011-10-26 17:13
1
Patryk27 napisał(a)
@ $wp = fopen("$DOCUMENT_ROOT/zamowienia.txt".'ab');

To już w ogóle...
Znak @ podaje się przez nazwą funkcji; np.$cośtam = @funkcja()

Eetam, parser jak parser, łyknie @ praktycznie wszędzie. Tylko po co wyciszać funkcję jak można sprawdzić czy plik istnieje przed jego otwarciem? http://php.net/file_exists

Patryk27 napisał(a)

I jeszcze cd.początku skryptu, to można by sprawdzić, czy zmienne zostały zainicjowane (inaczej, czy formularz został rzeczywiście przesłany, czy plik został po prostu uruchomiony z przeglądarki bez podawania parametrów).

if ((!isset($_POST['iloscopon'])) && (!isset($_POST['iloscoleju'])) && (!isset($_POST['iloscswiec'])) && (!isset($_POST['adres'])))
die("Formularz nie został przesłany.");

Poza tym, w samym HTML'u są błędy...

Nawet nie można tylko trzeba, inaczej poleci błąd PHP. Najniższej kategorii (notice) ale poleci... W takim wypadku wypadałoby nawet użyć tablic. Tablica w formularzu to taki niegroźny twór:

<input type="text" name="ilosc[opony]" value="">
<input type="text" name="ilosc[olej]" value="">
<input type="text" name="ilosc[swiece]" value="">

Potem w PHP możemy to odczytać jako normalną tablicę:

$_POST['ilosc']['opony']
$_POST['ilosc']['olej']
$_POST['ilosc']['swiece']

Rozwiązanie fajniejsze bo można mielić wszelakimi pętlami.

Można wiedzieć co to za książka? Będzie wiadomo czego kategorycznie należy unikać...


Women were the reason I became a monk - and, ah, the reason I switched back...
edytowany 1x, ostatnio: Demonical Monk, 2011-10-26 17:14
Pokaż pozostałe 2 komentarze
Także tytuł tematu wydaje mi się troche przesadzony ;-) Chyba,ze faktycznie są te błedy HTML (ktorych ja nie widze;p). I czekam na odp odnośnie @ $wp = fopen("$DOCUMENT_ROOT/zamowienia.txt".'ab'); ;-) Czy w ten sposob uda sie otworzyc plik z tego samego folderu? - SzeWa 2011-10-26 17:45
Dać się da, nawet nie wiem po co $DOCUMENT_ROOT. Podajesz po prostu "zamowienia.txt" lub "./zamowienia.txt". Nie olewaj błędów przy otwieraniu pliku bo potem wszystko się posypie. - Demonical Monk 2011-10-26 17:47
Nie mój kod, a kod z książki ;-) No to jest początek książki,więc może stąd aż taka 'prostota' kodu? Czy polecasz zmienić podręcznik ? - SzeWa 2011-10-26 17:48
Jeśli w oryginale tak wygląda ten fragment operacji na pliku to jest co najmniej kretyński. Po pierwsze ten $DOCUMENT_ROOT bez sensu, po drugie wyciszanie błędów z funkcji otwierającej plik bez żadnych testów tylko po to żeby później dostać kilka następnych. Jak się uczyć to porządnie... - Demonical Monk 2011-10-26 17:53
Tak właśnie to wygląda.. Jakieś propozycje? z czego dobrego i aktualnego mozna sie uczyć? - SzeWa 2011-10-26 17:59

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0