NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: úprava kontaktního formuláře

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
tbartolen
Člen
Avatar
tbartolen:31.7.2015 12:08

Ahoj, upravil jsem si kontaktní formulář, aby lidi museli vyplňovat i číslo, ale jelikož jsem lamér, potřeboval bych to zhodnotit, a nastal jeden problém. Když teď kliknu na odeslat zprávu, tak mi vyskočí error 404...nemuže to být tim, že jsem trošku laboroval s projektem v netbeans a překopíroval všechny soubory do nového projektu? Jak to případně opravit? NEbo mám chybu v kodu? Děkuju za rady

<?php
    mb_internal_encoding("UTF-8");

    $hlaska = '';
    if (isset($_GET['uspech']))
        $hlaska = 'Email byl úspěšně odeslán, brzy vám odpovíme.';
    if ($_POST) // V poli _POST něco je, odeslal se formulář
    {
        if (isset($_POST['jmeno']) && $_POST['jmeno'] &&//Podmínka řiká že musí být vyplněný formulář
            isset($_POST['email']) && $_POST['email'] &&
            isset($_POST['zprava']) && $_POST['zprava'] &&
            isset($_POST['cislo']) && $_POST['cislo'] &&
            isset($_POST['rok']) && $_POST['rok'] == date('Y'))
        {
            $hlavicka = 'From:' . $_POST['email']; //Nastavení že se odesílá email
            $hlavicka .= "\nMIME-Version: 1.0\n"; //Nemám se vzrušovat
            $hlavicka .= "Content-Type: text/html; charset=\"utf-8\"\n";//Kodování asi
            $adresa = '[email protected]';//Email kam se odesilá
            $predmet = 'Nová zpráva z mailformu';//Předmět odeslaného emailu abych v tom neměl bordel
            $uspech = mb_send_mail($adresa, $predmet, $_POST['zprava'], $hlavicka); //Funkce odeslani emailu
            if ($uspech)//Podmínka která hlásí uživateli jestli ano nebo ne
            {
                $hlaska = 'Email byl úspěšně odeslán, brzy vám odpovíme.';
                header('Location: mailform.php?uspech=ano');
                exit;
            }
            else
                $hlaska = 'Email se nepodařilo odeslat. Zkontrolujte adresu.';
        }
        else
            $hlaska = 'Formulář není správně vyplněný!';
    }

?>

A tady HTML část

<?php
           if ($hlaska)  //funkce vypsani hlasky
               echo('<p>' . htmlspecialchars($hlaska) . '</p>');//ochrana proti XSS utoku

           $jmeno = (isset($_POST['jmeno'])) ? $_POST['jmeno'] : '';//Nutnost vyplneni formularu
           $email = (isset($_POST['email'])) ? $_POST['email'] : '';
           $zprava = (isset($_POST['zprava'])) ? $_POST['zprava'] : '';
           $cislo = (isset($_POST['cislo'])) ? $_POST['cislo'] : '';
       ?>

       <form method="POST">
           <table>
               <tr>
                   <td>Vaše jméno</td>
                   <td><input name="jmeno" type="text" value="<?= htmlspecialchars($jmeno) ?>"/></td>
               </tr>
               <tr>
                   <td>Váš email</td>
                   <td><input name="email" type="email" value="<?= htmlspecialchars($email) ?>"/></td>
               </tr>
               <tr>
                   <td>Aktuální rok</td>
                   <td><input name="rok" type="number" /></td>
               </tr>
               <tr>
                   <td>Telefonní číslo</td>
                   <td><input name="cislo" type="number" /></td>
               </tr>

           </table>
           <!--<div class="zprava">-->
           <table>
               <tr>
                   <td>Vaše Zpráva</td>
                   <td><textarea name="zprava"><?= htmlspecialchars($zprava) ?></textarea></td>
               </tr>
           </table>

           <br />

           <input type="submit" value="Odeslat" />
            </div>
       </form>
Odpovědět
31.7.2015 12:08
Navštiv www.fb.com/skkelticz
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na tbartolen
Jan Lupčík:31.7.2015 12:11

404 je chyba, že daná stránka neexistuje. Jak se tedy jmenuje tvůj soubor s kontaktem? mailform.php?

Nahoru Odpovědět
31.7.2015 12:11
TruckersMP vývojář
Avatar
tbartolen
Člen
Avatar
Odpovídá na Jan Lupčík
tbartolen:31.7.2015 12:20

