Autor Zpráva
meluzin
Profil *
Ahoj, při registraci mám podmínky, aby heslo neblo moc krátké atd... Přidal jsem podmínku aby se nemohl registrovat jeden nick dvakrát a od té chvíle mi to všechny hlášky vypisuje dvakrát. Nevíte, kde je chyba?
HTML:
<?
if(IsSet($_POST['registrace'])){
$jmeno = $_POST['jmeno'];
$mail = $_POST['mail'];
$pass1 = $_POST['pass1'];
$pass2 = $_POST['pass2'];
$pass = $pass1;
$md5pass = md5($pass);
    
include "reg.php"; 
}
?>
 <p>   
  <form action="index.php?p=registrace" method="post">
   <input type="text" name="jmeno" maxlength="32"/> Nick (minimálně 4 znaky a maximálně 32 znaků)<br />
   <input type="text" name="mail" maxlength="64"/> E-mail<br />
   <input type="password" name="pass1" maxlength="12"/> Heslo (minimálně 5 znaků a maximálně 12 znaků) <br />
   <input type="password" name="pass2" maxlength="12"/> Heslo znovu <br />
   <input type="submit" name="registrace" value="   Pošli   "/>
  </form>
 </p>

reg.php:
<?
$vyber = mysqli_query($con,"SELECT * FROM uzivatele");

while($vypis = mysqli_fetch_array($vyber))
{
 $username = $vypis['username'];
 
  if (empty($jmeno) OR empty($mail) OR empty($pass1) OR empty($pass2)){
   echo "<p><span class=\"red\">Nebyly vyplněny všechny údaje!</span></p>";
  }
  elseif ($pass1!=$pass2){
   echo "<p><span class=\"red\">Zadaná hesla se neshodují!</span></p>";
  }
  elseif (strlen($pass)>12){
   echo "<p><span class=\"red\">Heslo je moc dlouhé!</span></p>";
  }
  elseif (strlen($pass)<5){
   echo "<p><span class=\"red\">Heslo je moc krátké!</span></p>";
  }
  elseif ($jmeno==$username){
   echo "<p><span class=\"red\">Zadané jméno je již používáno!</span></p>";
  }
  elseif (strlen($jmeno)>32){
   echo "<p><span class=\"red\">Jméno je moc dlouhé!</span></p>";
  }
  elseif (strlen($jmeno)<4){
   echo "<p><span class=\"red\">Jméno je moc krátké!</span></p>";
  }
  else
  {
  $mysqli  = new Mysqli("aaa","aaa","aaa","aaa");
  $prepare = $mysqli->prepare("INSERT INTO `uzivatele`(`username`,`password`,`mail`) VALUES (?,?,?)");
  $prepare->bind_param("sss", $jmeno, $md5pass, $mail);
  $prepare->execute();
  $mysqli->close();

  echo "<p><span class=\"green\">Uživatel byl přidán.</span></p>";
  }
 } 
?>
Alphard
Profil
Nemáte v databázi právě dva uživatele? Ty hlášky to vypíší třeba 100x, když tam bude víc uživatelů.
Ten dotaz kontrolující unikátnost jména si dejte jen do jedné podmínky a použijte where klauzuli na úrovni SQL.
meluzin
Profil *
No ono to vypisuje dvakrát všechno. Když proběhne registrace v pořádku tak se to také vypíše dvakrát.


Tak ono sTak ono se mi to píše za každého uživatele v DB. Když jsou dva tak dvakrát atd. Poradil by mi prosím někdo jak mám tedy zkontrolovat, jestli jméno nění již v DB a vyhnul se tomuto problému?
okolojsoucí
Profil *
Já bych to znal přes dibi, ale přes čisté PHPko to bude dost podobné.

  $uzivatel = dibi::query('SELECT `id` FROM [uzivatele] WHERE username = %s', $username);
  if(count($uzivatel) == 0){
    echo "Uživatel neexistuje";
    // Dokončíme registraci
  }else{
    echo "Uživatel již existuje, zvolte jiné jméno";
  }
meluzin
Profil *
Tak jsem to zkusil předělat přes dibi, ale teď mi to nefunguje vůbec.
<?
$vyber = mysqli_query($con,"SELECT * FROM uzivatele");
 
while($vypis = mysqli_fetch_array($vyber))
{
 $username = $vypis['username'];
 
 $uzivatel = dibi::query('SELECT `id` FROM [uzivatele] WHERE username = %s', $username);
 if(count($uzivatel) == 0){
  if (empty($jmeno) OR empty($mail) OR empty($pass1) OR empty($pass2)){
   echo "<p><span class=\"red\">Nebyly vyplněny všechny údaje!</span></p>";
  }
  elseif ($pass1!=$pass2){
   echo "<p><span class=\"red\">Zadaná hesla se neshodují!</span></p>";
  }
  elseif (strlen($pass)>12){
   echo "<p><span class=\"red\">Heslo je moc dlouhé!</span></p>";
  }
  elseif (strlen($pass)<5){
   echo "<p><span class=\"red\">Heslo je moc krátké!</span></p>";
  }
  elseif ($jmeno==$username){
   echo "<p><span class=\"red\">Zadané jméno je již používáno!</span></p>";
  }
  elseif (strlen($jmeno)>32){
   echo "<p><span class=\"red\">Jméno je moc dlouhé!</span></p>";
  }
  elseif (strlen($jmeno)<4){
   echo "<p><span class=\"red\">Jméno je moc krátké!</span></p>";
  }
  else
  {
  $mysqli  = new Mysqli("aaa","aaa","aaa","aaa");
  $prepare = $mysqli->prepare("INSERT INTO `uzivatele`(`username`,`password`,`mail`) VALUES (?,?,?)");
  $prepare->bind_param("sss", $jmeno, $md5pass, $mail);
  $prepare->execute();
  $mysqli->close();
  echo "<p><span class=\"green\">Uživatel byl přidán.</span></p>";
 }
 }
 else{
  echo "<p><span class=\"red\">Zadané jméno je již používáno!</span></p>";
 }
}  
?>
Magnus123
Profil
meluzin:
Proč vlastně procházíš všechny uživatele a teprv v cyklu kontroluješ, zda uživatel vyplnil správně formulář?
Prvně zjisti, jestli byl správně vyplněn formulář. Pokud ano, zjisti, jestli uživatel s takovým jménem již neexistuje (např. si spočítej počet záznamů, kde jméno = $_POST["jmeno"]).
Pokud takový uživatel neexistuje, vlož nový záznam do DB.
Alphard
Profil
meluzin:
Dibi neřeší problém blbého algoritmu, příčinu jsem vám psal hned v [#2]. Na 31. řádku se nesmyslně znovu připojujete k mysql, když už kvůli selectu na 2. řádku musíte být připojený. Zamyslete se nad kódem víc komplexně.

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: