PHP es Mysql kerdes

Sziasztok !
Irtam egy PHP szkriptet amelynek az a celja, hogy adatok visz be webrol mySQL-be. Egy regisztracios oldalrol van szo.

egy resz a kodbol:

mysql_query('CREATE TABLE register (username TEXT NOT NULL, email TEXT NOT NULL)');
$query = "INSERT INTO register (username, email) VALUES ('{$_POST['username']}', '{$_POST['email']}')";

// Ha letezik a user nem regisztral
$find = mysql_query("SELECT * FROM register WHERE username = '{$_POST['username']}' ");
$duplicate = mysql_num_rows($find);

print "$duplicate";

if ($duplicate == 0) {
mysql_query ($query);
print 'User added';
} else {
print 'user already exist.';
}

A $_POST['username'] es $_POST['email'] adatokat a szkript HTML kodbol veszi ki. pl. input type ="text" name ="username" , stb..

A szkript elenorzi ha letezik mar egy felhasznalo, ha talal egy letezo nevet a "username" oszlop-ban akkor nem adja hoza ujra az SQl adatbazishoz a letezo usert.

Eddig minden mukodik, most azt szeretnem elerni, hogy a felhasznalo regisztracio utan csak akkor legyen aktiv amikor raklikel egy linkre.

Hasonlo dolog van forumoknal, regisztracio utan elkuld a forum egy e-mailt egy linkel es azt meg kell latogatni. Nekem nem szukseg mail-re kuldje a linket, eleg ha az oldalon megjelenik!

Meg lehet oldani ezt a dolgot?

Ha tud valaki segiteni kuldjon egy valaszt. Meg kezdo vagyok PHP-ben.

Koszonom !

Hozzászólások

Tarts nyilván egy véletlenszerűen generált kódot is a usernek mySQLben, és mondjuk ha üres az a mező, akkor jelentse azt hogy aktiválva van. A linkbe megadod neki az aktivációs kódot, és ha ráklikkel a linkre, és egyezik a két kód, akkor SQLben üríted a mezőt... pl..

én ezt úgy oldottam meg, hogy a jelszava volt véletlen generált, és mail-ben küldtem el neki, aztán belépve megváltoztathatta...

koszonom a tanacsokat ! Megprobalom, remelem sikerul.

Az előbbiekhez tanácsok:
- sha1() -el rand() és linux timestamp és juzernév alapján csinálj egy egyedi hash, ha kevésbé vagy paranoid akkor md5(), egy active mezőt is csinálj és ha sikeresen aktivált a juzer, akkor NULL-ra állítsd az egyedi kódot

- a $_POST-olt változókat gondolom jól ellenőrzöd és nem eresztesz be véletlenül sem csupaszon ilyet, csak az egyszerűség kedvéért írtad

- a látező ellenőrzésre talán nem a SELECT * FROM kéne, hanem SELECT username FROM tabla WHERE username = 'x' OR email = 'y' és akkor ha 0-nál többet ad vissza, igazából lehet simán username is

- a regisztrálók emailcímének valódiságát egyszerűen tudod ellenőrizni, én egy regval.php-t szoktam csinálni (vagy rv.php) ahol az egyetlen parameter az md5 vagy sha1 hash, ha az alapján van juzer, akkor lehet aktiválni és újabb emailt küldeni, hogy sikerült meg minden

- a MySQL oszlop típusaiban és helyfoglalásaiban picit mélyedj el, mert a TEXT típus nem túl nyerő egy juzernévnek, az emailhez szintén jobb lenne a VARCHAR

- a kódod érdemegy egyszerűsíteni:

function varCheck($input) {
   if($input) {
      $output = strip_tags($input); //html tageket nem szeretük, véletlenül sem
      $output = mysql_escape_string($output); //az aktuális mysql verzió szerint escape-el, kiolvasáskor jó lesz, a magic_quotes-t pedig lehetőleg off hagyjuk
      //ezen kivul tetszolegesen alakithato ez persze
      return $output;
   }
}

if(is_string($_POST['username']) && ereg('^[a-z0-9\-_\.]{1,32}@[a-z0-9\-\.]{1,64}\.[a-z0-9]{2,5}', strtolower($_POST['email']))
//a fenti ellenorzesek tokegyszeruek, es az email megnezese is elnagyolt, a formátum csak nagyjából illeszkedik

   // Ha letezik a user nem regisztral
   if($f = mysql_query("SELECT username FROM register WHERE username =  '".varCheck($_POST['username'])."' OR email =  '".varCheck($_POST['email'])."';")) {
      if(mysql_num_rows($f) < 1) {
         if(mysql_query("INSERT INTO register (username, email) VALUES ('".varCheck($_POST['username'])."', '".varCheck($_POST['email'])."')")) {
            print 'a felhasználó hozzáadva';
         }
      }
      else {
         print 'már létezik a juzer';
      }
   }
}

No hirtelen ennyi. :) Remélem minden ( { és hasonlót lezártam meg ;-ek sem hiányoznak.

hülye "télapó-scriptek" (akik a script-kiddie-knek visznek cracker-csomagot) semmi idő alatt telipakolnak egy 255byte-os kiscsizmát... ;)
Valamint cracker-szerű létformák is hajlamosak POST-ot manipulálni, pl ezért sem uszítunk rá $_POST-ot csak úgy egy sql adatbázisra, meg alapvetően semmire. :)

A kov. sort hasznalom a random kod generalasra, egyenlore csak kezdesnek :

mysql_query ("INSERT INTO register (username, email, validate) VALUES ('".varCheck($_POST['username'])."', '".varCheck($_POST['email'])."', '".rand(1,99999)."')");

szeretnem a random erteket elohivni html-ben, valami ilyesmi:

print "< a href =\"activate=????\">";

Ha raklikel akkor uritse az SQL mezot..
Tudnatok segiteni egy peldaval, elege kezdo vagyok PHP-ben es megint elakadtam :(

nem lehetne az ilyen színvolnalú kérdéseket a pécéfórumon folytatni, és esetleg a jövőben itt el se kezdeni?

Ugy probaltam megoldani a problemat, hogy letrehoztam egy date_entered oszplopot mysql-ben. Es megcsinaltam, hogy azt a kodot listaza ki amely utoljara volt hozaadva az adatbazishoz.

A validate oszlop tartalmaza a random kodokat.

$query = mysql_query("SELECT validate FROM register ORDER BY date_entered DESC");
$fetch = mysql_fetch_array($query);
print "Aktivalashoz klik < a href=\"userval.php?key={$fetch['validate']}\">ide";

Mukodik de remelem nem tul gyerekes amit csinaltam :)