Takovej soubor nemám...mám to celé nasypané v index.php se zbytkem stránky, z návodu jsem to pochopil že to tak má být? O_o

Editováno 31.7.2015 12:21
Nahoru Odpovědět
31.7.2015 12:20
Navštiv www.fb.com/skkelticz
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na tbartolen
Jan Lupčík:31.7.2015 12:24

Nemá. Tam se tvoří celá stránka jenom v mailform.php. Vytvoř si tedy soubor mailform.php a tam dej svoje PHP včetně HTML. Pak by to už mělo jít. :)

Nahoru Odpovědět
31.7.2015 12:24
TruckersMP vývojář
Avatar
tbartolen
Člen
Avatar
Odpovídá na Jan Lupčík
tbartolen:31.7.2015 12:27

aha !!! Iž jsem si toho všimnul, měl jsem tam mailform misto index.php....to je tak když si to nepřečtu po zkopírování =) nicméně už je mi to jasný proč a jak...ještě jsem se chtěl zeptat na jednu věc

$uspech = mb_send_mail($adresa, $predmet, $_POST['zprava'], $hlavicka); //Funkce odeslani emailu

Tenhle řádek mi řiká, když jsou vyplněný tyhle položky, tak se email odešle, neměl bych tam přidat ještě teda takhle?:

$uspech = mb_send_mail($adresa, $predmet, $cislo, $_POST['zprava'], $hlavicka); //Funkce odeslani emailu

A s tim, že se mi teda do emailu odešle adresa, předmět a číslo toho danýho člověka?

Nahoru Odpovědět
31.7.2015 12:27
Navštiv www.fb.com/skkelticz
Avatar
tbartolen
Člen
Avatar
Odpovídá na Jan Lupčík
tbartolen:31.7.2015 12:29

No moment, ale jak potom tu stránku zakomponuju do svý index stránky, kde to chci mít zobrazený, když ten mailform budu mít někde uplně jinde? Já jsem ted přepsal tohle:

if ($uspech)//Podmínka která hlásí uživateli jestli ano nebo ne
           {
               $hlaska = 'Email byl úspěšně odeslán, brzy vám odpovíme.';
               header('Location: index.php?uspech=ano');
               exit;
           }

A funguje to ...moc se mi nechce dělat nějaký obstrukce...ale jestli je to takhle napsaný špatně...? 8-|

Nahoru Odpovědět
31.7.2015 12:29
Navštiv www.fb.com/skkelticz
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na tbartolen
Jan Lupčík:31.7.2015 12:31

Ne. Pěkně si to probereme. :)

$adresa E-mail, kam se to má odeslat
$predmet Předmět E-mailu
$_POST['zprava'] Zpráva E-mailu
$hlavicka Nastavení E-mailu

Tam posíláš nastavené věci. Pokud tedy chceš poslat i číslo uživatele, můžeš to udělat takto:

$uspech = mb_send_mail($adresa, $predmet, "Číslo: " . $_POST['cislo'] . "<br />" . $_POST['zprava'], $hlavicka);

Spojíš tedy jenom řetězce. Ale na tu zprávu by bylo si už lepší udělat proměnnou a tam spojovat řetězce. Tu proměnnou by jsi pak poslal.

Nahoru Odpovědět
31.7.2015 12:31
TruckersMP vývojář
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na tbartolen
Jan Lupčík:31.7.2015 12:33

Pokud to máš v tom indexu, nech to tak. Nevěděl jsem, jak to tam máš udělaný. :)
Doporučoval bych ale si udělat na kontakt vlastní stránku (takže např. mailform.php). Ale to je na tobě.

Nahoru Odpovědět
31.7.2015 12:33
TruckersMP vývojář
Avatar
tbartolen
Člen
Avatar
Odpovídá na Jan Lupčík
tbartolen:31.7.2015 12:45

Aha, takže to se mi neodešle ani ten email, který mi tam ten člověk složitě vyplňuje, jestl itomu dobře rozumim, a měl bych udělat finální verzi asi takhle :

$uspech = mb_send_mail($adresa, $predmet,  $_POST['cislo'], $_POST['zprava'],  $_POST['email'] $hlavicka);

Proč si tam dával to odřádkování </br> ?

Nahoru Odpovědět
31.7.2015 12:45
Navštiv www.fb.com/skkelticz
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na tbartolen
Jan Lupčík:31.7.2015 13:16

To máš zase špatně. :D
mb_send_mail() má jenom 4 parametry. Já jsem předtím spojoval řetězce, ty předáváš parametry funkci.
Promiň, jestli je to nesrozumitelné, lépe to nedokážu popsat. Mrkni na tu tabulku, co jsem ti psal výše. Tyto parametry má funkce mb_send_mail() a ty musíš dodržet. Jenom obsah proměnných může být jiný.

Nahoru Odpovědět
31.7.2015 13:16
TruckersMP vývojář
Avatar
katrincsak
Člen
Avatar
katrincsak:31.7.2015 13:17

Není to náhodou tím, že ti chybí přesměrování formuláře? Respektive "action"?

Ty máš:

<form method="post">

Mělo by být:

<form action="ODKAZ" method="post">

Jestli se teda nepletu, tak bez toho se formulář neodešle a neví. Pakliže se jedná o ten samí soubor, měl by být action="" bez udání odkazu...

 
Nahoru Odpovědět
31.7.2015 13:17
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na katrincsak
Jan Lupčík:31.7.2015 13:19

Atribut action tam být nemusí. :)

Nahoru Odpovědět
31.7.2015 13:19
TruckersMP vývojář
Avatar
tbartolen
Člen
Avatar
Odpovídá na Jan Lupčík
tbartolen:31.7.2015 13:34

No jo, ale v tomhle návodu...
http://www.itnetwork.cz/…ovy-formular
píše, že by to mělo fungovat tak, že se odešle i ten email, i jméno ...?

Když mám celý ten blok v

<form method="POST">

Tak by se měl odeslat celý ten blok, ne?

Editováno 31.7.2015 13:36
Nahoru Odpovědět
31.7.2015 13:34
Navštiv www.fb.com/skkelticz
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na tbartolen
Jan Lupčík:31.7.2015 13:39

Odešle se jenom ta zpráva ($_POST['zprava']). E-mail se odešle, to máš nastavený v hlavičce a vidíš, od koho ti zpráva přišla. Pokud to číslo chceš odeslat, musíš ho dát do zprávy či předmětu a to spojením řetězců (viz. výše).

Nahoru Odpovědět
31.7.2015 13:39
TruckersMP vývojář
Avatar
tbartolen
Člen
Avatar
Odpovídá na Jan Lupčík
tbartolen:31.7.2015 13:44

A kdybych to teda přiupravil nějak takhle:

$hlavicka = 'From:' . $_POST['email']; //Nastavení že se odesílá email
$hlavicka = 'From:' . $_POST['cislol'];
$hlavicka .= "\nMIME-Version: 1.0\n"; //Nemám se vzrušovat
$hlavicka .= "Content-Type: text/html; charset=\"utf-8\"\n";//Kodování asi
Nahoru Odpovědět
31.7.2015 13:44
Navštiv www.fb.com/skkelticz
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na tbartolen
Jan Lupčík:31.7.2015 13:49

Pokud umíš anglicky, from je odkud. Pokud chceš to číslo, spoj řetězce!

$predmet = "E-mail odeslal uživatel s číslem " . $_POST['cislo'];
Nahoru Odpovědět
31.7.2015 13:49
TruckersMP vývojář
Avatar
Odpovídá na tbartolen
Neaktivní uživatel:31.7.2015 13:50

Ne, to nemůžeš, tam patří mail, nikoli telefonní číslo. Pokud ho tam chceš, přidej ho do zprávy, například na konec..

$uspech = mb_send_mail($adresa, $predmet,  $_POST['zprava'] . "<br>==============<br>Tel: " . $_POST['cislo'], $hlavicka);
Nahoru Odpovědět
31.7.2015 13:50
Neaktivní uživatelský účet
Avatar
tbartolen
Člen
Avatar
Odpovídá na Jan Lupčík
tbartolen:31.7.2015 13:52

Už to asi chápu, rozumim tomu jak k předmětu připnout číslo, ale nevím proč hlavička neumí brát ze dvou míst, asi si to zbytečně komplikuju vymejšlením složitostí

Nahoru Odpovědět
31.7.2015 13:52
Navštiv www.fb.com/skkelticz
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na tbartolen
Jan Lupčík:31.7.2015 14:02

