akichan
napoveda vypnout Akichan patička

Akihabara.cz


Autor Téma: Pomoc s webovými stránkami  (Přečteno 34136 krát)

0 uživatelů a 1 Host prohlíží toto téma.

Offline FaraonX

  • Starý kořen
  • ****
  • なんくるないさ
Re:Pomoc s webovými stránkami
« Odpověď #45 kdy: 13. Březen 2017 - 18:40:03 »
Nevyhodí to ani report. Ostatně, proč by prvek pole nemohl být prázdný...

Já ti rozumím a nehádám se. Vztahovalo se to k tomu konkrétnímu příkladu, kde samozřejmě dostanu pole o čtyřech prvcích, kdy v cyklu for (protože $c = 1, aby bylo možno pro výčet použít $c++) dostávám jako první hodnotu 1 a nikoliv 0 a právě proměnná $c je použita jako index pro výpis prvku pole. Jiná možnost by byla od $c odečítat 1, prašť jako uhoď.

Klidně může do session ukládat rovnou pole, myslím, že už si s tím nějak poradí :)
Tak nemáš pravděpodobně tak přísný error_report výstup. Zkus to místo v sessionu hodit jen do proměnné a zkusit třeba na:
Kód: [Vybrat]
http://phpfiddle.org/Něco by ti to mělo vyhodit, protože saháš mimo velikost pole, co sis definoval.
Tak může tam být nultý prázdný prvek, ale je to zbytečná věc navíc, a každá taková věc sebou nese nějakou logiku v kódu navíc. Tudíž to pak zvětšuje kód, zbytečně zatěžuješ vývojáře přemýšlet nad věcmi, který tam být nemusí. Čím je kód jasnější a přímější, tím líp.

« Poslední změna: 13. Březen 2017 - 18:41:39 od FaraonX »

Offline ピンクセイコ

  • Veterán
  • *****
  • なんかちがう...
Re:Pomoc s webovými stránkami
« Odpověď #46 kdy: 13. Březen 2017 - 23:26:08 »
jo.. když nad tím přemýšlím, využití array bude asi jednodušší, protože pokud to dobře chápu, můžu si udělat tři pole, a dávat si tam název, cenu a hmotnost zvlášť. a vyhnu se tím použití separátorů a explode. přeci jen, i s tím mailovým formulářem jsem si hrál celé odpoledne, takže každé zjednodušení pomůže.. ^^;

Offline FaraonX

  • Starý kořen
  • ****
  • なんくるないさ
Re:Pomoc s webovými stránkami
« Odpověď #47 kdy: 14. Březen 2017 - 00:31:14 »
... pokud to dobře chápu, můžu si udělat tři pole, a dávat si tam název, cenu a hmotnost zvlášť.
Jj můžeš. Nejdříve, ale koukni na něco o vícerozměrných polích. Jak se v tom zorientuješ, tak tě pole už asi ničím nepřekvapí.
Názorné příklady jsou vždy nejlepší:
Kód: [Vybrat]
http://www.pehapko.cz/zakladni-kurz/9-pole

http://webcheatsheet.com/php/multidimensional_arrays.php
https://www.eduonix.com/blog/web-programming-tutorials/multi-dimensional-arrays-in-php/
« Poslední změna: 14. Březen 2017 - 00:33:07 od FaraonX »

Offline ピンクセイコ

  • Veterán
  • *****
  • なんかちがう...
Re:Pomoc s webovými stránkami
« Odpověď #48 kdy: 15. Březen 2017 - 11:53:20 »
jak jsem tu psal o mailovém formuláři, tak mi nějak přestal fungovat. nevím, jestli jsem tam něco omylem přepsal, nebo co se stalo. každopádně jsem ho už nerozchodil, takže jsem začal znovu. teď mám opět verzi, která funguje, tak se jdu jen zeptat, jestli tam není něco vyloženě prasáckého, nebo jestli to takhle můžu nechat..

Kód: [Vybrat]
<div class="form">

<?php 
    $to 
"email@example.com"// prijemce
    
$from $_POST['email']; // odesilatel
    
$jmeno $_POST['jmeno'];
    
$adresa $_POST['adresa'];
    
$mem_no $_POST['mem_no'];
    
$spam $_POST['spam'];
    
$subject "Formulář Název webu";
    
$subject2 "Kopie Vaší zprávy";
    
$message $jmeno "\n\n" $adresa "\n\n" $mem_no "\n\n" $_POST['zprava'];
    
$message2 "Zde je kopie Vaší zprávy odeslané z formuláře na http://www.domena.cz/" "\n\n" $jmeno "\n\n" $adresa "\n\n" $mem_no "\n\n" $_POST['zprava'];

    
$headers "Od:" $from;
    
$headers2 "Od:" $to;

if(isset(
$_POST['submit']))

{
if($spam=="47")
{
    
mail($to,$subject,$message,$headers);
mail($from,$subject2,$message2,$headers2); // kopie odesilateli
echo "<div class=\"form_success\">Email odeslán, brzy Vás kontaktujeme.</div>";
}
else
{
echo "<div class=\"form_success\">Chyba! Email nebyl odeslán.</div>";


}
?>



<div class="par_form">

<form action="" method="post">
<div class="form_name">Jméno a příjmení: <input type="text" name="jmeno" size="20"></div>
<div class="form_email">Email: <input type="text" name="email" value="@" size="20"></div>
<div class="form_mem_no">Členské číslo: <input type="text" name="mem_no" size="20"></div>
<div class="form_address">Adresa: <input type="text" name="adresa" size="60"></div>
<div class="form_message">Zpráva: <input type="text" name="zprava" size="60"></div>
<div class="form_spam">Počet prefektur Japonska: <input type="text" name="spam" size="2"></div>
<div class="form_button"><input type="submit" name="submit" value="Odeslat"></div>
</form>

</div></div>

Offline 8B3CE273

  • Otaku
  • ***
Re:Pomoc s webovými stránkami
« Odpověď #49 kdy: 15. Březen 2017 - 14:25:50 »
tohle neděle, takový formuláře mají rádi spamboti a pak přes to budou rozesílat bordel. V práci to řešíme každou chvíli. Přidej tam alespoň nějakej dynamickou captchu.

Offline Skogen

  • Veterán
  • *****
  • Cynický objektivista
Re:Pomoc s webovými stránkami
« Odpověď #50 kdy: 15. Březen 2017 - 15:02:28 »
Hlavička by měla vypadat takto:

$headers .= 'From: '.$from. "\r\n";

Chybí mi tam MIME type a kódování:

$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-Type: text/html; charset=utf-8' . "\r\n"; // Pokud kóduješ v UTF-8 a chceš mít html formát mailu, což ti umožní použít některé tagy (ale pozor, maily snesou jenom něco)

Určitě by to chtělo validovat alespoň emailovou adresu, nabízí se:


filter_var($from, FILTER_VALIDATE_EMAIL)

Takže podmínka pro vykonání fce mail by byla


if($spam=="47" and filter_var($from, FILTER_VALIDATE_EMAIL))

Pak by to chtělo sdělit, proč vlastně došlo k chybě v odeslání, takže raději:

if(isset($_POST['submit']))

   {
   if($spam=="47" and filter_var($from, FILTER_VALIDATE_EMAIL))
      {
       mail($to,$subject,$message,$headers);
      mail($from,$subject2,$message2,$headers2); // kopie odesilateli
      echo "<div class=\"form_success\">Email odeslán, brzy Vás kontaktujeme.</div>";
      }
      elseif ($spam != "47") echo "<div class=\"form_success\">Chyba! Špatný antispam.</div>";
      else echo "<div class=\"form_success\">Chyba! Špatná mailová adresa.</div>";

   }

Krom toho by bylo dobré ověřovat alespoň, zda některá (nutná) pole formuláře nejsou odesílaná prázdná. Je možná i kontrola řetězců, ale to už bude chtít regulární výrazy a ty si nech na později.

Jako zprávu raději textareu než input.

Velice mrzuté je, že při neúspěšném odeslání se vymaže celý formulář, do value inputů bys tedy měl načítat odesílané informace, aby ve formuláři zůstaly pro opravu chybně zadaných údajů, při úspěšném odeslání je vyresetovat.

Na Captchu se vykašli, časem si nech třeba generovat náhodné číslo, které ať uživatel přepíše slovem...

Ještě bych se zamyslel, pokud podstatnou část bude tvořit PHP, zda kód nepsat přímo v PHP (index.php místo index.html) a veškeré textové výstupy neukládat do proměnných a ty pak společně s html kostrou stránky nevypisovat v jediném echo. Umožnilo by to lépe formátovat výstupy.
« Poslední změna: 15. Březen 2017 - 15:30:38 od Skogen »

Offline ピンクセイコ

  • Veterán
  • *****
  • なんかちがう...
Re:Pomoc s webovými stránkami
« Odpověď #51 kdy: 15. Březen 2017 - 21:13:59 »
hmm.. ok.. ^_^ zkusím to tedy nějak "vylepšit".. děkuji za rady..

Offline FaraonX

  • Starý kořen
  • ****
  • なんくるないさ
Re:Pomoc s webovými stránkami
« Odpověď #52 kdy: 15. Březen 2017 - 21:50:48 »
...
Nezapomínat na fóru vkládat kusy kódů do code boxu!

...tak se jdu jen zeptat, jestli tam není něco vyloženě prasáckého, nebo jestli to takhle můžu nechat..

Co je prasácký je trochu relativní. Je to závislý na velikosti aplikace a úrovni programátora.

Ale rozhodně jsi udělal jednu velkou zásadní chybu. Věříš uživateli(návštěvníkovi stránky), a to je ta největší chyba kterou můžeš udělat! Tomu rozhodně nikdy nevěř a všechen vstup od něj escapuj. (třeba s pomocí htmlspecialchars)

Zpět k samotnému kódu.

Jak psal Skogen:
  • Mělo by být "FROM" a ne "OD"
  • Chybí "Content-Type" pro mail
  • Chybí znovu načtení údajů do formuláře při špatném odeslání
  • Asi by bylo žádoucí udělat nějakou validaci, minimálně na straně PHP po odeslání.

A rovněž souhlasím i s postem 8B3CE273. Asi by to chtělo nějakou dynamickou captchu.

Mé výtky:
  • Nemáš ochranu proti vícenásobnému odeslání formuláře.
  • Nemáš zkontrolováno, zda byl e-mail opravdu odeslán

A ještě drobná výtka na tu tvou podmínku:
Kód: [Vybrat]
if($spam == "47")

Nikdy tam necpi nějakou magickou frázi, číslo atd, které je samo osobě nic neříkající. Když tak si to nervy do slušně pojmenované proměnné, aby až to po čase budeš číst si pochopil, co jsi tím vlastně myslel:

Kód: [Vybrat]
$correctSpamAnswer = "47";

($spam == $correctSpamAnswer)

A pak taky není na škodu hodit popisek položky k vyplnění do label-u, který na něj bude odkazovat, když na něj někdo klikne.

To co jsem vytkl já (až na chybějící vylidaci) by dosazený asi vypadalo takhle:

Kód: [Vybrat]
<?php 
    $FLASH_MESSAGE 
'FLASH_MESSAGE'// melo by to byt jako konstanta, ale takhle to taky pujde. Kdybys nahodou chtel pak prepsat nazev, 
//tak to nemusis delat na 3 misech, ale jen zde. Takze tohle nicim nepresisovat. :-)
    
$correctSpamAnswer "47";

    
$to "email@example.com"// prijemce
    
$from = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : ""// odesilatel
    
$jmeno = isset($_POST['jmeno']) ? htmlspecialchars($_POST['jmeno']) : ""
    
// Zapis je v prekladu tohle: if(isset($_POST['jmeno'])) {$jmeno = htmlspecialchars($_POST['jmeno']); } else { $jmeno = ""}
    // rika se tomu ternarni operator, a pouziva se jen na banalni podminky. Zde to je pro kratsi zapis.
    
$adresa = isset($_POST['adresa']) ? htmlspecialchars($_POST['adresa']) : ""
    
$mem_no = isset($_POST['mem_no']) ? htmlspecialchars($_POST['mem_no']) : "";
    
$spam $_POST['spam'];
    
$subject "Formulář Název webu";
    
$subject2 "Kopie Vaší zprávy";
    
$zprava = isset($_POST['zprava']) ? htmlspecialchars($_POST['zprava']) : "";
    
    
$message $jmeno "\n\n" $adresa "\n\n" $mem_no "\n\n" $zprava;
    
$message2 "Zde je kopie Vaší zprávy odeslané z formuláře na http://www.domena.cz/" "\n\n" $jmeno "\n\n" $adresa "\n\n" $mem_no "\n\n" $zprava;

    
$headers "FROM:" $from;
    
$headers2 "FROM:" $to;
    
$resultMessage '';
    
    if(isset(
$_SESSION[$FLASH_MESSAGE])) {
        
$resultMessage $_SESSION[$FLASH_MESSAGE];
        unset(
$_SESSION[$FLASH_MESSAGE]); // Odstranime flash zpravu ze session, protoze uz svuj ucel splinala.
    


  if(isset(
$_POST['submit']))   
{
    
if($spam == $correctSpamAnswer)
    
{        
          
$sendMailStatusSeller =  mail($to,$subject,$message,$headers);
         
          if (
$sendMailStatusSeller) { // Je dulezity aby vedel ze to dosli minimalne tobe a budes se tomu venovat
              
mail($from,$subject2,$message2,$headers2); // Kopii odesilatele posunu sem do dalsiho kroku, kdyby se to neodeslalo jen tobe. Pak mi byl zmatenej co to pise web, kdyz jemu prisla informace v poradku.
              // Nacpeme si odpoved do sessiony a refreshneme stranky, aby nikdo nemohl formular odeslat vicekrat
              
$_SESSION[$FLASH_MESSAGE] = "Email odeslán, brzy Vás kontaktujeme";
              
header('Location: http://www.example.com/');
              exit;
          } else {
              
$resultMessage "Chyba při odeslání! Zkuste to prosím znovu nebo později.";  
          }    

    
} else {
              
$resultMessage "Špatně vyplněná Captcha";         
  
  } 
}
  
  if(!empty(
$resultMessage)) {
      echo 
'<div class="form_success">' $resultMessage '</div>';
  }
?>


<div class="par_form">   
<form action="" method="post">
    <div class="form_name"> <label for="jmeno">Jméno a příjmení:</label> <input type="text" name="jmeno" value="<?php echo $jmeno?>" size="20"></div>
    <div class="form_email"><label for="email"></label>Email:</label> <input type="text" name="email" value="<?php echo $from?>" size="20"></div>
    <div class="form_mem_no"><label for="mem_no">Členské číslo:</label> <input type="text" name="mem_no" value="<?php echo $mem_no?>" size="20"></div>
    <div class="form_address"><label for="adresa">Adresa:</label> <input type="text" name="adresa" value="<?php echo $adresa?>" size="60"></div>
    <div class="form_message"><label for="zprava">Zpráva:</label> <input type="text" name="zprava" value="<?php echo $zprava?>" size="60"></div>
    <div class="form_spam"><label for="spam">Počet prefektur Japonska:</label> <input type="text" name="spam" size="2"></div>
    <div class="form_button"><input type="submit" name="submit" value="Odeslat"></div>
</form>

Nezkoušel jsem to, a sepsal v rychlosti, ale snad to žádný error nehodí. A snad to trochu pomůže. Snažil jsem se to napsat tak, abys nemusel vstřebat moc nových věcí. ;-) Takže nějaké rozhození do  objektů a pod. jsem naprosto vypustil.

Offline ピンクセイコ

  • Veterán
  • *****
  • なんかちがう...
Re:Pomoc s webovými stránkami
« Odpověď #53 kdy: 15. Březen 2017 - 22:31:08 »
díky za rady, pokusím se s tím něco dělat.. každopádně tady aspoň vidíte, že tomu fakt nerozumím.. ^^;

vím že tam je dost problémů, mj ta chybějící validace zadaných údajů.. ale v podstatě mi stačí, když mi přijde funkční emailová adresa, a v případě nějakých dalších chyb se můžu zeptat, o co šlo..

Offline Skogen

  • Veterán
  • *****
  • Cynický objektivista
Re:Pomoc s webovými stránkami
« Odpověď #54 kdy: 16. Březen 2017 - 04:55:41 »
Faraon si s tím dal práci a má ve všem pravdu, ale je to maximalista (bez urážky, Farao  ;) ), ty si pro své potřeby vystačíš i s tím, co bude z jeho pohledu dejme tomu za 3 mínus.  Když to bude za 2, uspokojíš menší zákazníky a za 1 budeš vyhrávat konkurzy   ;D

