Autor Zpráva
davevo
Profil
Dobrý den,

potřeboval bych poradit s PHP přes který odesílám formulář na emal.
1.největší problém je že po odeslání mě echo nezavolá stránku odeslan.html
2. neumím ošetřit vztupy na email pole kde bych chtěl aby to zkontrolovalo aspon znak @ a u telefonu aby tam byly čísla 0123456789 a popřípadě +

Byl bych moc rád kdyby mě někdo opravil skript pokud to teda není nějak více náročné.
Názor na stránku www.masaze-terapiedotykem.cz
okolojsoucí
Profil *
Moderátor Davex: Následující příspěvky do #5 a příspěvek #7 přesunuty z Názor na stránku www.masaze-terapiedotykem.cz.


A co má dělat toto?
echo "<a href=http://www.masaze-terapiedotykem.cz/odeslan.html</a>"; 
} 
else 
{ 
echo "<a href=http://www.masaze-terapiedotykem.cz/neodeslan.html</a>"; 
}

Když už chcete přesměrovat tak pomocí
<?php 
header('Location: page.html'); 
?>
juriad
Profil
Přebývá ti jeden argument (telefon) ve volání funkce na 40. řádku.
cs_mail("info@masaze-terapiedotykem.cz", $predmet,$zprava,$telefon, "From: ".$email."\r\n"); 
davevo
Profil
Děkuji už to funguje.

A dokázal by mě někdo poradit jak ověřit vtupy?
neumím ošetřit vztupy na email pole kde bych chtěl aby to zkontrolovalo aspon znak @ a u telefonu aby tam byly čísla 0123456789 a popřípadě +
juriad
Profil
$je_email = preg_match('#^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$#', $email);
$je_telefon = preg_match('#^(\+420)? ?[0-9]{3} ?[0-9]{3} ?[0-9]{3}$#', $telefon);
Vrátí jedničku, pokud vyhovuje a nulu, pokud nevyhovuje vzoru. Použiješ tedy podmínku:
if($je_email == 1 && $je_telefon == 1) {...}
www.regularnivyrazy.info/email.html
www.regularnivyrazy.info/telefonni-cislo.html
roboti006
Profil *
1. if(mail($blabla)){
//úspěšně odesláno: přesměrovat
header('Location: http://www.example.com/odeslan.html');
} else {die('nebylo odeslano :)')}
2. if(!preg_match($struktura,$email){
//není email adresa
}
Snad jsem to nedopletl moc... :D
davevo
Profil
Díky to jsem potřeboav.

ještě jsem tam doprogramoval další podmínky.
if($je_email == 0 && $je_telefon == 1)
if($je_email == 1 && $je_telefon == 0)
if($je_email == 0 && $je_telefon == 0)
aby se pak odkázali na stránku spatný formát.html
Možná je to kostrbaté nebo to lze i jednoduše alé já to udělal takto
Amunak
Profil
Moderátor Davex: Přesunuto z Názor na stránku www.masaze-terapiedotykem.cz.

davevo:
Chceš mi říct, že všechny tyhle podmínky dělají ve svém bloku to samé? Z jejich popisu hádám, že ano. Když máš víc podmínek, které chceš spojit, tak to ozávorkuješ a dáš mezi to logické nebo: if((A) || (B) || (C) || ...) Nebo můžeš použít jen else { pokud máš před tím to if($je_* == 1 ... nebo použij prostě if($je_email == 0 || $je_telefon == 0)). Pokud chceš rozličit hlášku "vyplňte telefon" a "vyplňte email", tak bys to měl spíš předat dál jako parametr, než mít samostatnou stránku, a prostě tu chybovou hlášku vypsat tehdy, když je to neplatné.

Pak můžeš mít něco jako:
if($je_email == 1 && $je_telefon == 1) {
  // zpracuj formulář
} else {
  header('Location: formular.php?hlaska=' . !$je_email . '|' . !$je_telefon);
}

a u toho formuláře:
$hlasky = isset($_GET['hlaska']) ? explode('|', $_GET['hlaska']) : array(0,0);
if($hlasky[0])
  echo 'Email je špatně vyplněný.';
if($hlasky[1])
  echo 'Telefon je špatně vyplněný.';

juriad:
Co když má někdo email s doménou 3. řádu .museum? Co když má někdo email bez domény, chce použít jen IP adresu? Co když tam chce vyplnit telefon slovák (+420) nebo někdo, kdo má číslo z cizí země obecně? Proč si to tak komplikovat? Když tam někdo bude chtít vyplnit blábol, stejně to udělá. Pro validaci bohatě stačí něco jako tohle:
$je_email = preg_match('#^[a-z0-9._-]+@[a-z0-9.:-]+$#i', $email);
$je_telefon = preg_match('#^+?[0-9]{14}$#', preg_replace('#\s#', '', $telefon));

mmm, prosím o přesunutí
juriad
Profil
Amunak:
Když bude chtít místo domény ip adresu, musí uvést adresu ve tvaru: jmeno@[255.255.255.255], což tvůj regulár stejně neumožňuje.
A co potom IPv6.
A co, když bude ve jménu použít znak +, také ho neuvažuješ.
Nová TLD obsahují neascii znaky, vůbec je tvůj regex neuvažuje.
BTW, 3. řád domény mi nevadí, museum lze řešit změnou jednoho znaku v regexu (horního omezení rozsahu TLD).

Co telefon ve formátu: 00420 123456789? Ten neumožňuješ.

Nejde mi o útok, ale ukázku, že téměř každé řešení má mouchy. A vymyslet takovou kontrolu, která by nebyla příliš restriktivní a zároveň byla dostatečně robustní a jednoduchá, dá docela práci. ;-)
Amunak
Profil
juriad:
Když bude chtít místo domény ip adresu, musí uvést adresu ve tvaru: jmeno@[255.255.255.255], což tvůj regulár stejně neumožňuje.
To jsem nevěděl. Buď by to tam chtělo dopsat, nebo prostě nechat jen username (hádám, že to máš z nějaké specifikace), a ten zavináč.

A co potom IPv6.
Pokud to taky nemá nějakou zvláštní notaci, ta dvojtečka by na to měla stačit, ne?

A co, když bude ve jménu použít znak +, také ho neuvažuješ.
Ani ty :-) domníval jsem se, že to máš právě z nějaké specifikace. Po přečtení wikipedie bych se přikláněl k tomu testovat pouze zavináč. I když ztovna to plus by tam snad nikdy být nemělo, i když mám pocit, že jsem někde adresu se znakem plus viděl.

