Autor Zpráva
goatee
Profil
Dobrý den,

upravil jsem si formulář na odesílání e-mailu, který má pomocí tagu <select> a <option> odesílat mail na různé e-mailové adresy v závislosti na tom, co si návštěvník vybere z nabídky.

<form id="contactform" action="/contact.php" method="post">
<ul>
<li>Zvolte <select name="volba"> 
    <option value="email1@neco.cz"> volba č. 1 </option>
    <option value="email2@neco.cz"> volba č. 2 </option>
</select>
</li>

<li><label for="name">Jméno </label> <input id="name" class="text" type="text" name="name" /></li>

<li><label for="email">Váš e-mail </label> <input id="email" class="text" type="text" name="email" /></li>

<li><label for="message">Zpráva </label> <textarea id="message" name="message" rows="6" cols="50"></textarea></li>

<li class="buttons"><input id="imageField" class="send" type="image" name="imageField" src="images/send.gif" /></li>

</ul>
</form>


Tady je soubor contact.php:

<?php

if(!$_POST) exit;

$email = $_POST['email'];


//$error[] = preg_match('/\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i', $_POST['email']) ? '' : 'INVALID EMAIL ADDRESS';
if(!eregi("^[a-z0-9]+([_\\.-][a-z0-9]+)*" ."@"."([a-z0-9]+([\.-][a-z0-9]+)*)+"."\\.[a-z]{2,}"."$",$email )){
    $error.="Invalid email address entered";
    $errors=1;
}
if($errors==1) echo $error;
else{
    $values = array ('name','email','message');
    $required = array('name','email','message');

    $your_email = $_POST['volba'];  
    $email_subject = "Zpráva z webového formuláře";
    $email_content = "new message:\n";

    foreach($values as $key => $value){
      if(in_array($value,$required)){
        if ($key != 'subject' && $key != 'company') {
          if( empty($_POST[$value]) ) { echo 'PLEASE FILL IN REQUIRED FIELDS'; exit; }
        }
        $email_content .= $value.': '.$_POST[$value]."\n";
      }
    }

    $service = "webform@neco.cz";
    $header = "Return-Path: $service\n"
         ."From: $service\n"
         ."Errors-To: $service\n"
         ."Reply-To: $email\n"
             ."X-Mailer: PHP/".phpversion()."\n"
             ."MIME-Version: 1.0\n"
             ."Content-Transfer-Encoding: 8bit\n"
             ."Content-type: text/plain; charset=UTF-8\n";
    $email_subject = "=?utf-8?B?".base64_encode($email_subject)."?=";

    if(@mail($your_email,$email_subject,$email_content,$header)) {
        echo 'Zpráva byla odeslána.';
    } else {
        echo 'ERROR!';
    }
}
?>

Takto formulář bez problémů funguje.
Když však do hlavičky html přidám javascript, díky kterému se po odeslání formulář "schová" a vypíše se zpráva o úspěšném odeslání, žádný e-mail už nepřijde.

V chybovém logu na serveru se objeví: "PHP Notice: Undefined index: druh in /var/www/web53/web/contact.php on line 18 ..."

Prosím o radu, jak to rozchodit (bez javascriptu se vypíše echo jen na prázdné, bílé stránce).

Javascript:

<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">// <![CDATA[
jQuery(document).ready(function(){
    $('#contactform').submit(function(){                  
        var action = $(this).attr('action');
        $.post(action, {
            name: $('#name').val(),
            email: $('#email').val(),
            company: $('#company').val(),
            subject: $('#subject').val(),
            message: $('#message').val()
        },
            function(data){
                $('#contactform #submit').attr('disabled','');
                $('.response').remove();
                $('#contactform').before('<p class="response">'+data+'</p>');
                $('.response').slideDown();
                if(data=='Zpráva byla odeslána.') $('#contactform').slideUp();
            }
        ); 
        return false;
    });
});
// ]]></script>
peta
Profil
Odkaz na ukazku a puvodni zdrojovy kod?
Ve vypsanem kodu neni nikde php kod s pole['druh']. Takze si dej vyhledavani textu, napis tam druh a podivej se, co tam mas napsane. Php pise, ze je chyba na radku 18. Cili problem se javascriptu nejspis vubec netyka.

PHP Notice: Undefined index: druh in /var/www/web53/web/contact.php on line 18 ...
= soubor: contact.php
= radek: 18
= index pole: druh (cili v php bude zapis neco jako $pole['druh'])
Zadny isset nebo neco, co by osetrilo pripad, kdyz ten index nevznikne z predchoziho kodu. Pravdepodobne nebyl poslan input pres $_POST.

Co se tyce mailu, tak na localhost nemas spusteny mail sever, jestli to spoustis na lokalnim php. Takze z hlediska php odeslani mailu probehne v poradku, preda udaje mimo php. Jenze k funkci mail nema system (tve windows) pridruzeny zadny program a tim to pro nej dal konci.
goatee
Profil
Omlouvám se, upravoval jsem kód a změnil jsem pole z ['druh'] na ['volba'], chyba je však jen v tomto postu.

Chyba se tedy týká tohoto řádku:

$your_email = $_POST['volba'];  

Pokud odkomentuju javascript, odesílání funguje.
S javascriptem to běží jedině v případě, že $your_email = $_POST['volba']; nahradím $your_email = nejaky.konkretni@mail.cz; - což bylo v původním kódu. To je jediná zásadní věc, kterou jsem měnil + rolovací nabídka v html formuláři pomocí <select>.

Web neběží na localhost, ale na hostingu, který má mail server funkční.
Ukázka zde
Davex
Profil
goatee:
Neumím jQuery a nevím, zda ten JavaScript chápu správně a jestli plně nahrazuje normální odeslání formuláře. Chápu to tak, že je v něm definováno, že se mají odeslat pouze hodnoty z polí #name, #email, #company, #subject a #message. A u toho netuším, proč by se měly odeslat pole #company a #subject, když ve formuláři nejsou. Možná je chyba ještě někde jinde, ale zkus si toto ještě jednou projít.
peta
Profil
<?php
//$your_email = $_POST['volba']; //nahradím 
$your_email = nejaky.konkretni@mail.cz;
echo ">$your_email<";
?>
To asi tezko, tam schazi uvozovky. S nimi by mne zajimalo, co vypise to echo v pripade zakomentovani radku 3 a odkomentovani 2. Pravdepodobne nic, protoze, jak pise Davex, v javascriptu jquery post nemas vubec select s name=volba.
        $.post(action, {
            name: $('#name').val(),
            email: $('#email').val(),
            company: $('#company').val(),
            subject: $('#subject').val(),
            message: $('#message').val()
        },
goatee
Profil
Musím se přiznat, že tohle je bohužel nad mé možnosti...

Vyřešil jsem to nakonec jiným formulářem, v každém případě vám děkuju za čas.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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