Autor Zpráva
Dekker
Profil
Dobrý den
Pořídil jsem si knížku Programování WWW stránek pro úplne začátečníky a ve třetí kapitole se pracuje s kontaktním formulářem, ale to co zpouštím se nechová tak jak by mělo dle knížky i když jsem do scriptu nijak nezasahoval a nevím jak se toho zbavit. Vím proč se to ukazuje, ale mé dosavadní pokusy o odstranení chybové hlášky nepomáhají tak jak bych chtěl. Tady je výpis těch hlášek

Notice: Undefined index: jmeno in D:\xampp\htdocs\kniha\03\kontakt.php on line 2
Notice: Undefined index: telefon in D:\xampp\htdocs\kniha\03\kontakt.php on line 3
Notice: Undefined index: email in D:\xampp\htdocs\kniha\03\kontakt.php on line 4
Notice: Undefined index: predmet in D:\xampp\htdocs\kniha\03\kontakt.php on line 5
Notice: Undefined index: zprava in D:\xampp\htdocs\kniha\03\kontakt.php on line 6
Notice: Undefined index: poslat in D:\xampp\htdocs\kniha\03\kontakt.php on line 9
Notice: Undefined index: kopie in D:\xampp\htdocs\kniha\03\kontakt.php on line 94
/>
té poslední se dokážu zbavit, ale nechávám ji tu protože když zkouším sestavit potvrzení o tom zda souhlasí či ne tak mi tam stejně vyskočí pokud nezaškrtne správné políčko.

Tady je odkaz kde se dá stáhnout původní script knihy.cpress.cz/?p=actions&action=download/file&value=files&id=110358 je to ve složce kniha/03 kontakt.php

Děkuji za rady, moc se mi nechce pokračovat v učení z této knížky když originál nepracuje jak by dle obrázků měl.
Lonanek
Profil
Pole uvedených indexů (jmeno, telefon, email, ...) nejsou definována.
Řádky uvádějí kde chyba nastala.

Špatně napsaný script.

Osobně bych nedostatečně ošetřený kód:
<?php
$jmeno=trim(htmlspecialchars(strip_tags($_POST['jmeno'])));
$telefon=trim(htmlspecialchars(strip_tags($_POST['telefon'])));
$email=trim(htmlspecialchars(strip_tags($_POST['email'])));
$predmet=trim(htmlspecialchars(strip_tags($_POST['predmet'])));
$zprava=trim(htmlspecialchars(strip_tags($_POST['zprava'])));
nahradil:
<?php
$jmeno = $telefon = $email = $predmet = zprava = "";
if (isset($_POST['jmeno'])) $jmeno=trim(htmlspecialchars(strip_tags($_POST['jmeno'])));
if (isset($_POST['telefon'])) $telefon=trim(htmlspecialchars(strip_tags($_POST['telefon'])));
if (isset($_POST['email'])) $email=trim(htmlspecialchars(strip_tags($_POST['email'])));
if (isset($_POST['predmet'])) $predmet=trim(htmlspecialchars(strip_tags($_POST['predmet'])));
if (isset($_POST['zprava'])) $zprava=trim(htmlspecialchars(strip_tags($_POST['zprava'])));

a ř. 94 (podle výpisu chyby), v originálu je to jiný řádek (96)
        if($_POST['kopie']=="on"){ echo ' checked="checked"'; }; 
nahradit:
        if(isset($_POST['kopie']) AND $_POST['kopie']=="on"){ echo ' checked="checked"'; }; 
Také bude pravděpodobně nutno obdobně opravit i řádek 65 originálu.
Dekker
Profil
a co ten prvotní error Notice: Undefined index: poslat in D:\xampp\htdocs\kniha\03\kontakt.php on line 9. Jsem si ho všiml až teď když ty ostatní zmizeli. Obdobně jako ten s tím checkboxem?

PS: Jop už to jede jak má :). Díky za radu. snad už nebude žádná třeba a zvládnu to nadále sám :D
Lonanek
Profil
Přehlédl jsem jej.
Samozřejmě upravit obdobně jako popisuji opravu ř. 96.