Mám jen jednu poznámku, že když to uděláš přesně takhle, dostane uživatel v případě neodeslání mailu zpátky do formuláře speciální znaky převedené na entity a bude na to koukat jako jelen, takže do formuláře bych vracel čistý POST neošetřený htmlspecialchars.

Většinu potřebného najdeš tady: https://www.jakpsatweb.cz/ , zejména  v diskuzi, a tady: http://jecas.cz/ . Jsou to weby specializované na tuto problematiku a pomocí hledání (nemají rádi, když se na fóru hned ptáš) vždy najdeš něco, od čeho se odrazit, protože skoro všechno už se někdy řešilo.

Faraonův kód použij a pak si zkus bokem postupně rozvinout ten svůj vlastní, s tím, že budeš postupně funkcionality přidávat.
« Poslední změna: 16. Březen 2017 - 05:14:41 od Skogen »

Offline ピンクセイコ

  • Veterán
  • *****
  • なんかちがう...
Re:Pomoc s webovými stránkami
« Odpověď #55 kdy: 16. Březen 2017 - 06:38:41 »
..a pak si zkus bokem postupně rozvinout ten svůj vlastní..
nj.. já ho vždycky zkouším nějak rozvíjet, až to celé přestane fungovat.. ^_^; (vsadil bych se, že jsem tam předtím někde smazal závorku)

