Autor Zpráva
nyllo
Profil
Prosím překontroloval by mi někdo kód a opravil chyby??

 <?php
 SetLocale(LC_ALL, "Czech");
 $datum = StrFTime("%Y-%m-%d", Time());


include './class/db.php';

    mysql_connect($server, $user_db, $pass_db);
    mysql_select_db($table_db)
        or die("Chyba! Databáze nebo tabulka nebyla nalezena!");
    mysql_query("SET NAMES 'utf-8'");

    if(isset($_POST['poslat']))
    {

        $jmeno = htmlspecialchars($_POST['jmeno']);
        $prijmeni = htmlspecialchars($_POST['prijmeni']);
        $email = htmlspecialchars($_POST['email']);
        $tel = htmlspecialchars($_POST['tel']);
        $karta = htmlspecialchars($_POST['karta']);
        $date = $datum;

        $vloz ="insert into register set jmeno='$jmeno', prijmeni='$prijmeni', email='$email', tel='$tel', karta='$karta', date='$datum';";


        echo '<script type="text/javascript" for="window" event="onLoad()">
        <!--
        window.location.href="index.php?stranka=registrace"
        //-->
        </script>';
    }

// Ověření vyplěného jména
    if (empty($_POST['jmeno']))
    {
        $er_name = "Neplatné jméno!";
    }
    else
    {
        $o1 = "1";
    }

    if (empty($_POST['prijmeni']))
    {
        $er_prim = "Neplatné příjmení!";
    }
    else
    {
        $o2 = "1";
    }

    $tel = $_POST["tel"];
    $tel = eregi_replace(" ","",$tel);
     if(preg_match('/^\+[0-9]{12}$/', $tel)){
        $o3 = "1";
    } else {
        $er_tel = "Neplatné číslo! ";
    }


    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
            $er_mail = "Neplatný e-mail!";
        }
        else
        {
            // kontolou jsme prošli
            $BudemeZobrazovat=false;
            $o4 = "1";

            }
        }


    if ($o1 && $o2 && $o3 && $o4){
        mysql_query($vloz);
        echo '<div class="alert alert-success">Karta byla obědnána</div>';
    }
    else {
        echo '<div class="alert alert-danger"><b>'.$er_name.'&nbsp; &nbsp;'.$er_prim.' &nbsp; '.$er_mail.' &nbsp; '.$er_tel.'</b></div>';
    }


mysql_close();

?>


<!-- Formulář -->
<br>
<form method="post">

    <input name="jmeno" class="form-control" placeholder="Jméno" value="<?echo $_POST["jmeno"]?>" maxlength="50" /><br />
    <input name="prijmeni" class="form-control" placeholder="Příjmení" value="<?echo $_POST["prijmeni"]?>" maxlength="50" /><br />
    <input name="email" class="form-control" placeholder="E-mail" value="<?echo $_POST["email"]?>" maxlength="50" /><br />
    <input name="tel" class="form-control" placeholder="Telefon - vyplňujte ve formátu (+420 xxx xxx xxx)" value="<?echo $_POST["tel"]?>" maxlength="50" /><br />

    <?php
$karts = array("VIP karta - 300Kč","Gold VIP karta - 600Kč");
            echo '<select name="karta" class="form-control" type="text">';
            foreach ($karts as $karta) {
                $k = '<option class="form" value="'. $karta . '"';
                if($karta == $_POST["karta"]){
                    $k = $k . ' selected="selected"';
                }
                $k = $k . '>'. $karta . '</option>';

                echo $k;
            }

            echo '</select><br>';

            ?>

    <button type="submit" class="btn btn-success" name="poslat">Objednat</button>
</form>

Předem děkuji
janbarasek
Profil
nyllo:
Ještě než začnu, tak si přečti pravidla.

Tvůj kód jsi v mírně upravené podobě ukazoval už před pár dny, máš tam víc věcí, které bych udělal jinak. Většinou ale platí -> když to funguje, tak není co řešit. Nerad bych tě nějak kritizoval, ale určitě bych (aspoň já) toto změnil:

- Zápisy typu tohoto jsou zbytečně příšerně roztahané:
    else
    {
        $o1 = "1";
    }
Jde to zkrátit na:
else { $o1 = 1; }

- Čísla nikdy, ale opravdu NIKDY nedávej do uvozovek, protože jinak říkáš, že to je řetězec. V PHP to až tak nevadí, ale skoro každý jiný jazyk by ti už nadával. Musíš se naučit základní principy syntaxe.

- Zápisy typu tohoto by se daly napsat lepší:
if (empty($_POST['jmeno']))
Zjednodušil bych to na:
if (isset($_POST['jmeno']) && !$_POST['jmeno']) { ... }

- Občas tam máš zbytečnosti, jde to napsat rovnou:
$tel = $_POST["tel"];
    $tel = eregi_replace(" ","",$tel);
Třeba takto:
$tel = eregi_replace(" ","",$_POST["tel"]);

- Na řádku 85 je pravopisná chyba:
echo '<div class="alert alert-success">Karta byla obědnána</div>';

- Kód na mě působí tak, jako kdybys ho nepsal ty, ale jen lepil z kousků. Používáš tam různé typy syntaxe. Měl by jsi tomu dát nějaký řád a napsat to pořádně. A hlavně vyházet zbytečnosti.
nyllo
Profil
ještě bych se chtěl optat zde zde nebyla chyba

        $tel = eregi_replace(" ","",$_POST["tel"]);
        if(preg_match('/^\+[0-9]{12}$/', $tel)){
            $o3 = 1;
        } 
        else {    $er_tel = "Neplatné číslo! ";    }

hází chybu i při otevření stránky..
janbarasek
Profil
nyllo:
Ty tam testuješ platnost čísla, i když není vůbec vyplněno. Celé to hoď do podmínky, jestli se číslo odesílá.
nyllo
Profil
to bych poprosil o radu podmínky moc zatím nechápu :|
Tori
Profil
nyllo:
Je tam pár nešikovných věcí:
- postup "složím SQL dotaz, pak ověřím proměnné co jsem do něj vložila, pak dotaz provedu" je značně nepřehledný. Lepší nejdřív provést všechny kontroly vstupu z formuláře, pak teprv skládat a provádět SQL dotaz.
- přesměrování po uložení dat bych řešila spíš v PHP (funkce header), co když má uživatel vypnutý JS?
- na escapování řetězců vkládaných do DB se používá mysql_real_escape_string. PHP má sice nekonzistentně pojmenované funkce, ale přecejen ne až takhle blbě. :)
- $k = $k . "něco"; je přehlednější takhle: $k .= "něco";
- místo proměnných $o1 - $o4 by bylo jednodušší všechny chybové hlášky ukládat do jednoho pole nebo řetězce, a před uložením otestovat jestli je neprázdný. (A samozřejmě na začátku skriptu téhle proměnné přiřadit tu prázdnou výchozí hodnotu.)
- místo ereg* funkcí používejte preg_*, syntax je skoro stejná
- Je rozdíl mezi "objednat" a "obědvat" (ř. 85).
nyllo
Profil
JS je nyní odebraný, pravopisné chyby jsou také opravené vše tak nějako funguje jak potřebuji. jen nevím co s tím ověřením na telefonní číslo..
Joker
Profil
janbarasek:
Zápisy typu tohoto jsou zbytečně příšerně roztahané
> Jde to zkrátit na:
else { $o1 = 1; }

Jde, ale většina coding standards takový zápis nedoporučuje, či přímo zakazuje. Preferovaný zápis podmínky je obvykle jeden z následujících dvou:
if (podmínka) {
  // kód
} else {
  // kód
}

if (podmínka) 
{
  // kód
}
else
{
  // kód
}

Takže zrovna tohle měl nyllo správně.
Doplnění: Péhápko.cz používá ten první zápis.
nyllo
Profil
bohužel stále nevím jak toto upravit.. bohužel jsem nenašel žádné řešení
$telefon = eregi_replace(" ","",$_POST["tel"]);
        if(preg_match('/^\+[0-9]{12}$/', $telefon)){
            $o3 = 1;
        }
        else {    $er_tel = "Neplatné číslo! ";
        }
Again
Profil
janbarasek:
když to funguje, tak není co řešit
V tom případě bych po tobě nerad přebíral projekt, protože "ono to funguje" není výhra ...

Čísla nikdy, ale opravdu NIKDY nedávej do uvozovek
A co třeba PSČ nebo telefonní číslo? Samozřejmě v tomto případě zde uvozovky nepatří (předpokládá se dat. typ Integer).

Musíš se naučit základní principy syntaxe.
Spíše by měl porozumět datovým typům.

Zjednodušil bych to na:
Nezdá se mi, že by jsi něco zjednodušil.

Třeba takto
A ještě lépe místo ereg_replace, což je zastaralá funkce, použit preg_replace.

nyllo:
Nastuduj si více teorie a použivej novější zdroje, protože třeba i mysql_* extenze je zastaralá.

bohužel jsem nenašel žádné řešení
Právě proto se potřebuješ naučit základy, ať jenom kód "neslepuješ" ale sám píšeš.
nyllo
Profil
nakonec jsem ty vyřešil takto

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
            $er_mail = "Neplatný e-mail!";
        }
        else
        {
            // kontolou jsme prošli
            $BudemeZobrazovat=false;
            $o4 = "1";            
            }
        }
        
        if (isset($_POST['jmeno']) && !$_POST['jmeno'])
        {
            $er_name = "Neplatné jméno!";
        }
        else {    $o1 = 1; };
        
        if (isset($_POST['prijmeni']) && !$_POST['prijmeni'])
        {
            $er_prim = "Neplatné příjmení!";
        }
        else {    $o2 = 1; };
        
    if (!empty($_POST)) // tak už se odesílalo a musíme kontolovat
    {
        $telefon = eregi_replace(" ","",$_POST["tel"]);
        if(preg_match('/^\+[0-9]{12}$/', $telefon)){
            $o3 = 1;
        }
        else {    $er_tel = "Neplatné číslo! ";
        }
    }
        
    if (!empty($_POST)) // tak už se odesílalo a musíme kontolovat
    {    
        if ($o1 && $o2 && $o3 && $o4) {
            mysql_query($vloz);
            
            mail("mc.ico.mc@gmail.com", $predmet, $zprava, "From: " . $email);
            
            
            
            echo '<div class="alert alert-success">Karta byla objednána</div>';
        }
        else {
            echo '<div class="alert alert-danger"><b>'.$er_name.'&nbsp; &nbsp;'.$er_prim.' &nbsp; '.$er_mail.' &nbsp; '.$er_tel.'</b></div>';
        }
    }
abc
Profil
A ještě lépe místo ereg_replace, což je zastaralá funkce, použit preg_replace.
A nebo str_replace, vždyť chce jen vyhodit mezery..
nyllo
Profil
ještě se chci zeptat zda je možné užít funkci takto

