NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Nefunkční echo při registraci

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Tomáš Houžvička:22.11.2016 21:38

Ahoj, mám jeden problém. Na svém webu jsem vytvořil registraci a když se někdo chce zaregistrovat a nevyplní ve formuláři třeba nick nebo se nick shoduje s nickem jiného uživatele, stejně se do databáze tento uživatel uloží a kód mu ještě na e-mail odešle potvrzení registrace. Nevíte kde může být chyba?

<?php
include "connect.php";
if(isset($_POST['submit'])) {
    $nick = mysql_real_escape_string($_POST['nick']);
    $krestni = mysql_real_escape_string($_POST['krestni']);
    $prijmeni = mysql_real_escape_string($_POST['prijmeni']);
    $narozeni = mysql_real_escape_string($_POST['narozeni']);
    $heslo = mysql_real_escape_string($_POST['heslo']);
    $over_heslo = mysql_real_escape_string($_POST['over_heslo']);
    $md5_heslo = MD5(SHA1("$heslo"."anaxxanaoboraarobo"));
    $email = mysql_real_escape_string($_POST['email']);
    $telefon = mysql_real_escape_string($_POST['telefon']);
    $pin = mysql_real_escape_string($_POST['pin']);
    $barvap = mysql_real_escape_string($_POST['barvap']);
    $user_check = mysql_query("SELECT login FROM uzivatele WHERE login='".$nick."'");
    $datum = Date("d.m.Y H:i:s");
    $datum1 = Date("Y-m-d H:i:s");
    $datum2 = Date("YmdHis");
    $ip=getenv("HTTP_X_FORWARDED_FOR");
    if($nick==""){echo"Nebyl vyplněn nick!";}
    if($krestni==""){echo"Nebylo vyplněno křestní jméno!";}
    if($_POST["narozeni"]<date("Y-m-d"))
{echo"To se teprve narodíte nebo co?.";}

    else if($prijmeni==""){echo"Nebylo vyplněno příjmení!";}
    if(mysql_num_rows($user_check)){echo"Tento nick používá jiný uživatel.";}
    else if($heslo==""){echo"Nebylo vyplněno heslo";}
    else if($over_heslo==""){echo"Nebylo vyplněno ověřovací heslo";}
    else if($heslo!=$over_heslo){echo"Vyplněná hesla se neshodují";}
    else if($telefon==""){echo"Nebyl vyplněn telefon";}
    if($pin==""){echo"Nebyl vyplněn pin!";}
    if(empty($ip) || $ip=='unknown') { $ip=getenv("REMOTE_ADDR");
}
    else{

                    $q2 = mysql_query("INSERT INTO uzivatele VALUES ('','$nick','','$krestni','$prijmeni','$narozeni','$md5_heslo','$email','$telefon','$pin','','','$datum1','$ip','','','','','$barvap')") or die(mysql_error());
            if(!$q2) { echo mysql_error() . ' - ' . mysql_errno(); }
            else {

// vybereme identifik�tor nov�ho u�ivatele a pomoc� n�j vytvo��me k�d aktivace ��tu
                $q3 = mysql_query("SELECT `id` FROM `uzivatele` WHERE `login`='".$nick."'");
                $r3 = mysql_fetch_assoc($q3);

// do prom�nn� $activation za�ifrujeme identifik�tor a p�ihl��ovac� jm�no
                $activation = md5($r3['id']).md5($nick);

// po�leme u�ivateli e-mail s aktiva�n�m k�dem
                $_to = $email;

                $_subject = "Ověření vašeho účtu ".$nick."";

                $_message = "<div style=\"font-size:11pt; font-family:Arial; color:black; padding:5px;\"><div>Dobrý den,</div>";
                $_message .= "<div style=\"text-indent:0px;\">vítáme vás na portálu pro členy ANAXu. Pro aktivaci vašeho účtu klikněte na odkaz:: http://anaxprocleny.wz.cz/activation.php?login=".$nick."&code=".$activation.".</div>";
                $_message .= "<div style=\"margin:10px 0;\">Vaše uživatelské jméno: ".$nick."</div>";
                $_message .= "<div style=\"margin:10px 0;\">Vaše křestní jméno: ".$krestni."</div>";
                $_message .= "<div style=\"margin:10px 0;\">Vaše příjmení: ".$prijmeni."</div>";
                $_message .= "<div style=\"margin:10px 0;\">Vaše datum narození: ".$narozeni."</div>";
                $_message .= "<div style=\"margin:10px 0;\">Vaše heslo: ".$heslo."</div>";
                $_message .= "<div style=\"margin:10px 0;\">Váš e-mail: ".$email."</div>";
                $_message .= "<div style=\"margin:10px 0;\">Vaše telefoní číslo: ".$telefon."</div>";
                $_message .= "<div style=\"margin:10px 0;\">Váš bezpečnostní pin: ".$pin."</div>";
                $_message .= "<div style=\"margin:10px 0;\">Datum a čas registrace: ".$datum."</div>";
                $_message .= "<div>Po aktivaci přes odkaz budeme muset váš účet z bezpečtnostní důvodů schválit i my. O schválení vás budeme prostřednictvím emailu informovat.</div>";
                $_message .= "<div>S pozdravem klub ANAX.</div>";


                $_headers  = 'MIME-Version: 1.0' . "\r\n";
                $_headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
                $_headers .= 'From: <[email protected]>' . "\r\n";

                if(@mail($_to, '=?UTF-8?B?'.base64_encode($_subject).'?=', $_message, $_headers))
                {
                    echo "Za chvíli obdržíte e-mailovou zprávu s odkazem pro potvrzení registrace. Pozor! Odkaz je platný 1 hodinu.";
                }
  else {
                    echo "E-mail nebyl odeslán. Zkuste to za 5 minut.";
                }
            }
}
}
?>

Formulář:

<form action="#" method="post" enctype="multipart/form-data">
<table>
<tr> <td>Přihlašovací jméno: </td> <td><input type="text" name="nick" value="<?php if(isset($_POST["nick"])){echo $_POST["nick"];}?>" size="25" tabindex="1" /></td> </tr>
<tr> <td>Jméno: </td> <td><input type="text" name="krestni" value="<?php if(isset($_POST["krestni"])){echo $_POST["krestni"];}?>" size="25" tabindex="1" /></td> </tr>
<tr> <td>Příjmení: </td> <td><input type="text" name="prijmeni" value="<?php if(isset($_POST["prijmeni"])){echo $_POST["prijmeni"];}?>" size="25" tabindex="1" /></td> </tr>
<tr> <td>Datum narození: </td> <td><input type="date" name="narozeni" value="<?php if(isset($_POST["narozeni"])){echo $_POST["narozeni"];}?>" size="25" tabindex="1" /></td> </tr>
<tr> <td>Heslo: </td> <td><input type="password" name="heslo" value="" size="25" tabindex="2" /></td> </tr>
<tr> <td>Ověření hesla: </td> <td><input type="password" name="over_heslo" value="" size="25" tabindex="3" /></td> </tr>
<tr> <td>Email: </td> <td><input type="email" name="email" value="<?php if(isset($_POST["email"])){echo $_POST["email"];}?>" size="25" tabindex="4" /></td> </tr>
<tr> <td>Telefon: </td> <td><input type="number" name="telefon" value="<?php if(isset($_POST["telefon"])){echo $_POST["telefon"];}?>" size="25" tabindex="1" /></td> </tr>
<tr> <td>Bezpečnostní pin: </td> <td><input type="number" name="pin" value="<?php if(isset($_POST["pin"])){echo $_POST["pin"];}?>" size="25" tabindex="1" />(zvolte si svůj až 11 místný bezpečnostní pin)</td> </tr>
<tr>
<input type="hidden" name="barvap" value="#00ff00">
<td colspan="2">
<input type="submit" name="submit" value="Registrovat se" />
<input type="reset" value="Vymazat vše" /></td>
</tr>
</table>
</form>
 
Odpovědět
22.11.2016 21:38
Avatar
Jan Bezdíček
Tvůrce
Avatar
Jan Bezdíček:22.11.2016 21:47
  1. nepouzivej driver mysql_ v PHP 7 uz ani neni a jeho pouziti je nebezpecne co se tyce zranitelnosti SQL Injection
  2. Tve reseni reigstrace je trosku zvlastni, vubec neresis, pokud tam ta hodnota neni, napr. kdyz smazu input nick, tak ti $_POST['nick'] hodi chybu. Udelej si pole $errors a pokazde, kdyz neni vyplneny nick nebo neco, pridej hlasku do pole $errors. A teprv az na KONCI si over, jestli je neco v poli $errors (nejake chyby), pokud jsou vypis je, pokud nejsou vloz uzivatele do databaze
  3. co se tyce toho uzivatele, jestli uz je v DB, ty sis vytahl z DB uzivatele s nickem, ktery zadal uzivatel ... ale k cemu ti to je ? Musis overit, jestli ti z databaze prisel ten nick (uzivatel je zaregistrovany s takovym jmenem) nebo ne (neni zaregistrovany)
  4. zjistit IP se da z $_SERVER["REMO­TE_ADDR"]

PS.: pro zjistovani, jestli hodnota neni prazdna pouzivej napr. toto:

if (isset($_POST['nick']) && !empty($_POST['nick']))
Editováno 22.11.2016 21:48
 
Nahoru Odpovědět
22.11.2016 21:47
Avatar
Odpovídá na Jan Bezdíček
Tomáš Houžvička:22.11.2016 21:53

Díky, ale jenom dodám. Ono to ověřování nicku, jestli je volný nebo je zabraný funguje, ale i když script hodí chybu, stejně se ty data zapíšou.

Editováno 22.11.2016 21:54
 
Nahoru Odpovědět
22.11.2016 21:53
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na Tomáš Houžvička
Jan Bezdíček:22.11.2016 21:56

Mas ten INSERT v podmince else, ktera se vykona, kdyz neprijdou zadne data v $_POST a priste ten kod trosku zkus zformatovat, cte se fakt strasne :D je problem se v tom vyznat

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
22.11.2016 21:56
Avatar
Odpovídá na Jan Bezdíček
Tomáš Houžvička:22.11.2016 21:58

Ok, tak jsem se do toho trochu zamotal. Kam mám teda INSERT vložit?

 
Nahoru Odpovědět
22.11.2016 21:58
Avatar
Lava
Člen
Avatar
Odpovídá na Tomáš Houžvička
Lava:23.11.2016 10:15

INSERT ti prebehne len vtedy, ak nickname nie je null a ak ešte neexistuje v databáze. Čiže ak máš v DB nickname "jano" a príde dakto do formulára a vypíše si nick Jano, nesmieš sputiť INSERT. Vlastne smieš, ale skončí ti to mysql error (za predpokladu, že máš na tom stlpci index UNIQUE, čo by si teda mal mať...). Ale nesmieš sputiť insert ani vtedy, ak človek nevypíše nič do inputu. Vtedy by ti uložilo do stlpca nick null a to nechceš. Takže

if(!empty($nickname) && dajakaFunkciaKtoraOcheckujeCiUzJeTakyNickanmeVDatabaze()==false) {
//tu patri tvoj insert
}
Editováno 23.11.2016 10:15
Nahoru Odpovědět
23.11.2016 10:15
Aspartám, sacharín, to je môj vitamín
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.