Autor Zpráva
diesel_girl
Profil
Zdravím..
Začínám.. teda se snažím začít s něčím víc než HTML a CSS. Koupil jsem si knihu "Programování WWW stránek pro úplné začátečníky" od CPress a ve třetí kapitole jsem narazil na problém. Mám stažené originální soubory ke knize a kontaktní formulář v něm nefunguje. Je to soubor z třetí kapitoly, http://knihy.cpress.cz/programovani-www-stranek-pro-uplne-zacatecniky-d3.html.

Vypíše chyby:
Notice: Undefined index: jmeno in F:\Programs\xampp-portable\htdocs\03\kontakt.php on line 2
Notice: Undefined index: telefon in F:\Programs\xampp-portable\htdocs\03\kontakt.php on line 3
Notice: Undefined index: email in F:\Programs\xampp-portable\htdocs\03\kontakt.php on line 4
Notice: Undefined index: predmet in F:\Programs\xampp-portable\htdocs\03\kontakt.php on line 5
Notice: Undefined index: zprava in F:\Programs\xampp-portable\htdocs\03\kontakt.php on line 6
Notice: Undefined index: poslat in F:\Programs\xampp-portable\htdocs\03\kontakt.php on line 8
Notice: Undefined variable: okHlaska in F:\Programs\xampp-portable\htdocs\03\kontakt.php on line 83
Notice: Undefined index: kopie in F:\Programs\xampp-portable\htdocs\03\kontakt.php on line 96

Navíc to vůbec nevypadá jako v knize. Předpokládám, že chyba je někde v mém nastavení.. ale kde?


Zdrojový kód souboru:
<?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'])));

if($_POST['poslat']=="ano") {
        $chyby=array();
        if(empty($jmeno)) { $chyby[]='Vyplňte své jméno.'; };  // $jmeno je prázdné
        if(is_numeric($jmeno)) { $chyby[]='Jméno nemůže mít číselnou hodnotu.'; };  // jméno nemůže být číslo
        if(strlen($jmeno)<=2) { $chyby[]='Uvedené jméno je moc krátke.'; };  // minimální délka jména je tři znaky
        
        if(empty($telefon) && empty($email)){  // pokud jsou oba údaje nevyplněny
           $chyby[]='Uveďte kontaktní telefon nebo emailovou adresu.'; 
        };
        if(!empty($telefon)) {  // pokud je $telefon vyplněn
           $telefon=str_replace('+', '', $telefon);   // zmažeme nečíselné znaky 
           $telefon=str_replace('-', '', $telefon);
           $telefon=str_replace('/', '', $telefon);
           $telefon=str_replace(' ', '', $telefon);   // zmažeme i mezery
           if(!is_numeric($telefon)) {  // pokud to není číslo, obsahuje nepovolené znaky
              $chyby[]='Telefonní kontakt obsahuje nepovolené znaky.';
           }
           if(strlen($telefon)<9 || strlen($telefon)>15) {
              // délku si můžete zvolit sami podle vašeho uvážení
              $chyby[]='Telefonní kontakt má nesprávnou délku.';
           }
        }
        if(!empty($email)){  // pokud je vyplněný $email
           if(!preg_match('/^[^@]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}+$/', $email)){
              // emailová adresa nemá správní tvar
              $chyby[]='Uvedená emailová adresa nemá správní tvar.';
           }
        }
        
        if(empty($predmet)){ $chyby[]='Uveďte předmět vaši zprávy.'; };
        if(strlen($predmet)<5){ $chyby[]='Předmět zprávy je příliš krátký.'; };
        if(empty($zprava)){ $chyby[]='Napište vaši zprávu.'; };
        if(strlen($zprava)<20){ $chyby[]='Zpráva je příliš krátká. Zkuste ji popsat podrobněji.'; };
        
        
        $chyba=join('<br />', $chyby);
        if(!empty($chyba)){
            echo '<div class=“chybovaHlaska“>'.$chyba.'</div>';
        };
        if(empty($chyba)){    // všechna jsou v pořádku
           $textZpravy='Odesílatel: <strong>'.$jmeno.'</strong><br /><br />
           [ '.$email.' '.$telefon.' ]<br /><br />
           '.$zprava;
        
               require "class.phpmailer.php";
               require "class.smtp.php";
        
            $Mail = new PHPMailer();
            $Mail->CharSet = 'UTF-8';
            $Mail->IsSMTP();
               $Mail->Host = "smtp.googlemail.com";
               $Mail->Username="prihlasovaci.jmeno.k.emailu";
               $Mail->Password="heslo";
               $Mail->SMTPAuth=true;
               $Mail->From = "prihlasovaci.jmeno.k.emailu@gmail.com";
            $Mail->FromName = $jmeno;
               $Mail->AddAddress("prihlasovaci.jmeno.k.emailu@gmail.com");
            if($_POST['kopie']=="on") {
              $Mail->AddBCC($email);
            }
            $Mail->IsHTML(true);
            $Mail->Subject  = $predmet;
            $Mail->Body = $textZpravy;
            $cistyText=strip_tags($textZpravy);
               $Mail->AltBody=$cistyText;

          if($Mail->Send()) {
               $okHlaska="Zpráva byla úspěšne odesláná.";
          } else {
              echo "Zprávu se nepodařilo odeslat. Zkuste to znovu.";
          }
     }
}


if($okHlaska==""){
        echo '<form action="" method="post">
          <label for="jmeno">Vaše jméno:</label>
             <input type="text" name="jmeno" id="jmeno" value="'.$jmeno.'" /><br />
          <label for="telefon">Telefon:</label>
             <input type="text" name="telefon" id="telefon" value="'.$telefon.'" /><br />
          <label for="email">Email:</label>
             <input type="text" name="email" id="email" value="'.$email.'" /><br />
          <label for="predmet">Předmět:</label>
             <input type="text" name="predmet" id="predmet" value="'.$predmet.'" /><br />
          <label for="zprava">Zpráva / dotaz:</label>
             <textarea name="zprava" id="zprava" rows="3">'.$zprava.'</textarea><br />
          <input type="checkbox" name="kopie" id="kopie"';
        if($_POST['kopie']=="on"){ echo ' checked="checked"'; }; 
        echo '/><label for="kopie">zaslat kopii zprávy na můj 
             email</label><br />
          <input type="submit" value="Odeslat dotaz" />
          <input type="hidden" name="poslat" value="ano" />
        </form>'; 
   } else {
       echo $okHlaska;
   }
?>


<?php /*

Tento soubor je součástí ukázkových kódů ke knize Programování WWW stránek pro úplné začátečníky. 
Více informaci o knize naleznete na adrese http://knihy.cpress.cz/k1868. 

ˆ 2011 Všechna práva vyhrazena.

*/ ?>

Díky za vše :)
Prochy
Profil
Problém je v tom, že hned na začátku kódu předáváš proměnný, který ani nemusí existovat. Myslim si, že tuto část by si měl mít, až v podmínce, čím si budeš jístý, že daný proměnný existují.

Tohle hoď hned za if:
$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'])));