Část první
i        or die("Chyba! Databáze nebo tabulka nebyla nalezena!");
    mysql_query("SET NAMES 'utf-8'"); 

    if(isset($_POST['poslat']))
    {    
        $to      = 'mc.ico.mc@gmail.com';
        $subject = 'Nová objednánka karty';
        $message = " ".$_POST["jmeno"]." ".$_POST["prijmeni"]." ".$_POST["tel"]." ".$_POST["email"]."  ".$_POST["karta"]." ".$datum." ";
        
        
        
        $jmeno = htmlspecialchars($_POST['jmeno']);

Část druhá
        else {    $er_tel = "Neplatné číslo! ";
        }
    }
        
    if (!empty($_POST)) // tak už se odesílalo a musíme kontolovat
    {    
        if ($o1 && $o2 && $o3 && $o4) {
            mysql_query($vloz);
            mail($to, $subject, $message);
            
            
            echo '<div class="alert alert-success">Karta byla objednána</div>';
        }
        else {
janbarasek
Profil
nyllo:
ještě se chci zeptat zda je možné užít funkci takto
Ano, pokud je server správně nastaven, tak by to mělo fungovat. Ze zkušenosti však vím, že samotná funkce mail() není úplně ideální, protože občas špatně pracuje s diakritikou, snad nebudeš mít také takový problém.
nyllo
Profil
ještě mě napadlo to nahradit funkcí

$hlavicka = 'From:' . $_POST['email'];
            $hlavicka .= "\nMIME-Version: 1.0\n";
            $hlavicka .= "Content-Type: text/html; charset=\"utf-8\"\n";
            $adresa = 'mc.ico.mc@gmail.com';
            $message = " ".$_POST["jmeno"]." ".$_POST["prijmeni"]." ".$_POST["tel"]." ".$_POST["email"]."  ".$_POST["karta"]." ".$datum." ";
            $predmet = 'Nová objednánka karty';
            mb_send_mail($adresa, $predmet, $message, $hlavicka);


a však čeština opravdu nejde
abc
Profil
janbarasek:
Ano, pokud je server správně nastaven, tak by to mělo fungovat. Ze zkušenosti však vím, že samotná funkce mail() není úplně ideální, protože občas špatně pracuje s diakritikou, snad nebudeš mít také takový problém.
A máš to něčím podložené nebo jen plácáš?

nyllo
Česká diakritika v mailech
janbarasek
Profil
abc:
Mám to podložené praxí hostování na Wedosu a také na to (tuším) upozorňoval Jakub Vrána ve své knize.
abc
Profil
Mám to podložené praxí hostování na Wedosu
Nefunkční příklad by nebyl?

také na to (tuším) upozorňoval Jakub Vrána ve své knize.
strana?
peta
Profil
janbarasek: Mail funguje spravne, pokud zadas spravne parametry pro kodovani do hlavicky a pripadne do predmetu. Spatne funguji programy pro cteni, ktere se snazi to prekodovat na neco jineho nebo nemaji detekci kodovani. J. Vrana tam spis mohl odkazovat na script, ktery kodovani nastavuje sam spravne.
nyllo
Profil
Pro ty co hostují u Wedosu

Tato možnost funguje bez jakéhokoli problému
$hlavicka = 'From:' . $_POST['email'];
            $hlavicka .= "\nMIME-Version: 1.0\n";
            $hlavicka .= 'Content-Type: text/html; charset="utf-8"\n';
            $adresa = 'romansvoboda@centrum.cz';
            $message = " Jmeno: ".$_POST["jmeno"]." <br> Přijmeni: ".$_POST["prijmeni"]." <br> Telefon: ".$_POST["tel"]." <br> Email: ".$_POST["email"]." <br> Typ karty ".$_POST["karta"]." <br> Datum objednání: ".$datum." ";
            $predmet = 'Nová objednánka karty';
            mail($adresa, $predmet, $message, $hlavicka);


ale nyní hledám funkci pro automatické generování čísla uživatele.
pcmanik
Profil
nyllo:
Na to automatické generovanie ti poslúži auto_increment v databáze.
A každý dotaz patrí do samostatnej témy.

A postol by si sem aktuálnu verziu kódu? Rád by som videl ako si s tým pokročil a či si si zobral vôbec rady ktoré ti boli dané.
nyllo
Profil
Kód nyní vypadá takto

 <?php 
 SetLocale(LC_ALL, "Czech");
 $datum = StrFTime("%Y-%m-%d", Time());


include './class/db.php';

    mysql_connect($server, $user_db, $pass_db);
    mysql_select_db($table_db)
        or die("Chyba! Databáze nebo tabulka nebyla nalezena!");
    mysql_query("SET NAMES 'utf-8'"); 


    if(isset($_POST['poslat']))
    {
    
        $jmeno = htmlspecialchars($_POST['jmeno']);
        $prijmeni = htmlspecialchars($_POST['prijmeni']);
        $email = htmlspecialchars($_POST['email']);
        $tel = htmlspecialchars($_POST['tel']);
        $karta = htmlspecialchars($_POST['karta']);
        $date = $datum;
    
        $vloz ="insert into register set jmeno='$jmeno', prijmeni='$prijmeni', email='$email', tel='$tel', karta='$karta', date='$datum';";
        
    }

    function JeEmail ($cislo)
    {
        return ereg("^.+@.+\..+$",$cislo);
    }
    $BudemeZobrazovat=true;
    if (!empty($_POST)) 
    {
        if (!JeEmail($_POST["email"]))
        {
            
            $er_mail = "Neplatný e-mail!";
        }
        else
        {
            $BudemeZobrazovat=false;
            $o4 = "1";            
            }
        }
        
        if (isset($_POST['jmeno']) && !$_POST['jmeno'])
        {
            $er_name = "Neplatné jméno!";
        }
        else {    $o1 = 1; };
        
        if (isset($_POST['prijmeni']) && !$_POST['prijmeni'])
        {
            $er_prim = "Neplatné příjmení!";
        }
        else {    $o2 = 1; };
        
    if (!empty($_POST))    {
        $tel = eregi_replace(" ","",$_POST["tel"]);
        if(preg_match('/^\+[0-9]{12}$/', $tel)){
            $o3 = 1;
        } 
        else {    $er_tel = "Neplatné číslo! ";    }
        
    }

    
    if (!empty($_POST))    {
        if($_POST["karta"] == vip.jpg){
            $karta_over = 1;
        } 
        else {    $karta_over = 0;    }
        
    }

        
    if (!empty($_POST))    {
        if ($o1 && $o2 && $o3 && $o4) {
            
            //vložení do sql
            mysql_query($vloz);
            //sql konec//
            /////////////////////            
            // generování obrázku
            $picture = rand(0,3000);
            $img_jmeno = $_POST['jmeno']; 
            $img_prijmeni = $_POST['prijmeni']; 
            $img_id = "#".$_POST['id'].""; 
            $img_datum = $_POST['datum'];
            $img_typ = $_POST['karta']; 

            if (!empty($_POST)) {

            $img = new Image("$typ");

            $img->resize(1125,675, true, true);


            $img->set_font("OpenSans-Bold.ttf", 48, Array(255,255,255));
            $img->write("$img_jmeno $img_prijmeni", 78, 565, 0, 100);


            $img->set_font("OpenSans-Regular.ttf", 28, Array(255,255,255));
            $img->write("$img_id", 76, 626, 0, 100);
            $img->write("$img_datum", 415, 626, 0, 100);


            $img->save_jpg("output/karta$picture.jpg");
            $img->destroy();
            }


            //obrazek konec//
            //////////////////            
            // odeslání emailu//
            $hlavicka = 'From:' . $_POST['email'];
            $hlavicka .= "\nMIME-Version: 1.0\n";
            $hlavicka .= 'Content-Type: text/html; charset="utf-8"\n';
            $adresa = 'xxx@centrum.cz,xxx@gmail.com';
            $message = " Jmeno: ".$_POST["jmeno"]." <br> Přijmeni: ".$_POST["prijmeni"]." <br> Telefon: ".$_POST["tel"]." <br> Email: ".$_POST["email"]." <br> Typ karty ".$_POST["karta"]." <br> Datum objednání: ".$datum." ";
            $predmet = 'Nová objednánka karty';
            mail($adresa, $predmet, $message, $hlavicka);
            // email konec
            
            echo '<div class="alert alert-success">Karta byla objednána</div>';
        }
        else {
            echo '<div class="alert alert-danger"><b>'.$er_name.'&nbsp; &nbsp;'.$er_prim.' &nbsp; '.$er_mail.' &nbsp; '.$er_tel.'</b></div>';
        }
    }
        

mysql_close();
?>


<!-- Formulář -->
</br>
<form method="post">

    <input name="jmeno" class="form-control" placeholder="Jméno" value="<?echo $_POST["jmeno"]?>" maxlength="50" /><br />
    <input name="prijmeni" class="form-control" placeholder="Příjmení" value="<?echo $_POST["prijmeni"]?>" maxlength="50" /><br />
    <input name="email" class="form-control" placeholder="E-mail" value="<?echo $_POST["email"]?>" maxlength="50" /><br />
    <input name="tel" class="form-control" placeholder="Telefon - vyplňujte ve formátu (+420 xxx xxx xxx)" value="<?echo $_POST["tel"]?>" maxlength="50" /><br />
    
    <?php 

//$karts = array("VIP karta - 300Kč","Gold VIP karta - 600Kč");
//            echo '<select name="karta" class="form-control" type="text">';
//            foreach ($karts as $karta) {
//                $k = '<option class="form" value="'. $karta . '"';
//                if($karta == $_POST["karta"]){ 
//                    $k = $k . ' selected="selected"';
//                }
//                $k = $k . '>'. $karta . '</option>';
//                 
//                echo $k;
//            }
//                        
//              echo '</select><br>';
            

            ?>
    <select name="karta" class="form-control" type="text">  
        <option class="form" value="vip.jpg" <?php echo $_POST['karta'] == "vip.jpg" ? 'selected="selected"' : ''?>>VIP karta - 300Kč</option>
        <option class="form" value="golg.jpg" <?php echo $_POST['karta'] == "golg.jpg" ? 'selected="selected"' : ''?>>Gold VIP karta - 600Kč</option>
    </select>    
    <br />
    <button type="submit" class="btn btn-success" name="poslat">Objednat</button> <span></span>
</form>


Byla ještě přidána funkce pro generování obrázků do které pokaždé musím vložit nové ID shodující se DB

*v kódu jsem označil místo kam chci vkládat ID
nyllo
Profil
napadlou mě jak vyřešit ty id

při odesílání platných údajů bych zavolal mysql_insert_id()

$db_id = mysql_insert_id();

a ta by posílala aktuální id do

// generování obrázku
            
            $picture = rand(0,3500);
            $img_jmeno = $_POST['jmeno']; 
            $img_prijmeni = $_POST['prijmeni']; 
            $img_id = "#100".$db_id.""; 
            $img_datum = $_POST['datum'];
            $img_typ = $_POST['karta']; T['karta'];
Tori
Profil
Mám pocit, že se vám budou ukládat obrázky se dvěma příponami, např. "kartavip.jpg.jpg".
↓ a jo, máte pravdu, spletla jsem si $img_typ a $picture
nyllo
Profil
už jsem to zkoušel a bude se ukládat s jedním..
je to podle příslušného nastavení knihovny

teď jsem si uvědomil že mi tam chybí
 include "image.php"; 
nyllo
Profil
Tori:
pro objasnění

            $picture = rand(0,3000);
            $img_jmeno = $_POST['jmeno']; 
            $img_prijmeni = $_POST['prijmeni']; 
            $img_id = "#".$_POST['id'].""; 
            $img_datum = $_POST['datum'];
            $img_typ = $_POST['karta']; 
 
            if (!empty($_POST)) {
 
            $img = new Image("$img_typ");
 
            $img->resize(1125,675, true, true);
 
 
            $img->set_font("OpenSans-Bold.ttf", 48, Array(255,255,255));
            $img->write("$img_jmeno $img_prijmeni", 78, 565, 0, 100);
 
 
            $img->set_font("OpenSans-Regular.ttf", 28, Array(255,255,255));
            $img->write("$img_id", 76, 626, 0, 100);
            $img->write("$img_datum", 415, 626, 0, 100);
 
 
            $img->save_jpg("output/karta$picture.jpg");
            $img->destroy();
            }


označil jsem body které to trochu objasní

je základ který je výchozí. Generátor přidá texty a uloží jako /kartaxxx.jpg

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: