Autor Zpráva
argonisius
Profil *
Moderátor Alphard: Problém je ve filtru na úrovni databáze, takže přesouvám do vhodnější kategorie.

Mám takovýto php kód. K funkčnímu scriptu jsem přidal kontrolu, zda je e-mail v databázi. Tato kontrola však nefunguje. Nevíte, co jsem napsal špatně?
<?php
// Načtení konfiguračních informací
require_once 'config.php';
   
// Kontrola a vyhodnocení zaslaných dat
if($_POST) 
  {
	  $username = $_POST['username'];
	  $email = $_POST['email'];	
		$password = $_POST['password'];
	   if(trim($username) == '' || trim($password) == '' || trim($email) == '') 
       {
         $info = '<span class="chybova_hlaska">Musíte vyplnit všechny údaje!</span>';	       
       } 
     else 
       { 
         if(!EregI("^[a-z0-9]+[a-z0-9\._-]*[a-z0-9]+@[a-z0-9]+[a-z0-9\._-]*[a-z0-9]+\.[a-z]{2,6}$", $email) || EregI("\.{2,}", $email) || EregI("_{2,}", $email) || EregI("-{2,}", $email)) 
		       {
             $info = '<span class="chybova_hlaska">Nesprávný formát e-mailu!</span>';	       
           }
         else
           {
             $query = sprintf("SELECT COUNT(id) FROM users WHERE UPPER(username) = UPPER('%s')",
		           mysqli_real_escape_string($dbconnect,$username));
	           $result = mysqli_query($dbconnect,$query);
	           list($count) = mysqli_fetch_row($result);
	           if($count >= 1) 
               {
                 $info = '<span class="chybova_hlaska">Tento login je již registrován!</span>';  	 
               } 
             else 
               {
                 $query = sprintf("SELECT COUNT(email) FROM users WHERE UPPER(email) = UPPER('%s')",
		               mysqli_real_escape_string($dbconnect,$email));
	               $result = mysqli_query($dbconnect,$query);
	               list($count) = mysqli_fetch_row($result);
	               if($count >= 1)
                   {
                     $info = '<span class="chybova_hlaska">Tento e-mail již byl použit při registraci!</span>'; 
                   }
                 else
                   {         
                     $validkey = sha1(uniqid());
		                 $query = sprintf("INSERT INTO users(username,password,email,validkey,validated) VALUES ('%s','%s','%s','%s','0');",
		  	               mysqli_real_escape_string($dbconnect,$username),
		  	               mysqli_real_escape_string($dbconnect,sha1($password)),
                       mysqli_real_escape_string($dbconnect,$email),
                       mysqli_real_escape_string($dbconnect,$validkey));
		                 mysqli_query($dbconnect,$query)
		                   or die ('Při registraci nastaly potíže.');
		                 mail ("$email","$game - Aktivace účtu","Pro aktivaci účtu otevřete tento odkaz: $path/activate.php?id=$username&password=$password&validkey=$validkey")
		                   or die ('Nemohu odeslat aktivační e-mail.');
                     $info = '<span class="oznameni">Děkujeme za registraci. Byl vám zaslán aktivační e-mail.</span>';	
                   }
		           }
		       }
       } 	                
   }
?>
Joker
Profil
Odpovězte prosím tyto otázky:

- Co by daný kód měl udělat (co očekáváte, že udělá)?

- Jak se skutečné chování liší od očekávaného? Pokud je výsledkem chyba, zkopírujte text chybové hlášky. Ideálně, obsahuje-li hláška číslo řádku, označte v kódu řádek, který chybu vyvolal.

Tipy: Pro vložení kódu používejte značku [pre], (tlačítko "<>"). Pro zvýraznění uvnitř kódu můžete použít tučné písmo (tlačítko "B").
Shulík
Profil
Nemá být v mysqli_query nejdřív SQL kód a teprve potom Resource id připojení (řádek 25)? Nejsem si teď jistej, mysqli používám jen objektově.
argonisius
Profil *
Má zkontrolovat odeslání dat, správnost e-mailu, ověřit nepřítomnost registrovaného loginu a e-mailu v databázi - ověření e-mailu nefunguje - při zadání registrovaného mailu se registrace nezablokuje.
Shulík
Profil
Mimochodem, vyzkoušel jsi, kudy kód prochází a kudy ne? (Máš tam plno podmínek, tak tam nějak umně vecpat echa, popřípadě mysqli_error(); atp.
argonisius
Profil *
Tak v té části, kde to nefunguje kód prochází - mám to řazeno tak, že se vždy něco ověří a pokud to tímto filtrem neprojde, tak se vypíše
hláška. V opačném případě jsou data poslána dál...
argonisius
Profil *
Problém je tam v tom, že u té kontroly e-mailu je "upper" - UPPER(email) = UPPER('%s'). Bez něho to funguje, ale zase potom Neco@neCO.cz není to samé, jako neco@neco.cz ... Co s tím?
argonisius
Profil *
Kdyby to na to mělo vliv, tak databázová tabulka vypadá takto: (tabulka users)

Sloupec Typ Porovnávání Vlastnosti Nulový Výchozí
id int(11) Ne auto_increment
username varchar(250) utf8_czech_ci Ano NULL
password varchar(50) utf8_czech_ci Ano NULL
email varbinary(200) Ne
validkey varchar(32) utf8_czech_ci Ne
validated binary(1) Ne 0
argonisius
Profil *
Je nějaká jiná cesta, aby ten script považoval noCO@NEco.cz za to samé jako neco@neco.cz?
Alphard
Profil
argonisius:
že u té kontroly e-mailu je "upper" - UPPER(email) = UPPER('%s').
Jak se projevuje nefunkčnost? Vypisuje se nějaká chyba? Je správně nastavené kódovaní?
argonisius
Profil *
Kódování by mělo být nastaveno dobře. Chyba se projevuje tak, že proměnná count ( viz kód nahoře) která určuje, kolik stejných e-mailů je registrovaných) má hodnotu 0, i když je v databázi takových e-mailů více. Zkoušel jsem zadávat sql dotaz v php my admin bez toho upper, fungovalo to - count =1, ale když tam napíšu jinak velká a malá písmena, tak je count opět 0...

dotaz 1:
SELECT COUNT( email ) 
FROM users
WHERE UPPER( email ) = UPPER(  'neco@neco.cz' )  
- count = 0


dotaz 2:
SELECT COUNT( email ) 
FROM users
WHERE email =  'neco@nec.cz'

- count = 16 - mám tam 16x registraci pod tímto mailem
argonisius
Profil *
Nemůže být problém v tom, že e-mail mám uložený jako typ varbinary? Není tem třeba nějaké omezení, že tento typ nemůžu převést na kapitálky? Nebo je problém v tom, že @ není možno převést?
Alphard
Profil
argonisius:
Nemůže být problém v tom, že e-mail mám uložený jako typ varbinary?
Předtím jsem si toho typu nevšiml, ale teď jsem si vzpomněl, že v manuálu je:
UPPER() is ineffective when applied to binary strings (BINARY, VARBINARY, BLOB).
argonisius
Profil *
Aha.... a bude vadit, když dám email jako jiný typ? Jaký mám zvolit?
Alphard
Profil
Viděl bych to na varchar.
argonisius
Profil *
Díky moc za pomoc.... s databázema nejsem moc zadobře =)

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:

0