Další věc, že v podmínce if($_POST['poslat']), opět nění jistota, že proměnná existuje, je to možné ověřit podmínkou if(isset($_POST['poslat']) && $_POST['poslat']=='Ano'), kde se vlastně první ověří, jestli proměnná existuje, když jo, tak to ještě porovná. Víc sem to zatím nezkoumal. Jsou to jenom varování, nejsou to errory, ale i tak by si měl mít kód bez varování.
panther
Profil
Prochy:
if(isset($_POST['poslat']) && $_POST['poslat']=='Ano')
ta druhá podmínka už je zbytečná.
peta
Profil
Vsude, kde se vyskytuje $_POST a tech 5 radku nahore to nahrad funkci. Chybi ti tam isset.
function getRequest($key,$default='')
{return (isset($_POST[$key])  ? trim(htmlspecialchars(strip_tags($_POST[$key])) : $default;}
Prochy: a jeste $_POST['kopie']=="on"
Rellik
Profil
Musíš zohlednit to, že kniha už má nějaký ten pátek, a nemění se. PHP se naopak mění a tak funkce které normálně ve starších verzích PHP fungovaly v nových nemusí, nebo je budeš muset upravit tak jako toto.
Prochy
Profil
Rellik:
Přijde ti, že se PHP od datumu 05.10.2011 nějak zásadně změnilo? Osobně bych se asi z této knížky neučil, když tam mají kód, který hazí Notice.
Rellik
Profil
Jo od té doby se PHP změnilo, možná ne zásadně, ale změnilo. Navíc musíš brát v úvahu to, že knížku nenapíše nikdo za měsíc. Ale trvá to třeba i přes rok a to musíš taky připočítat. Navíc se omezují některé nastavení servrů, které pak dělá tyto "notice"... Taky sem na jednom webu měl nějaké funkce, které fungovaly a po nějaké době co sem se na stránky díval už nefungovaly a nebo to házelo chyby. Přitom se s kódy nic nedělalo...
diesel_girl
Profil
Prochy: Obojí jsem udělal, errory vypisuje dál..
Peta: Co přesně a kam? Omlouvám se ale jsem fakt začátečník takže absolutně netuším co s tím..

Napadlo mně, nezkoušeli jste to stáhnout a zkusit u vás..? Možná by stálo za to napsat přímo do vydavatelství..

Každopádně děkuju moc.
panther
Profil
diesel_girl:
středníky za apostrofy taky byly v té knize? Ty se tam také nepíší.

Možná by stálo za to napsat přímo do vydavatelství..
nejsem si jist, jestli tím něco zmůžeš. Knihu přepisovat a přetiskávat pravděpodobně nebudou.

Omlouvám se ale jsem fakt začátečník takže absolutně netuším co s tím
... a kopírováním ucelených kusů kódu se ani nic nenaučíš. Máš knihu, i když, stojí za pendrek, co jí takhle procházet od základů a snažit se pochopit základy jazyka? Práci s proměnnými se stejně nevyhneš, ať budeš dělat cokoliv.
diesel_girl
Profil
panther: Všechno tam takhle je..

Asi ji nepřepíšou, ale na webu zveřejňují errata a tohle by možná stálo za zmínku..

Já vím, procházím tu knížku od začátku, základy chápu ale u toho jsem se zasekl. Chtěl jsem si to vyzkoušet, a zjistil jsem že to nejde takže nemůžu ani zkusit udělat něco vlastního na tenhle způsob..
Rellik
Profil
Z toho prvního kódu co jsi poslal by mělo v podstatě stačit přesunout první řádky 2-6 za podmínku na řádku 8.
peta
Profil
diesel_girl:
Funkci definujes hned na zacatku.
function getRequest($key,$default='')
{return (isset($_POST[$key])  ? trim(htmlspecialchars(strip_tags($_POST[$key])) : $default;}
nebo
function getRequest($key,$default='') // proste se tam jedna hlavne o to isset
{return isset($_POST[$key] ? $_POST[$key] : $default;}

Pak vsude, kde se vyskytuje $_POST['promenna'] to prepises na getRequest('promenna'). Kde? Radek 2, 3, 4, 5, 6, 8, 96.

Na roku vydani kopie knizky nezalezi, najdi si rok originalu nebo to reklamuj autorovi. Php jde nastavit tak, aby ti tyto chyby nehlasilo, takze formalne je ten zapis v poradku. Nastesti vetsinou php tak nastavene neni z bezpecnostnich a provoznich duvodu.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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