Autor Zpráva
matesek
Profil
Registrace.php

<script>
function a()
{
var polickaid    =    new Array("jmeno", "prijmeni", "adresa", "mesto", "psc", "telefon", "email", "nick", "heslo", "podminky");
var nazvy    =    new Array("jméno", "příjmení", "adresa", "město", "PSČ", "telefon", "email", "nick", "heslo", "podminky");
var obsahpoli    =    new Array("", "", "", "", "", "", "", "", "", "on");
var mindelka    =    new Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
var chybovahlaska = "";
for (i=0;i<polickaid.length;i++)
{
obsahpoli[i]    =    document.getElementById(polickaid[i]).value;
if (obsahpoli[i]<mindelka[i])
  {
  chybovahlaska += "Vyplňte pole " + nazvy[i] + ".";
  //    chybovahlaska += " Je třeba aspoň " + mindelka[i] + " znaků.";    //    lze vymazat
  if (i!=polickaid.length) chybovahlaska += "\n";
  }
}
if(chybovahlaska.length>0)
  {
  window.alert(chybovahlaska);
  return false;
  }
else
  {
  return true;
  }
}
</script>


<form method=post action="index.php?page=registrace_zapis" name=formular onsubmit="return a();">
<table border="0" align="center">
<tr>
<td>
Jméno :
</td>
<td>
<input name=jmeno id=jmeno>
</td>
</tr>

<tr>
<td>
Příjmení :
</td>
<td>
<input name=prijmeni id=prijmeni>
</td>
</tr>

<tr>
<td>
Datum narození 
</td>
<td>
<input name=narozeni id=narozeni>
</td>
</tr>

<tr>
<td>
Adresa :
</td>
<td>
<input name=adresa id=adresa>
</td>
</tr>

<tr>
<td>
Město :
</td>
<td>
<input name=mesto id=mesto>
</td>
</tr>

<tr>
<td>
PSČ :
</td>
<td>
<input name=psc id=psc>
</td>
</tr>

<tr>
<td>
Telefon :
</td>
<td>
<input name=telefon id=telefon>
</td>
</tr>

<tr>
<td>
E-Mail :
</td>
<td>
<input name=email id=email>
</td>
</tr>

<tr>
<td>
Nick :
</td>
<td>
<input name=nick id=nick>
</td>
</tr>

<tr>
<td>
Heslo :
</td>
<td>
<input type="password" name=heslo id=heslo>
</td>
</tr>

<tr>
<td>
Souhlasím s podmínkama (<a href="index.php?page=podminky">ZDE)</a> :
</td>
<td>
<input type="checkbox" name=podminky id=podminky>
</td>
</tr>

<tr>
<td></td>
<td>
<input type=submit>
</td>
</tr>
</table>
</form>




Registrace_zapis.php

<?php
if ($_POST['podminky']=="on")
	$mail = "Rockink@seznam.cz";
	$predmet = "registrace";
	$zprava =  "Jmeno: {$_POST['jmeno']}\r\n";
	$zprava .=  "Prijmeni: {$_POST['prijmeni']}\r\n";
	$zprava .=  "Datum narozeni: {$_POST['narozeni']}\r\n";
	$zprava .=  "Adresa: {$_POST['adresa']}\r\n";
	$zprava .=  "Mesto: {$_POST['mesto']}\r\n";
	$zprava .=  "PSC: {$_POST['psc']}\r\n";
	$zprava .=  "Telefon: {$_POST['telefon']}\r\n";
	$zprava .=  "E-Mail: {$_POST['email']}\r\n";
	$zprava .=  "Nick: {$_POST['nick']}\r\n";
	$zprava .=  "Heslo: {$_POST['heslo']}\r\n";
	$zprava .=  "Podminky: {$_POST['podminky']}\r\n";

	$kon = mail ($mail, $predmet, $zprava, "From: {$_POST['email']}\n");
else
   echo 'Musíte souhlasit s podmínkama <br>
	<input type=button onclick="history.back()" value="Zpět">'
?>