jako přemýšlel jsem o tom spamu.. nevím, jak moc jsou ti spamboti vlastně dobří.. jestli to, co tam je teď, bez problému překonají.. snadno by tam šlo dát třeba den z aktuálního data, takže by se odpověď každý den sama měnila.. jen tedy nevím, jaký by to mělo efekt.. pak ta validace mailu je důležitá.. plus to zapsání hodnot do formuláře při chybě odeslání.. (že po dvojkliku do políčka vyjede seznam předtím zadaných hodnot, to je asi featura konkrétního prohlížeče, předpokládám..)



Offline Skogen

  • Veterán
  • *****
  • Cynický objektivista
Re:Pomoc s webovými stránkami
« Odpověď #56 kdy: 16. Březen 2017 - 11:25:00 »
Předpokládám, že to ladíš přímo na serveru. Nejdřív tedy otestuj funkčnost skriptu bez fcí mail, postačí, když se ti bude vypisovat hláška o úspěšném odeslání. Nebudeš tak zatěžovat mailserver a čekat na maily ve schránce. U Faraonova skriptu bys musel dočasně odstranit konstrukci, která ověřuje odeslání. Měň skript po krocích a sleduj, zda dělá, co má. Fci mail samotnou otestuj až nakonec.

Určitě hlavičku FROM uprav i s tím
Kód: [Vybrat]
". \r\n"; na konci. I když to vypadá divně, je to podle specifikace a některé mailservery jsou na to háklivé.

Někteří spamboti už umí přečíst i captchu, takže je mnohdy tak zprzněná, že už ji pořádně nepřečte ani lidský uživatel, proto captchu nemám rád. S tím dnem to není špatné, problém by mohl nastat, pokud by uživatel vepsal datum vteřinu a dříve před půlnocí a odeslal formulář vteřinu a déle po půlnoci. Pak by shoda nenastala a asi by ho to zmátlo.

Něco je popsáno zde: http://jecas.cz/spam

Když se důsledně validuje více odesílaných políček formuláře, třeba jméno, ID, ale lze i tu adresu, nemusí být antispam ani potřeba. Boti se v naprosté většině případů snaží nacpat do inputů webové a mailové adresy plus nějaké fráze a ty dobrou validací neprojdou.

Jo, našeptávání dříve zadaných hodnot do inputů je dílo cache prohlížeče, když mu to uživatel umožní, t.j. nezakáže a nevymaže. Ale to je něco jiného, než je potřeba. Tady je třeba jen to, aby když odeslání skončí neúspěchem, se do value inputu přeneslo, co z něj bylo naposledy odesláno. A to je v proměnné $_POST['nazev-inputu']. Uživatel si opraví, co potřebuje a odešle to znova, protože políčko odesílá vždy svůj obsah (nyní upravený) a ten ty přes POST překlápíš do value. Když to skončí úspěchem, header("location: adresastranky.php") formulář zresetuje a všechny proměnné se zapomenou, respektive se načtou výchozí hodnoty. Políčka tedy budou prázdná (krom výchozího zavináče v poli pro mail) a nedojde k opětovnému odeslání, ani když uživatel refreshne stránku. Tvůj skript si i po odeslání hodnoty pamatuje, a kdyby uživatel znovunačetl stránku, odešel by mail podruhé atd...

Jinak bych fakt doporučoval začlenit html kód přímo do php souboru, pak bys pouze escapoval uvozovky (případně apostrofy) a mohl do html vkládat přímo proměnné.

Konec Faraonova skriptu by tedy vypadal takto:

Kód: [Vybrat]
...

if(!empty($resultMessage)) {
      echo '<div class="form_success">' . $resultMessage . '</div>';
  }


echo "
<!-- Tady by byl DOCTYPE -->

<head>
<!-- html hlavička se vším, co do ní patří -->
</head>

<body>

<!-- Nadpis, další text, atd... -->

<div class=\"par_form\">   
<form action=\"\" method=\"post\">
    <div class=\"form_name\"> <label for=\"jmeno\">Jméno a příjmení:</label> <input type=\"text\" name=\"jmeno\" value=\"".$jmeno."\" size=\"20\"></div>
    <div class=\"form_email\"><label for=\"email\"></label>Email:</label> <input type=\"text\" name=\"email\" value=\"".$from."\" size=\"20\"></div>
    <div class=\"form_mem_no\"><label for=\"mem_no\">Členské číslo:</label> <input type=\"text\" name=\"mem_no\" value=\"".$mem_no."\" size=\"20\"></div>
    <div class=\"form_address\"><label for=\"adresa\">Adresa:</label> <input type=\"text\" name=\"adresa\" value=\"".$adresa."\" size=\"60\"></div>
    <div class=\"form_message\"><label for=\"zprava\">Zpráva:</label> <input type=\"text\" name=\"zprava\" value=\"".$zprava."\" size=\"60\"></div>
    <div class=\"form_spam\"><label for=\"spam\">Počet prefektur Japonska:</label> <input type=\"text\" name=\"spam\" size=\"2\"></div>
    <div class=\"form_button\"><input type=\"submit\" name=\"submit\" value=\"Odeslat\"></div>
</form>


<!-- Patička nebo bůhvícoještě -->

</body>
";

?>

... a samozřejmě by to mělo příponu .php místo .html. Veškerá echa by bylo možné nahradit proměnnými a proměnné pak vypisovat, kde by bylo třeba takto:

Kód: [Vybrat]
echo "
Nějaký nekonečně dlouhý text, který má sto dvacet pět a půl slova ".$tadyVypisuPromennou." a pokaračuju dál textem, abych ".$vypsalDruhou.$aTreti.$aCtvrtou." proměnnou v jediném echu, což je hospodárnější...
";

Offline ピンクセイコ

  • Veterán
  • *****
  • なんかちがう...
Re:Pomoc s webovými stránkami
« Odpověď #57 kdy: 16. Březen 2017 - 13:08:16 »
Předpokládám, že to ladíš přímo na serveru. Nejdřív tedy otestuj funkčnost skriptu bez fcí mail, postačí, když se ti bude vypisovat hláška o úspěšném odeslání. Nebudeš tak zatěžovat mailserver a čekat na maily ve schránce..
předpokládáš správně.. ^_^

každopádně jsem si s tím zkoušel nějak hrát, a prostě se v tom neorientuju, takže jsem zatím nějak došel k téhle fungující kombinaci:
(mělo by to validovat email a kontrolovat spam, a případně upozornit na nevyplněné jméno a zprávu. bez adresy a čísla se obejdu. takže ještě dodělat hlavičku mailu, ale to zkusím zítra (předpokládám, že proto mi gmail píše, že ten mail nemusel odeslat uvedený odesilatel) a pokud vyjde tohle, tak zkusím udělat něco s tím uchováním hodnot v políčkách)

Kód: [Vybrat]
<?php 
    $correctSpamAnswer 
"47";
    
$to "email@example.com"// prijemce
    
$from = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : ""// odesilatel
    
$jmeno = isset($_POST['jmeno']) ? htmlspecialchars($_POST['jmeno']) : ""
    
$adresa = isset($_POST['adresa']) ? htmlspecialchars($_POST['adresa']) : ""
    
$mem_no = isset($_POST['mem_no']) ? htmlspecialchars($_POST['mem_no']) : "";
    
$spam $_POST['spam'];
    
$subject "Formulář Název webu";
    
$subject2 "Kopie Vaší zprávy";
    
$message $jmeno "\n\n" $adresa "\n\n" $mem_no "\n\n" $_POST['zprava'];
    
$message2 "Zde je kopie Vaší zprávy odeslané z formuláře na http://www.domena.cz/" "\n\n" $jmeno "\n\n" $adresa "\n\n" $mem_no "\n\n" $_POST['zprava'];
    
$zprava = isset($_POST['zprava']) ? htmlspecialchars($_POST['zprava']) : "";
    
$headers "Od:" $from;
    
$headers2 "Od:" $to;
    
$resultMessage '';

if(isset(
$_POST['submit']))

if((
$spam == $correctSpamAnswer) and filter_var($fromFILTER_VALIDATE_EMAIL))
{
if($jmeno!="" and $zprava!="")
{
mail($to,$subject,$message,$headers);
mail($from,$subject2,$message2,$headers2); // kopie odesilateli
$resultMessage "Email odeslán, brzy Vás kontaktujeme";
}
else
{
$resultMessage "Chyba! Nevyplněné jméno nebo zpráva."
}
}
else
{
$resultMessage "Chyba! Špatně vyplněná Captcha nebo email."
}

if(!empty(
$resultMessage)) 
{
echo '<div class="form_success">' $resultMessage '</div>';

?>

vůbec totiž netuším, co se tam dělo, ale psalo mi to nějakou chybu na řádku, kde už byl html kód toho formuláře, tak jsem postupně zkoušel zakomentovávat různé části, ale nepřišel jsem na to.. tak jsem prozatím z vašich rad sestavil ten kód výše, aby to bylo aspoň trochu vylepšené..

taky header() momentálně asi nemůžu použít k té ochraně proti dvojitému odeslání, protože mi to částečně rozbije web.. (nenačte se všechno, co by mělo) možná to bude chtít opravdu přepsat na normální linky, a neměnit obsah webu v závislosti na obsahu session..
« Poslední změna: 16. Březen 2017 - 14:10:14 od 赤い戦車 »

Offline Skogen

  • Veterán
  • *****
  • Cynický objektivista
Re:Pomoc s webovými stránkami
« Odpověď #58 kdy: 16. Březen 2017 - 20:02:21 »
Chce to všímat si těch chybových hlášek a když tak je překopírovat, bez toho, anebo bez uvedení kódu, nelze říct, co je špatně, pouze tipovat.

Faraonův skript funguje. Když ho upravím tak, jak bych ho použil já, tedy přímo s html kódem v souboru s příponou PHP, bude to takto:

Kód: [Vybrat]
<?php 
session_start
();
    
$FLASH_MESSAGE 'FLASH_MESSAGE'// melo by to byt jako konstanta, ale takhle to taky pujde. Kdybys nahodou chtel pak prepsat nazev, 
//tak to nemusis delat na 3 misech, ale jen zde. Takze tohle nicim nepresisovat. :-)
    
$correctSpamAnswer "47";

    
$to "email@example.com"// prijemce
    
$from = isset($_POST['email']) ? htmlspecialchars(trim($_POST['email'])) : ""// odesilatel
    
$jmeno = isset($_POST['jmeno']) ? htmlspecialchars(trim($_POST['jmeno'])) : ""
    
// Zapis je v prekladu tohle: if(isset($_POST['jmeno'])) {$jmeno = htmlspecialchars($_POST['jmeno']); } else { $jmeno = ""}
    // rika se tomu ternarni operator, a pouziva se jen na banalni podminky. Zde to je pro kratsi zapis.
    
$adresa = isset($_POST['adresa']) ? htmlspecialchars(trim($_POST['adresa'])) : ""
    
$mem_no = isset($_POST['mem_no']) ? htmlspecialchars(trim($_POST['mem_no'])) : "";
    
$spam $_POST['spam'];
    
$subject "Formulář Název webu";
    
$subject2 "Kopie Vaší zprávy";
    
$zprava = isset($_POST['zprava']) ? htmlspecialchars(trim($_POST['zprava'])) : "";
    
    
$message $jmeno "<br/><br/>" $adresa "<br/><br/>" $mem_no "<br/><br/>" $zprava;
    
$message2 "Zde je kopie Vaší zprávy odeslané z formuláře na http://www.domena.cz/" "<br/><br/>" $jmeno "<br/><br/>" $adresa "<br/><br/>" $mem_no "<br/><br/>" $zprava;

$headers 'MIME-Version: 1.0' "\r\n";
$headers .= 'Content-Type: text/html; charset=utf-8' "\r\n";
$headers .= 'From: '.$from"\r\n";
$headers2 'MIME-Version: 1.0' "\r\n";
$headers2 .= 'Content-Type: text/html; charset=utf-8' "\r\n";
$headers2 .= 'From: '.$to"\r\n";

$reportSend "";
$resultMessage "";
$report "";
    
    if(isset(
$_SESSION[$FLASH_MESSAGE])) {
        
$reportSuccess $_SESSION[$FLASH_MESSAGE];
        unset(
$_SESSION[$FLASH_MESSAGE]); // Odstranime flash zpravu ze session, protoze uz svuj ucel splinala.
    


  if(isset(
$_POST['submit']))   
{
    
if($spam == $correctSpamAnswer and $jmeno != "" and $zprava != "" and filter_var($fromFILTER_VALIDATE_EMAIL))
    
{        
          
$sendMailStatusSeller =  mail($to,$subject,$message,$headers);
         
          if (
$sendMailStatusSeller) { // Je dulezity aby vedel ze to dosli minimalne tobe a budes se tomu venovat
              
mail($from,$subject2,$message2,$headers2); // Kopii odesilatele posunu sem do dalsiho kroku, kdyby se to neodeslalo jen tobe. Pak mi byl zmatenej co to pise web, kdyz jemu prisla informace v poradku.
              // Nacpeme si odpoved do sessiony a refreshneme stranky, aby nikdo nemohl formular odeslat vicekrat
              
$_SESSION[$FLASH_MESSAGE] = "<li>Email odeslán, brzy Vás kontaktujeme</li>";
              
header('Location: http://www.example.com/');
              exit;
          } else {
              
$reportSend "<li>Chyba při odeslání! Zkuste to prosím znovu nebo později.</li>";  
          }    

    
}
 if ($jmeno == ""$reportName "<li>Jméno musí být vyplněno</li>";
 else $reportName "";
 if ($zprava == ""$reportText "<li>Zpráva musí být vyplněna</li>";
 else $reportText "";
 if (!filter_var($fromFILTER_VALIDATE_EMAIL)) $reportEmail "<li>Neplatná emailová adresa</li>";
 else $reportEmail "";
         if (
$spam != $correctSpamAnswer$reportSpam "<li>Špatně vyplněný antispam</li>"
 else $reportSpam ""
}

$resultMessage $reportSuccess.$reportSend.$reportName.$reportEmail.$reportText.$reportSpam;
  
  if(!empty(
$resultMessage)) {
      
$report '<ul class="form_success">' $resultMessage '</ul>';
  }
  
  
echo 
"
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">


<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />
<title></title>
<link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\" />
<meta name=\"description\" content=\"\" />
<meta name=\"keywords\" content=\"\" />
<link rel=\"shortcut icon\" href=\"favicon.ico\" />
</head>


<body>
<h2>Webový formulář</h2>

<div class=\"par_form\">   
<form action=\"\" method=\"post\">
    <div class=\"form_name\"> <label for=\"jmeno\">Jméno a příjmení:</label> <input type=\"text\" name=\"jmeno\" value=\""
.$jmeno."\" size=\"20\"></div>
    <div class=\"form_email\"><label for=\"email\"></label>Email:</label> <input type=\"text\" name=\"email\" value=\""
.$from."\" size=\"20\"></div>
    <div class=\"form_mem_no\"><label for=\"mem_no\">Členské číslo:</label> <input type=\"text\" name=\"mem_no\" value=\""
.$mem_no."\" size=\"20\"></div>
    <div class=\"form_address\"><label for=\"adresa\">Adresa:</label> <input type=\"text\" name=\"adresa\" value=\""
.$adresa."\" size=\"60\"></div>
    <div class=\"form_message\"><label for=\"zprava\">Zpráva:</label> <textarea name=\"zprava\" rows=\"5\" cols=\"60\" >"
.$zprava."</textarea></div>
    <div class=\"form_spam\"><label for=\"spam\">Počet prefektur Japonska:</label> <input type=\"text\" name=\"spam\" size=\"2\"></div>
    <div class=\"form_button\"><input type=\"submit\" name=\"submit\" value=\"Odeslat\"></div>
</form>

"
.$report."

</body>
</html>
"
;
  
  
?>


Je to kompletně celý soubor, který se bude nějak jmenovat, třeba kontakt.php. Doplněno o nějakou tu validaci a výpis seznamu chybně zadaných údajů.

Pozor na triviální chyby při použití šablony:

  • $to - doplň svůj email
  • header("location: http://www.example.com/") - doplň URL své stránky s formulářem, kde bude tento skript - na ni header přesměrovává a zde se ti zpracuje session se zprávou o úspěšném odeslání mailu

Na začátku skriptu jsem startoval session, nevím, jak to máš nastaveno, jestli ti to vyplivne hlášku, že session už nastartovaná je, session_start() smaž.

EDIT: Zapomněl jsem změnit odřádkování ve zprávě z \n na <br/>, jedná se o html formát - opraveno.
« Poslední změna: 16. Březen 2017 - 20:39:12 od Skogen »

Offline FaraonX

  • Starý kořen
  • ****
  • なんくるないさ
Re:Pomoc s webovými stránkami
« Odpověď #59 kdy: 16. Březen 2017 - 20:45:50 »
Jinak bych fakt doporučoval začlenit html kód přímo do php souboru, pak bys pouze escapoval uvozovky (případně apostrofy) a mohl do html vkládat přímo proměnné.
Jinak jak to má ničemu nevadí. Naopak je lepší to jak to má teď. Mrkni třeba jak se generují stránky se šablonou Twig, nebo podobnými.

Mimo to, tolik řádků do echa necpi. Sice to jde, ale je to hůř čitelné, a nic moc se s tím nepracuje. Když už jsi vážně donucen, tak spíš zkus použít heredoc.

... do formuláře bych vracel čistý POST neošetřený htmlspecialchars.
To je pravda.

užít k té ochraně proti dvojitému odeslání, protože mi to částečně rozbije web.. (nenačte se všechno, co by mělo) možná to bude chtít opravdu přepsat na normální linky, a neměnit obsah webu v závislosti na obsahu session...
To je ta tvá session magie na generovaní URL. Tady krásně vidíš, jeden z příkladů proč bys to tam cpát neměl. ;-)

A v podmínce ti zmizeli složený závorky:
Kód: [Vybrat]
if(isset($_POST['submit']))
Kód: [Vybrat]

if ($jmeno == "") $reportName = "<li>Jméno musí být vyplněno</li>";
else $reportName = "";
if ($zprava == "") $reportText = "<li>Zpráva musí být vyplněna</li>";
else $reportText = "";
if (!filter_var($from, FILTER_VALIDATE_EMAIL)) $reportEmail = "<li>Neplatná emailová adresa</li>";
else $reportEmail = "";

$resultMessage = $reportSuccess.$reportSend.$reportName.$reportEmail.$reportText.$reportSpam;
Tenhle zápis If podmínek bez složených závorek bych nedoporučoval. Je dobrá praxe vždy závorkovat. Sice ti tenhle zápis ušetří od oka 2-3 řádky, ale je dost často zdrojem chyb, když pak někdo za to chce něco dopsat navíc, tak tuhle věc dost lidí přehlídne, a pokud tam nemáš nějakou závislost co by hodilo chybu, tak s tím můžeš dost dlouho fungovat, aniž bys o problému věděl.

A tu resultMessage řetěz hned, jak můžeš. Zde není důvod proč s tím otálet až na konec. Kód to zkrátí a hlavně neriskuješ, že bys nějakou proměnou na závěr zapomněl přicucnout.
Kód: [Vybrat]

if ($jmeno == "") {
                    $resultMessage.= "<li>Jméno musí být vyplněno</li>";
                 }

if ($zprava == "") {
                    $resultMessage.= "<li>Zpráva musí být vyplněna</li>";
                 }

if (!filter_var($from, FILTER_VALIDATE_EMAIL)) {
                    $resultMessage.= "<li>Neplatná emailová adresa</li>";
                 }