Ty jsi to hlavně předtím přenastavil. :D
Nebo ještě můžeš upravit první řádek hlavičky takto:

$hlavicka = "From:" . $_POST['email'] . " <" . $_POST['cislo'] . ">";

Výsledek: tvuj@email.cz <123456789>
S tímhle si však nejsem jist. Můžeš zkusit.

Nahoru Odpovědět
31.7.2015 14:02
TruckersMP vývojář
Avatar
tbartolen
Člen
Avatar
Odpovídá na Jan Lupčík
tbartolen:31.7.2015 22:57

Už to chápu, jen pro uplnost, chci tomu rozumět uplně do podrobna, tak si to trošku zrekapituluju, vim že jsem otravnej, ale kdyby si mi do těch popisku mrknul, a připadně mi řekl kde píšu kravinu? Hodně by mi to pomohlo...

Začátek skriptu

$hlaska = '';
   if (isset($_GET['uspech']))
       $hlaska = 'Email byl úspěšně odeslán, brzy vám odpovíme.';
   if ($_POST) // V poli _POST něco je, odeslal se formulář

V tomhle definuju proměnou -hlaska-, v tý proměný je podmínka....pokud dostanu -uspech-, tak se hlaska rovna "'Email byl úspěšně odeslán, brzy vám odpovíme."
Soucasne s tim musi byt neco v poli POST...

Ted pokracovani podminky hlaska

if (isset($_POST['jmeno']) && $_POST['jmeno'] &&//Podmínka řiká že musí být vyplněný formulář
         isset($_POST['email']) && $_POST['email'] &&
         isset($_POST['zprava']) && $_POST['zprava'] &&
         isset($_POST['cislo']) && $_POST['cislo'] &&
         isset($_POST['rok']) && $_POST['rok'] == date('Y'))

Takze tady mi to definuje tu druhou podminku ze zacatku, ze v poli post musí něco být, a zároveň mi to definuje, co tam přesně musí být

Pokračování programu

$hlavicka = 'From:' . $_POST['email']; //Nastavení že se odesílá email
          $hlavicka .= "\nMIME-Version: 1.0\n"; //Nemám se vzrušovat
          $hlavicka .= "Content-Type: text/html; charset=\"utf-8\"\n";//Kodování asi
          $adresa = 'tbartolen@cz';//Email kam se odesilá
          $predmet = 'Nová zpráva z mailformu';//Předmět odeslaného emailu abych v tom neměl bordel
          $uspech = mb_send_mail($adresa, $predmet, $_POST['zprava'], $hlavicka); //Funkce odeslani emailu
          if ($uspech)//Podmínka která hlásí uživateli jestli ano nebo ne

Tady moc nechápu tu hlavičku, potom niz definuju adresu kam se email ma odeslat, predmet, do kterýho si pridam pomoci retezce to číslo, a do promeny uspech dávám funkci mb_send, která obsahuje ty presne dany ctyri polozky...pak dál už definuju jen zprávy co se vypisou v pripade uspechu a neuspechu...

Rozumim tomu tak nějak správně? Nechci bejt jen kopírovač =)

Nahoru Odpovědět
31.7.2015 22:57
Navštiv www.fb.com/skkelticz
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na tbartolen
Jan Lupčík:1.8.2015 9:17

Takže ... začnu taky od začátku. :D

Proměnná $hlaska není podmínka, ale je to pouze zpráva pro uživatele, co se děje apod. Na začátku skriptu se definuje prázdná, jinak by to při výpisu házelo chybu (v tomhle případě notice), že tato proměnná není. Ten GET a POST chápeš správně.

Zase. $hlaska není podmínka, ale je to ta zpráva pro uživatele. Tu podmínku ale chápeš správně. :)

Jak se u hlavičky definuje to From - to je adresa, odkud se ten E-mail odeslal (resp. v E-mailové schránce uvidíš, od koho E-mail je). To kódování chápeš správně. K tomu se tam nastavuje, aby se to zobrazovalo jako HTML dokument. Takže pokud by ti někdo do té zprávy vložil např. tag strong, v E-mailové schránce by se ti to zobrazilo tučně. Ten zbytek chápeš správně. :)

Btw. máš ten E-mail, kam se to má odesílat, napsaný správně?

Nahoru Odpovědět
1.8.2015 9:17
TruckersMP vývojář
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 21 zpráv z 21.