Co telefon ve formátu: 00420 123456789? Ten neumožňuješ.
Přepočítal jsem se. Mezery odmažu rovnou (a asi by stálo za to všechny počáteční plusy rovnou přecést na 00) - to spíš kvůli sjednocení čísel, aby jedno nebylo +420 1245 68970, druhé 00420123654258 a třetí 28 55 66 32. A pak to má jen 14 znaků (i když nevylučuji, že existují delší telefonní čísla).

A vymyslet takovou kontrolu, která by nebyla příliš restriktivní a zároveň byla dostatečně robustní a jednoduchá, dá docela práci. ;-)
Souhlasím - proto bych se taky spíš přikláněl k tomu dělat kontrolu pokud možno "stoprocentně nerestriktivní", protože nějaký blábol tam může uživatel/zákazník napsat vždycky, a regexem to projde, ale když ho něco omezí tak, že tam tu adresu nemůže napsat, je to dost možná taky ztracený zákazník.

Na druhou stranu pokud má někdo adresu ve stylu "a.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual!"@[IPv6:feed:bad:dead::beef:cafe], tak asi nemůže úplně očekávat, že mu bude všude fungovat. :-)

Tak jsem si hrál s gmailem a zjistil jsem, že snad ani jedna z těch kurióznějších adres tam nefunguje - buď to server odmítne odeslat, nebo se to ztratí po cestě, nebo dostanu oznámení o nedoručitelnosti. Navíc Thunderbird odmítá odesílat maily na adresy, kde je lokální část s diakritikou.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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