Při odeslání dat ke zpracování se mi odešle pouze proměnná pro podmínku , ale do e-mailu se mi žádná data neodešlou . Odešle se pouze e-mail s předdefinovanýma věcma . Poradí někdo proč to tak je ?
Alphard
Profil
Co se stane (ukáže), když tam dáte tohle?
<?php
print_r($_POST);
if ($_POST['podminky']=="on")
{
    $mail = "Rockink@seznam.cz";
    $predmet = "registrace";
    $zprava =  "Jmeno: {$_POST['jmeno']}\r\n";
    $zprava .=  "Prijmeni: {$_POST['prijmeni']}\r\n";
    $zprava .=  "Datum narozeni: {$_POST['narozeni']}\r\n";
    $zprava .=  "Adresa: {$_POST['adresa']}\r\n";
    $zprava .=  "Mesto: {$_POST['mesto']}\r\n";
    $zprava .=  "PSC: {$_POST['psc']}\r\n";
    $zprava .=  "Telefon: {$_POST['telefon']}\r\n";
    $zprava .=  "E-Mail: {$_POST['email']}\r\n";
    $zprava .=  "Nick: {$_POST['nick']}\r\n";
    $zprava .=  "Heslo: {$_POST['heslo']}\r\n";
    $zprava .=  "Podminky: {$_POST['podminky']}\r\n";

    $kon = mail ($mail, $predmet, $zprava, "From: {$_POST['email']}\n");
}
else
{
   echo 'Musíte souhlasit s podmínkama <br>
    <input type=button onclick="history.back()" value="Zpět">';
}
?>
jabloň
Profil *
Některé inputy nemají typ, možná to je tím.
AM_
Profil
vypiš si print_r($_POST), abys viděl, co vůbec přichází.
matesek
Profil
Alphard:
Co se stane (ukáže), když tam dáte tohle?

Array ( ) Musíte souhlasit s podmínkama
matesek
Profil
AM:
vypiš si print_r($_POST), abys viděl, co vůbec přichází.
Array ( )
radvis
Profil *
<input name=adresa id=adresa> Nezapoměl jsi nahodou uvozovky? <input name="adresa" id="adresa">
matesek
Profil
radvis:
Nezapoměl jsi nahodou uvozovky?
A jsi si jistý , že tam musí být ? Mě to někde funguje i bez nich .
panther
Profil
radvis:
Nezapoměl jsi nahodou uvozovky?
ne, u jednoslovných názvů jsou nepovinné.
radvis
Profil *
Zkus to udělat tak, ze zatím budeš odesílat jen 2veci a až ti pujdou tak to doděláš. Jde ti tohle:

<form method="post" action="registrace_zapis.php" name="formular" onsubmit="return a();">
Nick: <input name="nick" id="nick">
Heslo: <input type="password" name="heslo" id="heslo">
<input type="checkbox" name="podminky" id="podminky">
<input type="submit" name="send" value="Odeslat">
</form>

<?php
if ($_POST['podminky'] == 1 ){
    $mail = "Rockink@seznam.cz";
    $predmet = "registrace";
    $zprava =  "Jmeno: {$_POST['jmeno']}\r\n";
    $zprava .=  "Prijmeni: {$_POST['prijmeni']}\r\n";
    $zprava .=  "Datum narozeni: {$_POST['narozeni']}\r\n";
    $zprava .=  "Adresa: {$_POST['adresa']}\r\n";
    $zprava .=  "Mesto: {$_POST['mesto']}\r\n";
    $zprava .=  "PSC: {$_POST['psc']}\r\n";
    $zprava .=  "Telefon: {$_POST['telefon']}\r\n";
    $zprava .=  "E-Mail: {$_POST['email']}\r\n";
    $zprava .=  "Nick: {$_POST['nick']}\r\n";
    $zprava .=  "Heslo: {$_POST['heslo']}\r\n";
    $zprava .=  "Podminky: {$_POST['podminky']}\r\n";

    $kon = mail ($mail, $predmet, $zprava, "From: {$_POST['email']}\n");
}else{
   echo 'Musíte souhlasit s podmínkama <br>
    <input type=button onclick="history.back()" value="Zpět">';
}
?>

Přidal jsem tam všude "" a místo index.php?page=registrace_zapis jsem změnil na registrace_zapis.php a misto on je 1. Myslím, že při zaškrtnutém tvaru vrací 1 a při nezaškrtlém vrací 0. Zkus a uvidíš.
matesek
Profil
v tom registrace_zapis.php jsem nechal Array()

Array ( [nick] => 12 [heslo] => 34 [podminky] => on [send] => Odeslat )
matesek
Profil
V tom svém jsem jen přidal uvozovky a už to funguje, ale nechápu, proč tam musí být.
radvis
Profil *
Takže už jsi to vyřešil?:)
sysel
Profil
Nabízím následující zápis.

<html><head><title>Registrace</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script>/* (c) 2010 sysel; GPL */
var napln =
{jmeno:     {lb:"Jméno",dl:1,tp:"text"}
,prijmeni:  {lb:"Příjmení",dl:1,tp:"text"}
,narozeni:  {lb:"Datum narození",dl:1,tp:"text"}
,adresa:    {lb:"Adresa",dl:1,tp:"text"}
,obec:      {lb:"Obec",dl:1,tp:"text"}
,psc:       {lb:"PSČ",dl:5,tp:"text"}
,telefon:   {lb:"Telefon",dl:9,tp:"text"}
,email:     {lb:"e-mail",dl:1,tp:"text"}
,nick:      {lb:"Přezdívka",dl:1,tp:"text"}
,heslo1:    {lb:"Heslo",dl:1,tp:"password"}
,heslo2:    {lb:"Zopakujte heslo",dl:1,tp:"password"}
,podminky:  {lb:'Souhlasím s <a href="index.php?page=podminky">podmínkami</a>',dl:0,tp:"checkbox"}
,send:      {lb:"Odeslat",dl:0,tp:"submit"}
}
function dup(oRow)
{ oRow.parentNode.replaceChild(oRow.cloneNode(true ),oRow.parentNode.insertRow(oRow.rowIndex+1));
}
function vytvor()
{ var radek = document.forms.formular[0].parentNode.parentNode;
  for(idx in napln)
  { dup(radek);radek=radek.nextSibling;
    radek.firstChild.innerHTML=napln[idx]['lb'];
    radek.firstChild.nextSibling.firstChild.type=napln[idx]['tp'];
    radek.firstChild.nextSibling.firstChild.name=idx;
  };
}
function kontrola(formulka)
{   var chyba=0; 
    if(!formulka['podminky'].checked) 
    { alert('Musíte souhlasit s Podmínkami'); return false}
    if(formulka['heslo1'].value != formulka['heslo2'].value) 
    { alert('Hesla nesouhlasí'); return false}
    for(idx in napln)
    {  if(formulka[idx].value.length < napln[idx]['dl'])
        {  formulka[idx].style.backgroundColor = 'rgb(255, 222, 222)'; chyba++;}
        else {formulka[idx].style.backgroundColor = 'rgb(255, 255, 255)'}
    }; 
    if(chyba) { alert('Je třeba správně vyplnit některé údaje'); return false }
    else return true
} 
</script>
</head>
<body onload="vytvor()">
<form method=get action="#" name="formular" onsubmit="return kontrola(this);">
<table border="1" align="center"><tbody><tr><td></td><td><input type="hidden"></td></tr></tbody></table>
</form>
</body>
</html>

Přidání, ubrání řádek a podmínek je snad zřejmé. Uvozovkám se vyhneme, BTW uvnitř HTML tagu musejí uvozovky ohraničovat hodnotu. Sneslo by to ještě nějaké kosmetické úpravy - stylopis, odmazání vzorového řádku, ... - ale to už si každý může dodělat sám.

V PHP se už nemusí řešit, zda bylo potvrzeno přijetí Podmínek, protože kontrola JavaScriptem zaručí, že se bez zaškrtnutého checkboxu nic neodešle. Jinak v poli $_POST[] se proměnná pocházející od checkboxu buď objeví, pokud byl zaškrtnut, a má tu hodnotu, kterou jí v HTML (popř. JS) přidělíme, nebo hodnotu defaultní, což je "on". Takže stačí testovat pouze, zda $_POST["nazevCheckboxu"] existuje. Trochu pruda, protože v některých případech nevíme, kolik checkboxů vlastně ve formuláři bylo.

Pro ladění výstupu formuláře se lépe hodí method="GET" a action="#", protože výsledek je hned vidět v adresovém řádku. Ladit najednou HTML, JS a PHP je zbytečně komplikované. Dokud nefunguje odesílání, není v PHP co řešit. Provozní verse samozřejmě předpokládá method="POST" a pokud možno i protokol https. Heslo sice ve formuláři vidět není, ale metodou GET je v adresní řáde vidět zcela nahé.

Pokud bych se mohl vyjádřit k formuláři samotnému, testování prázdných polí by šlo provést i bez požadované minimální délky, ale není to špatný nápad, maximální délku lze omezit v HTML (JS) rovnou např. maxlength="15". Lze celkem snadno (přes regexp) kontrolovat, aby v <input>ech, kde mají být pouze čísla, uživatel nic jiného nezapsal. Podobně lze kontrolovat datum, popřípadě přidat rovnou omezení vstupu pomocí vložené funkce s kalendářem. Těch je na webu hodně, stačí si vybrat. Kdysi jsem napsal i jednodušší variantu pro vstupní pole s datumem složenou ze tří svázaných <select>ů.

Hezký den :-)
matesek
Profil
Ten kód je pěknej , ale na webu to už tak hezky nevypadá . Koukněte se sami
matesek
Profil
sysel:
content="text/html; charset=utf-8">

bych změnil na:
content="text/html; charset=windows-1250">


<table border="1" align="center">

bych změnil na:
<table border="0" align="center">

A nějak se nemůžu vyznat, jak tam mám dát to odeslání do druhého souboru. Klasicky nakonec do form, ve kterém je tabulka ?
sysel
Profil
matesek:
jak tam mám dát to odeslání do druhého souboru

<form method="post" action="./registrace_zapis.php" name="formular" onsubmit="return kontrola(this);">


Samozřejmě, kód je třeba nastylovat. Já se však vyžívám spíše ve funkčnosti a barvičky mnou nijak moc necloumají. I když je bez diskusí uznávám! Navržená stránka není hotové dílo, je to spíš takový prototypový pokus. Ješte jsou v ní i některé logické nesrovnalosti, ale šlo mi především o ukázku, jak na to z jiného konce - totiž z klientského.

Má to samozřejmě jeden velký zádrhel - když si klient vypne JavaScript jde všechno do kopru.
:-)

Vůbec jsem se nevěnoval příjimací stránce v PHP, tam lze rovněž udělat mnohé finty. Kupříkladu si pamatuji, že tak jako proměnné z POSTu a GETu přebírá odpovídající proměnná $_POST[]/$_GET[], když nevím, která methoda bude použitá, lze použít proměnnou $_REQUEST[] (snad si to pamatuju dobře), v ní je vlastně totéž, ale bez rozlišení, kterou methodou to přišlo. Hodně práce bude s dohledáváním, zda je použitý nick jedinečný, popř. zda už se tentýž klient nepokusil registrovat dříve, v úvahu připadá i kontrola IP addressy a odeslání kontrolního e.mailu na jeho uvedenou adresu. Může se přidat i tzv. passphrase=nějaký dotat/odpověď v případě zapomenutí hesla ...

Otázku kódování si musí rozhodnout programátor, já na Applech a pod Linuxem už několik let používám utf-8 ke své i klientské spokojenosti, ale volba je na vývojáři, a od toho je tam ta explicitní deklarace. :-)
matesek
Profil
Nechal jsem tam starý Zapis a vše funguje jak má . VŠEM MOC DĚKUJU .

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: