Problém s formulářem v PHP

Tom Liberec

Problém s formulářem v PHP
« kdy: 01. 09. 2013, 21:54:33 »
Jedno s toho je učebnicový kód s linuxsoft.cz

Druhé je kód Serg.Borubina koding.cz , pokud to však zkouším rozchodit v XAMPP nechodí to. Zřejmě pomíjím něco zcela základního, někteří si povzdechnou, že opět.

Takže budu vděčen i za kopanec. Pokud budete za vyřešení mojí neschopnosti nějako odměnu ozvěte se na tpilar@atlas.cz, případně i zítra dopoledne.

Ještě popíši jaký mi to "generuje" , zobrazuje výsledek.  form2.php 

Notice: Undefined index: go in C:\xampp\htdocs\_____mail\form2.php on line 11

Notice: Undefined variable: _print in C:\xampp\htdocs\_____mail\form2.php on line 64

Kromě toho se tagy a text : 

Notice:  Undefined variable: email in C:\xampp\htdocs\_____mail\form2.php on line 76



<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<?
  function JeEmail ($cislo)
  {
    return ereg("^.+@.+\..+$",$cislo);
  }
  $BudemeZobrazovat=true;
  if (!empty($_POST)) // tak už se odesílalo a musíme kontolovat
  {
    if (!JeEmail($_POST["email"]))
    {
      // kontrolou jsme neprošli
      echo "Tohle nevypadá jako e-mail!";
    }
    else
    {
      // kontolou jsme prošli
      $BudemeZobrazovat=false;
      echo "Zpracovávám ". $_POST["email"];
    }
  }
if ($BudemeZobrazovat):?>
  <form method="post" action="26_complex.php">
    E-mail: <input name="email" value="<?echo $_POST["email"]?>">
      <input type="Submit" name="odesli">
  </form>
<?endif;?>

-------------------------- případ neschopnosti dva ----------------------

<?php
function checkmail($mail){
$mail = trim($mail);

if(!preg_match("/^[a-z0-9_-]{1,20}+(\.){0,20}+([a-z0-9_-]){0,20}@(([a-z0-9-]+\.)+(com|net|org|mil|".
"edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-".
"9]{1,3}\.[0-9]{1,3})$/is",$mail))
return 0;
return $mail;
}
if(isset($_POST['go']) || ($_POST['go'] == 'Odeslat'))
{
$_ERR='';
$_print='';     
$name = htmlspecialchars(strip_tags(trim($_POST['jmeno'])));
$prijmeni = htmlspecialchars(strip_tags(trim($_POST['prijmeni'])));
$email = htmlspecialchars(strip_tags($_POST['email']));
$pass = htmlspecialchars(strip_tags(trim($_POST['pass'])));
$text = htmlspecialchars(strip_tags(trim($_POST['text'])));
      if(!isset($name) OR $name == '')
      {
        $_ERR.='<span style="color:red">Chyba:&nbsp;Nezadal jste jméno!</span>';   
      }
      elseif(!isset($prijmeni) OR $prijmeni == '')
      {
        $_ERR.='<span style="color:red">Chyba:&nbsp;Nezadal jste příjmeni!</span>';
      }
      elseif(checkmail($email) === 0)
      {
        $_ERR.='<span style="color:red">Chyba:&nbsp;Nezadal jste email nebo byl zadán špatně!</span>';
      }
      elseif(!isset($pass) OR $pass == '')
      {
        $_ERR.='<span style="color:red">Chyba:&nbsp;Zadejte heslo!</span>';
      }
      elseif(empty($text))
      {
        $_ERR.='<span style="color:red">Chyba:&nbsp;Napište zpravu!</span>';
      }
 /*------NOVE----------*/     
      if($_ERR != '')
      {
        $_print = $_ERR;
      }
      else
      {
      echo'
      <script>
      alert("Data jsou odeslána")
      </script>
      ';
      }
 /*-------KONEC--------*/     
}
?>
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title></title>
  </head>
  <body>
<?php
echo $_print;
?>
<form action="" method="POST">
   <table style="250px; border:3px solid black;">
    <tr><td style="width:100px;">Jméno:</td>
        <td style="width:150px;"> <input type="text" 
name="jmeno" value="<?php echo $name;?>"></td></tr>
      <tr><td style="width:100px;">Príjmení:</td>
        <td style="width:150px;"> <input type="text" 
name="prijmeni" value="<?php echo $prijmeni;?>"></td></tr>
        <tr><td style="width:100px;">E-mail:</td>
        <td style="width:150px;"> <input type="text" 
name="email" value="<?php echo $email;?>"></td></tr>
      <tr><td style="width:100px;">heslo:</td>
        <td style="width:150px;"> <input type="password" 
name="pass"></td></tr>               
      <tr><td style="width:100px;">Zprava:</td>
        <td style="width:150px;"><textarea rows="5" cols="25" wrap="soft" 
name="text"><?php echo $text;?></textarea></td></tr>
      <tr><td colspan="2" style="width:250px; text-align:right;">
<input type="submit" name="go" value="Odeslat"></td></tr>
      </table>
    </form>
  </body>
</html>                   

Předem díky. 
« Poslední změna: 03. 09. 2013, 14:58:48 od Roman Bořánek »


Tom Liberec

Re:Něco opomíjím. Nějaká základní neznalost.
« Odpověď #1 kdy: 01. 09. 2013, 22:00:48 »
Mohl bych to rovnou zadat jako úkol validace odesílání e-mailu s formuláře, ovšem při tom jak dopadám s učebnicovým příkladem by to mohlo dopadnout tak, že bych měl od někoho z Vás použitelné řešení, které bych stejně nebyl schopen rozchodit.

Proto spíž žádám to nakopnutí, klidně i takto "nad stolem", neboť očekávám nějaké své základní nepochopení, či chybu žáka páté třídy, ovšem takového co na to programování vždy měl.

PCnity

  • *****
  • 680
    • Zobrazit profil
    • E-mail
Re:Něco opomíjím. Nějaká základní neznalost.
« Odpověď #2 kdy: 01. 09. 2013, 22:36:41 »
V com je problem s tym druhym prikladom? Ze hadze tie notice o nedefinovanych premennych?
Daj hned pod <?php riadok: error_reporting(E_ALL ^ E_NOTICE);

<?php
error_reporting(E_ALL ^ E_NOTICE);

function checkmail($mail){
$mail = trim($mail);
...

někdo

Re:Něco opomíjím. Nějaká základní neznalost.
« Odpověď #3 kdy: 01. 09. 2013, 22:40:32 »
Co napsat a neurazit?

Nic neříkající název tématu a nesrozumitelný popis problému. Co nefunguje, jak by to mělo fungovat a jak se to projevuje, že to nefunguje? Proč dva různé kusy kódu s podobnou funkcionalitou, má to nějaký význam kromě zmatení nepřítele?

Další věc je, proč takhle lepíte kód z návodů na internetu a nepoužijete nějaký framework, ale to je asi nad rámec tohoto topicu.

DK

Re:Něco opomíjím. Nějaká základní neznalost.
« Odpověď #4 kdy: 01. 09. 2013, 22:48:32 »
Kód: [Vybrat]
if(isset($_POST['go']) || ($_POST['go'] == 'Odeslat'))prepsat na
Kód: [Vybrat]
if(isset($_POST['go']) && ($_POST['go'] == 'Odeslat'))
to je prvni notice... druhy je ten, ze tam nekorektne pracuje s promennou $_print (chybi pred tim if(isset...), nicmene celkove je to takovy hovnokod... misto elseifu by mely byt normalni ify, davat tam alert je blbost, email je lepsi testovat pres filter_var (http://php.net/manual/en/function.filter-var.php) atd.


Tom Liberec

Re:Něco opomíjím. Nějaká základní neznalost.
« Odpověď #5 kdy: 01. 09. 2013, 23:08:23 »
Neumím a neznám framevorky a jejich používání.
Docela mne fackuji i učebnicove příklady.  Proto ten druhý příklad.

Otázka tedy je. Proc mi nefunguje učebnicovy příklad s www.koding.cz ?

Tam mu to funguje dobře.  Za praktickou radu kde je možná chyba PCnity diky vyzkouším.
Potrebuji validovat e-mail tak aby mi nezmizely z již vyplněného formuláře a lidi se na odeslání mailu raději uplne nevykaslali.
Proto že jsem PHP začátečník packal, libilo se mi celý řešeni Borubina s koding.cz  ovšem zdrojak co on tam má mi nefunguje ani v XAMPPu.
To je soubor  form2 . Nejenom, že to vypisuje uvedene PHP chybove hlášky ale i vysledek zobrazovany prohlížečem je na nic.


Tom Liberec

Re:Něco opomíjím. Nějaká základní neznalost.
« Odpověď #6 kdy: 01. 09. 2013, 23:21:10 »
I když jsem tam změnil to co napsal DK hází to chybu : 
Notice: Undefined variable: _print in C:\xampp\htdocs\_____mail\form2.php on line 64

Jenomže pořád mi to zapisuje, dost možná ne zcela chápu jak funguje XAMPP, do formulářových polí tagy HTML.

 

Re:Něco opomíjím. Nějaká základní neznalost.
« Odpověď #7 kdy: 02. 09. 2013, 00:32:05 »
Omluva.

http://www.itcc.cz/mail/form2.php

Po opravě, kterou zde napsal DK to funguje jak má. Možná ještě budu dnes, tedy až se trochu vyspím, otravovat pokud si nabiji ústa s integrací do webu.

Ovšem to mne vede k otázce, proč to nejelo v XAMPP a na reálných stránkách ano. Musím zkontrolovat s čím vším, tedy zda si to ze stránek koding.cz něco nepůjčuje? ( Prověřím každopádně. )

Nebo mám nějakou velmi zásadní chybu v myšlení o XAMPP ?
Tedy v tom, jak jej používám, že jsem mu přisoudil nějakou vlastnost, kterou nemá která patří např.HTML, či zobrazení LOCALHOST není natolik totéž jako fungování na hostingu, jak já si to maluji ?
 

Re:Něco opomíjím. Nějaká základní neznalost.
« Odpověď #8 kdy: 02. 09. 2013, 09:58:33 »
Příliš daleko jsem se nedostal, nevím kam mám vepsat :

// $to - příjemce emailu
        $to = 'tpilar@atlas.cz,tomasvesec@seznam.cz';
        // $from - odesílatel
        $headers  = 'MIME-Version: 1.0' . "\r\n";
        $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
        $headers .= 'From: tpilar.cz<tpilar@atlas.cz>'. "\r\n";

Jediné co mi od minule došlo, je že na http://www.itcc.cz/mail/form2.php nemám zřejmě v administraci nastaveny e-maily.
Takže budu zkoušet na hostingu kde to nastaveno mám.
 

Re:Něco opomíjím. Nějaká základní neznalost.
« Odpověď #9 kdy: 02. 09. 2013, 10:02:35 »
Abych se zeptal konkrétně, pokouším se dostat to na správné místo, tj. před nebo za echo, kdy jsou splněny všechny podmínky ?

/*------NOVE----------*/     
      if($_ERR != '')
      {
        $_print = $_ERR;
      }
      else
      {
      echo'
      <script>
      alert("Data jsou odeslána")
      </script>
      ';
      }
 /*-------KONEC--------*/   

norwi-

Re:Něco opomíjím. Nějaká základní neznalost.
« Odpověď #10 kdy: 02. 09. 2013, 10:24:56 »
Nejsem zadny super coder, ale do oci mě prastilo par veci.

na radku 11 mas
Kód: [Vybrat]
if (!empty($_POST))muj zapis by byl
Kód: [Vybrat]
if (isset($_POST['email'])) { ..... } muj kod zjisti zda existuje POST['email'] pak vubec zacne neco delat

u tveho druheho erroru bych zapsal
Kód: [Vybrat]
$_print='';
if(!empty($_ERR)) {$_print=$_ERR; }
else {echo 'Data jsou odeslana';}
$_ERR je potreba nekde definovat tak ji hod na zacatek a dej
Kód: [Vybrat]
$_ERR='';Na rozdil od toho tveho mz nevyskoci hlaska, ale rovnou se vypise na strance

Re:Něco opomíjím. Nějaká základní neznalost.
« Odpověď #11 kdy: 02. 09. 2013, 11:21:25 »
Což o to, původně to mám takhle řešeno ovšem problém byl ( ještě na aktuálních stránkách pobočky je ) v tom, že pokud nesedí nějaký údaj, zejména mi jde o e-mail tak se smazal celý vyplněný formulář.

V podstatě nejsem schopný do tohoto, což funguje bez chyb ( i když souhlasím, že lepší je vypisování na stránku než do vyskakovacího okna ) :

<?php
function checkmail($mail){
$mail = trim($mail);

if(!preg_match("/^[a-z0-9_-]{1,20}+(\.){0,20}+([a-z0-9_-]){0,20}@(([a-z0-9-]+\.)+(com|net|org|mil|".
"edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-".
"9]{1,3}\.[0-9]{1,3})$/is",$mail))
return 0;
return $mail;
}
if(isset($_POST['go']) || ($_POST['go'] == 'Odeslat'))
{
$_ERR='';
$_print='';     
$name = htmlspecialchars(strip_tags(trim($_POST['jmeno'])));
$prijmeni = htmlspecialchars(strip_tags(trim($_POST['prijmeni'])));
$email = htmlspecialchars(strip_tags($_POST['email']));
$pass = htmlspecialchars(strip_tags(trim($_POST['pass'])));
$text = htmlspecialchars(strip_tags(trim($_POST['text'])));
      if(!isset($name) OR $name == '')
      {
        $_ERR.='<span style="color:red">Chyba:&nbsp;Nezadal jste jméno!</span>';   
      }
      elseif(!isset($prijmeni) OR $prijmeni == '')
      {
        $_ERR.='<span style="color:red">Chyba:&nbsp;Nezadal jste příjmeni!</span>';
      }
      elseif(checkmail($email) === 0)
      {
        $_ERR.='<span style="color:red">Chyba:&nbsp;Nezadal jste email nebo byl zadán špatně!</span>';
      }
      elseif(!isset($pass) OR $pass == '')
      {
        $_ERR.='<span style="color:red">Chyba:&nbsp;Zadejte heslo!</span>';
      }
      elseif(empty($text))
      {
        $_ERR.='<span style="color:red">Chyba:&nbsp;Napište zpravu!</span>';
      }
 /*------NOVE----------*/     
      if($_ERR != '')
      {
        $_print = $_ERR;
      }
      else
      {
      echo'
      <script>
      alert("Data jsou odeslána")
      </script>
      ';
      }
 /*-------KONEC--------*/     
}
?>
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title></title>
  </head>
  <body>
<?php
echo $_print;
?>
<form action="" method="POST">
   <table style="250px; border:3px solid black;">
    <tr><td style="width:100px;">Jméno:</td>
        <td style="width:150px;"> <input type="text" 
name="jmeno" value="<?php echo $name;?>"></td></tr>
      <tr><td style="width:100px;">Príjmení:</td>
        <td style="width:150px;"> <input type="text" 
name="prijmeni" value="<?php echo $prijmeni;?>"></td></tr>
        <tr><td style="width:100px;">E-mail:</td>
        <td style="width:150px;"> <input type="text" 
name="email" value="<?php echo $email;?>"></td></tr>
      <tr><td style="width:100px;">heslo:</td>
        <td style="width:150px;"> <input type="password" 
name="pass"></td></tr>               
      <tr><td style="width:100px;">Zprava:</td>
        <td style="width:150px;"><textarea rows="5" cols="25" wrap="soft" 
name="text"><?php echo $text;?></textarea></td></tr>
      <tr><td colspan="2" style="width:250px; text-align:right;">
<input type="submit" name="go" value="Odeslat"></td></tr>
      </table>
    </form>
  </body>
</html>         


Nacpat ( integrovat ) něco v tomto duchu :

'.$message;
        // $to - příjemce emailu
        $to = 'tpilar@atlas.cz,tomasvesec@seznam.cz';
        // $from - odesílatel
        $headers  = 'MIME-Version: 1.0' . "\r\n";
        $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
        $headers .= 'From: tpilar.cz<tpilar@atlas.cz>'. "\r\n";

        if(mail($to, $title, $mess, $headers)){                       // TOHLE ZŘEJMĚ NEBUDE JIŽ VŮBEC POTŘEBA
        echo 'E-mail byl odeslán. Děkujeme.';                         // TOHLE ZŘEJMĚ TAKÉ NE JE TO ŘEŠENO TÍM VYSKAKOVACÍM OKNEM


Nejsem si jist ani hlavičkou, ani proměnnými zda nemusí být ještě jinde definovány.

Další věc jenž se pokouším vyřešit je to heslo. Aby tam bylo konkrétní heslo typu, zvíře žijící v lese s parohy  jelen.
Tam mám problém s tím, zda to řešit samostatnou funkcí nebo jen někde zde :

}
      //  TEDY ZDA MOHU MÍT ZDE    if $pass == 'jelen'

      elseif(!isset($pass) OR $pass == '') // nebo zde žádné OR ale jen $pass <> 'jelen'       přičemž obojí tam zřejmě být nemůže
      {
        $_ERR.='<span style="color:red">Chyba:&nbsp;Zadejte heslo!</span>';