Autor Zpráva
johy
Profil *
Zdravím,
mám menší problém a nevím si s ním rady. Mám shoutbox v php. Do něho mohou vkládat zprávy normální uživatelé a administrátoři, kteří mají chráněný nick na heslo. V databázi mám uložené všechny nicky, které by měly být chráněné. Bohužel, pokud mám v databázi více jak jeden chráněný nick, tak funguje vždy pouze nick, který je v databázi na posledním místě, tedy ten, který byl přidaný jako poslední. Na ukázku přidávám kód.

$jak = mysql_query("SELECT * FROM uni");   //uni = (chráněná jména)
while($pole = mysql_fetch_array($jak))
{
$st = $pole['jmeno'];
$pass = $pole['heslo'];
$heslo = $_POST['heslo'];
$heslo = md5($heslo);
}
if ($sl == $st ){
if ($pass == $heslo){  // pro chráněná jména
mysql_query('SET NAMES CP1250');
mysql_query('SET COLLATION_CONNECTION=CP1250_GENERAL_CI');
$jmeno = '<u><font title="Autorizovaný nick" color="red">'.$_POST['jmeno'].'</u>: </font>';   //design chráněných jmen
$vzkaz = $_POST['vzkaz'];
$datum = Date("j. m. Y | H:i:s", Time());
$vloz = mysql_query("INSERT INTO shoutbox (`jmeno`, `vzkaz`, `ip`, `datum` )
VALUES ('{$jmeno}', '{$vzkaz}', '$REMOTE_ADDR', '{$datum}' ) ");
header('Refresh: 1'); 
}
else{
echo "Nick, který jste zadal je chráněný a potřebuje heslo";
}
}
Keeehi
Profil
johy:
U z logiky věci nesmíš dovolit vytvořit duplicitní nick.
Ugo
Profil
přiřazuješ stále do jedněch proměnných,

while($pole = mysql_fetch_array($jak))
{
$st = $pole['jmeno'];
$pass = $pole['heslo'];
$heslo = $_POST['heslo'];
$heslo = md5($heslo);
}


čili na konci bude právě ta poslední hodnota, udělej jinak dotaz na DB - dej do něj výběr podle jména tak aby vybral vždy jeden řádek nebo do while dej přímo kontrolu či si tam dělej pole a pak kontroluj místo "==" přes in_array();
johy
Profil *
Pokud by mi někdo poskytl inspirativní kód jak na to, byl bych jedině rád :)
Dědek
Profil
A nebylo by celkově lepší udělat to nějak takto:

$user_query = mysql_query("SELECT heslo FROM uni WHERE jmeno = \'". mysql_real_escape_string($_POST['jmeno'])."\' LIMIT 1"); //zjistíme zda existuje nick zadaný uživatelem
if(mysql_num_rows($user_query) > 0) { //nick v databázi existuje
   if(md5($_POST['heslo']) == mysql_result($user_query, 0, 0)) { //zkontrolujeme správnost hesla
      //provedeme akce pro ověřeného uživatele
   }
   else { //heslo nám nesouhlasí
       echo "Nick, který jste zadal je chráněný a potřebuje heslo";
   }
}
else { //nick nebyl v databázi nalezen, tudíž jej lze použít volně
   //provedeme akce pro NEověřeného uživatele
}

Je to z hlavy snad tam nebude žádná chyba...
johy
Profil *
Díky za snahu, ale bohužel. Stále stejný problém s tím rozdílem, že teď si to nevezme poslední řádek v DB, ale první :D
Dědek
Profil
Moje blbost, ten první řádek

$user_query = mysql_query("SELECT heslo FROM uni WHERE jmeno = '". mysql_real_escape_string($_POST['jmeno'])."' LIMIT 1"); //zjistíme zda existuje nick zadaný uživatelem
johy
Profil *
No, teď je to nějaký celý divoký, každopádně už to rozezná i ostatní chráněná jména, což se mi nedařilo udělat. Zbytek už snad něják dořeším. Moc dík za pomoc!


Oukej, definitivně vyřešeno, velké poděkování patří Dědkovi :) Díky.
Dědek
Profil
Klidně se ptej dál...

Ale v základu teď stačí v daných blocích vytvořit příslušný vzhled dat pro ověřený/neověřený nick a zavolat vložení do databáze.

Jen malá připomínka, pro uložení data a času bych používal typ sloupce timestamp, nebo datetime viz. manuál MySQL, myslím, že Ti to do budoucna ušetří práci, například s řazením podle data.
johy
Profil *
Jojo, to datum vím že není vhodný, změním, dík za připomínku. Chráněné nicky už fungují tak jak mají :)

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: