Autor Zpráva
Joan
Profil
Mám webový formulář v souboru formular.php:
<form action="odeslani.php" name="webovy" method="post">
Váš email:
<input type="text" name="email">
Předmět zprávy:
<input type="text" name="predmet">
Ochrana před spambotem - doplňte prosím výsledek:
čtyři krát tři = <input type="text" name="spam">
<textarea name="zprava"></textarea>
Poslat zprávu  i na zadaný email:
<input type="checkbox" name="samsobe" value="sobe" checked>
<input type ="submit" name="poslano" value="Odeslat"> 
</form>


Zpracující script je v odeslani.php:
<?php 
function zobraz_formular($email, $predmet, $spam, $zprava)
{
?>
<form action="odeslani.php" name="webovy" method="post">
// viz celý výše uvedený formulář
</form>

<?php
}
?>
<?php
$email = $_POST["email"];
$predmet = $_POST["predmet"];
$spam = $_POST["spam"];
$zprava = $_POST["zprava"];
if (empty($_POST))
  zobraz_formular("", "", "", "");
  else
  {
  if ($_POST["email"]=="")
  {
  echo "Zadejte prosím svůj email.";
  zobraz_formular($_POST["email"],$_POST["predmet"],$_POST["zprava"]);
  }
elseif
  {
  preg_match("/^[^@]+@[^@]+[.][a-zA-Z]+$/", $_POST["email"])
  echo "Emailová adresa nemá platnou podobu";
  }
 elseif ($_POST["predmet"]=="")
 {
 echo "Napište prosím předmět zprávy";
   zobraz_formular($_POST["email"],$_POST["predmet"],$_POST["zprava"]);
 }
 {elseif ($_POST["spam"] != 12)
 echo "Vyplňte prosím správné číslo";
 zobraz_formular($_POST["email"],$_POST["predmet"],$_POST["zprava"]);
 }
  elseif ($_POST["zprava"]=="")
 { 
  echo "Nezapomněli jste napsat samotnou zprávu?";
   zobraz_formular($_POST["email"],$_POST["predmet"],$_POST["zprava"]);
  }
  elseif (strlen($_POST["zprava"] > 400))
  {
   echo "Délka zprávy nemůže přesáhnout 400 znaků.";
   }
elseif ($_POST["samsobe"]==$_POST["email"])
   {
    Mail('$_POST["email"]', $predmet, $zprava);
    }
 else 
 {
 Mail("moje_adresa@email.cz", $predmet, $zprava, "From: ".$email);
 echo "Zpráva byla úspěšně odeslána";
 } 
    }
?>


Měla bych k tomu prosím pár důležitých otázek:

1) vlastní formulář mám v souboru formular.php a zpracující script v odeslani.php, který mj. obsahuje opět celý vlastní formulář: napřed se totiž zobrazí formulár.php a při event. špatném vyplnění zůstává na stránce - teď už v souboru odeslani.php - pro možnost opravy odesilatelem. Odeslání formuláře testuji v Test Mail Server Tool a při správném vyplnění se skutečně odešle. Zkoušela jsem upravit odesilaci script tak, aby se v něm místo CELÉHO formuláře dal použít jen nějak zkrácený odkaz na formulář v formular.php, např. pomocí atributu name u formuláře, ale to mi už nefunguje. Jde vůbec nějak eliminovat opakování celého formuláře v odesli.php?

2) u všech položek VYJMA textarea se mi daří v inputech udržet hodnoty již zadané odesilatelem pomocí atributu "value". Textarea ovšem nemá tento atribut a větě "obsahem textového pole je obsah elementu textarea" nerozumím. Resp. netuším, jak pomocí ne-atributu obsah mám v textarea udržet obsah již zadaný odesilatelem.

3) chci, aby odesílatel měl možnost zaslat si svou zprávu i sám sobě (např. aby nezapomněl co přesně ve formuláři odeslal). Můj kód error nehází ale nevím, jak si odeslání (kopie) na pisatelovu adresu ověřit na localhostu - nebo to mám špatně?

4) potřebuji do odesílacího scriptu vpašovat kontrolu platné emailové adresy. Zkoušela jsem tam vložit
preg_match("/^[^@]+@[^@]+[.][a-zA-Z]+$/", $_POST["email"]


regulárnímu výrazu rozumím, ale očividně tam mám renonc a parse error hledá kdesi levou kulatou závorku. Na veškerých návodech jsem našla vždy jen kontrolu pomocí funkce "ereg". Poradíte mi někdo prosím kde mám co upravit nebo přesunout?

5) Proč je tady u proměnné $head ta tečka před rovnítkem?

6) chtěla bych dosáhnout toho, aby se u vyplňování formuláře všechny chyby zobrazily zároveň, ne po jedné jako u výše uvedeného řešení, tak jsem se pokusila jednotlivé položky z inputů nastěhovat do array, ale na řádku u "else" mi to hází parse_error a já nevím proč. Inspirovala jsem se tímto odkazem.

<?php 
function zobraz_formular($email,$predmet,$spam,$zprava)
{
?>
<form action="mail_2.php" ............ //viz nahoře uvedený formulář
</form>
<?php
}
?>

<?php
$email = $_POST["email"];
$predmet = $_POST["predmet"];
$spam = $_POST["spam"];
$zprava = $_POST["zprava"];

$zpracovani = array("email", "predmet", "spam", "zprava");
foreach ($zpracovani as $polozka)
{
if (empty($zpracovani))
{   
zobraz_formular($_POST["email"],$_POST["predmet"],$_POST["spam"],$_POST["zprava"]);
}
{
echo "Nutné vyplnit $polozka";
}
}
{
else
{
 Mail("moje_adresa@email.cz", $predmet, $zprava, "From: ".$email);
 echo "Zpráva byla úspěšně odeslána";
 } 
 }
?>


Kdyby byl někdo tak moc hodný a ASPOŇ NĚCO mi odpověděl, byla bych velmi ráda, děkuji předem!
fuckin
Profil
1) nasledným redirectem na jiný php soubor
2) <textarea>Obsah textarei</textarea>
3) žádný rozdíl v tom není zda odesíláš tam nebo tam, prostě to odešli 2x
4) když už kopíruješ tak pořádně
preg_match("/^[^@]+@[^@]+[.][a-zA-Z]+$/", $_POST["email"])


Radši ale použij tuto funkci, vrací boolean http://php.vrana.cz/kontrola-e-mailove-adresy.php

5) Protože se nejedná o přiřazení, nýbrž přidání. Prostě se na konec přidá další v tomto případě řetězec.
6) Tam se nejde ničím inspirovat, jelikož se jedná o naprosto nevhodné řešení.

$chyba = array();

  // kontrola vsech udaju
  if (empty($jmeno)) { $chyba[] = 'Chybi jmeno'; }
  ...
  
  
  //vypsani chyb
  foreach ($chyba as $error) {
    echo $error.'<br>';
    }
Joan
Profil
fuckin:
Díky za Tvou odpověď, ale:

1) redirectem na jaký soubor? Už teď mám celkem dva - jeden s formulářem a druhý se zpracovatelským skriptem
2) já ale netuším, co do textarea pisatel napíše tak opravdu nerozumím, jak to mám ve formuláři udržet :-(
3) jistý rozdíl v tom je, protože když to posílá na mou adresu, tak se mi objeví odesilatelova adresa a když to posílá i sám sobě, tak by to vypadalo, jako že si píše sám ze své adresy. Navíc potřebuji ošetřit zda vůbec chce si zprávu poslat i sám sobě
4) máš pravdu, i z knihy bych měla opisovat pořádně :-). Ovšem Tvůj odkaz operuje s funkcí "eregi" - copak ta není na rozdíl od "ereg" tzv. deprecated?
5) to vím, že tečka připojuje ovšem nenapadlo mě, že se dá připojit i rovnítko. Na jiném místě bych tu tečku chápala víc.
6) opravdu je tato rada nevhodné řešení?

Jinak díky za Tvůj čas :-)
fuckin
Profil
1) třeba na soubor hotovo.php kde se napíše že zpráva byla odeslána. Do cookie si třeba přidej hodnotu odeslano a pokaždé to kontroluj. Moc nechápu kde je u tebe ten problém.
2) <textarea name="atribut_name_u_textarea">Blabla</textarea> -> $_POST['atribut_name_u_textarea'];
3) to jsem bral jako samozřejmost
4) tím se netrap...
5) ano, je to ekvivalentní
6) moje řešení je lepší, nebo vidíš tam něco špatného?
Joan
Profil
Zdravím,
zkouším předat proměnné z formuláře v array v naději, že se všechny hlášky o nevyplněných políčkách zobrazí odesilateli NARÁZ ale chyba lávky: totožný mail se odešle třeba šestkrát, podle toho, kolik mám proměnných.
Přidala jsem do scriptu
$zpracovani = array();
$zpracovani["email"] = "Emailová adresa;
$zpracovani["predmet"] = "Předmět zprávy";
..... atd. pro $zprava i $spam

a mám nastaveno foreach pro procházení pole a hledání prázdných proměnných, tj. nevyplněných políček ale nefunguje mi odeslání pouze 1x na mou adresu :-(

Vložím-li do <input name="cokoliv[]"> hranaté závorky, tak se mi do všech políček formuláře po odeslání vecpe slovíčko "Array" a nejde změnit na číslovku u kontroly spamu.
Inspirovala jsem se tímto návodem ale jak píšu, dělá mi psí kusy.
Taky mi není nic platná snaha o udržení již napsané zprávy v případě nevyplnění nutného políčka přes <teaxtarea name="zprava"></textarea> a
$zprava = $_POST["zprava"];

Proč vůbec textarea nemá použitelný atribut "value"?
Prosím o trochu navedení, díky moc!

EDIT:
Bože na nebi, kdyby autor knihy "PHP 5 začínáme programovat" Jiří Bráza nezapomněl v příkladu své knihy uvést jeden velice podstatný řádek, který mě samotnou jaksi nenapadlo doplnit, tak bych byla už před několika dny za vodou...
A tato Pantherova rada je skutečně k nezaplacení! Poté, co jsem objevila, proč se mi hlášky stále nezobrazují, jsem pochopila i princip tété skvělé rady, díky za ni.
Hezký den :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0