Rozumíte tomu co oprava dělá?
Dekker
Profil
Pokud to chápu dobře tak příkaz isset mi umožňuje definovat proměnou bez zásahu do její hodnoty a tudíž ji může následně POST volat jako by nějakou hodnotu měla.
Lonanek
Profil
Ne, ISSET určuje, zda je proměnná definována (is set => je nastavena?).
Pokud tedy nejsou definovány uvedené proměnné (není odeslán formulář) jsou ponechány prázdné hodnoty, které jsem definoval v prvním kroku (ř.2 uvedené úpravy).
juriad
Profil
Jen co se podívám na zdroják, tak se mi chce brečet. Ta kniha není vůbec dobře napsaná z pohledu technického (prohlédl jsem si i ukázkovou kapitolu). Je zastaralá a učí nebezpečné postupy. Například ten průjem:
$jmeno=trim(htmlspecialchars(strip_tags($_POST['jmeno'])));
je jedním z nich. Takto se to nikdy nedělá. A ani zjednodušení v případě ukázky v knize to nedokáže omluvit.

Základy PHP se naučíš nejlépe na Péhápko: Učebnice PHP. Předpokládám tedy, že HTML už ovládáš. Další český zdroj může být www.itnetwork.cz/php. Žádný zdroj není ideální, ale skoro vždy nové články na internetu jsou lepší než kniha. Pokud alespoň trochu umíš anglicky, nauč se používat oficiální dokumentaci na php.net.
Dekker
Profil
Jo takže ji mohu použít tam kde očekávám nějaké příchozí hodnoty, ale při prvním zpuštění žádné nejsou. Bez toho isset by mi prvotní definování nepomohlo což jsem zkoušel.

Jsem právě úplný nováček a todle vypadalo jako přijatelná volba. Anglicky umím celkem obstojně (číst), tudíž nebude problém, přítelkyně kdyžtak přeloží. Učím se tak nějak za pochodu co je nutné. Koukal jsem se i na ten odkaz jak psát web. Bylo by lepší tedy začít tam a nebo postupovat jiným směrem? Nějaké povědomí o programování obecně mám, jen učitel byl levej a odmítal ustoupit jinejm kteří to uměli a tak nás z C# nic nenaučil.
Lonanek
Profil
Musím jen souhlasit s juriad. Je to hooodně nepovedená kniha.

Reaguji na Dekker:
Je to o logice. Zpravidla postačuje zjistit, zda bylo stisknuto tlačítko formuláře.
if (isset($_POST['submit']))
a podle toho zpracovat další postup ANO - NE.

Pokud by jste byl dogmatik, pak otestujete všechny "volitelně definované" (ty, které nejsou v kódu definované) proměnné. Záleží na blbuvzdornosti aplikace.
Já preferuji ošetření kódu proti blbuvzdornosti, tedy předem eliminovat jakékoliv neočekávané akce uživatele a ty se snažit ošetřit.
Dekker
Profil
takže třeba v případě políčka pro souhlasení s podmínkami by to bylo takto?

<input type="checkbox" name="souhlasim" id="souhlasim" />
<label for="souhlasim">Souhlasím</label> <br />

if(isset ($_POST['souhlasim']) AND $_POST['souhlasim']!="on") {
$chyby[]='musíte souhlasit';
};



S logickým myšlením bych neměl mít problém, horší bude poprat se se syntaxí.
Lonanek
Profil
Ano, takto to lze ošetřit.
juriad
Profil
Chybně!
# od uživatele nepřišlo pole souhlasím nebo obsahuje něco jiného než "on":
if (!isset($_POST['souhlasim']) || $_POST['souhlasim'] != "on") {
  $chyby[] = 'musíte souhlasit';
} // bez středníku
Dekker
Profil
díky. Než nějak pokročím asi bude nejlepší si pročíst nějaké základy html. Snad sem nebudu chodit moc často pro rady.

Všem děkuji za ochotu
Martin2
Profil *
Knížka to bude asi kvalitní. V ukázkových PHP skriptech jsem nenašel jediný, který by neobsahoval hrubé koncepční nebo bezpečnostní chyby. Být tebou, tak ji hodím do popelnice. A hodně hluboko, aby ji náhodou někdo ještě nevytáhl.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: