Problém s ověřením duplicity v databázi (MySQL)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kiCkZ
Člen | 153
+
0
-

Ahoj,

mam funkci duplicity v modelu:

UserManager.php

public function duplicity($column,$item) {
    $count = $this->database->table(self::TABLE_NAME)->where($column,$item)->count();
    if($count > 0) {
        return true;
    }
}

Která ověřuje na základě vyplněného formuláře, zda je hodnota v DB, nicméně mi to stále zlobí a místo toho, aby to v případě
schodné hodnoty napsalo hlášku, tak to píše hlášku vždy.

ProfileFormFactory.php

public function duplicityUsername($item) {
    if($this->model->duplicity('username',$item->value) === true) {
        return true;
    }
}

/**
 * @return Form
 */
public function create(callable $onSuccess) {
    $form = $this->factory->create();
    $form->addText('username','Přihlašovací jméno: ')
         ->addRule([$this,'duplicityUsername'],'Uživatelské jméno již existuje')
         ->setRequired();
    $form->addEmail('email','E-mail: ')
         ->setRequired();
    $form->addSubmit('save', 'Uložit');
    $defaults = $this->model->fetch($this->user->id);
    $form->setDefaults($defaults);
    $form->onSuccess[] = function (Form $form,$values) use ($onSuccess) {
        try {
            $this->model->update($this->user->getId(),$values->username,$values->email);
        } catch (Exception $e) {
            $form->addError('Profil se nepodařilo aktualizovat');
            return;
        }
        $onSuccess();
    };
    return $form;
}

Děkuji za každou pomoc

Editoval kiCkZ (6. 9. 2017 16:15)

jiri.pudil
Nette Blogger | 1032
+
0
-

V případě, že username není duplicitní, bys měl z validační funkce (duplicityUsername) vrátit true. Takhle nevracíš nic, což je falsey hodnota.

kiCkZ
Člen | 153
+
0
-

jiri.pudil napsal(a):

V případě, že username není duplicitní, bys měl z validační funkce (duplicityUsername) vrátit true. Takhle nevracíš nic, což je falsey hodnota.

I přesto to nefunguje.
Stále mi to i u nového username hlásí tu samou hlášku.

David Matějka
Moderator | 6445
+
0
-

ukaz, jak mas kod ted

kiCkZ
Člen | 153
+
0
-

David Matějka napsal(a):

ukaz, jak mas kod ted

Model

public function duplicity($column,$item) {
    $count = $this->database->table(self::TABLE_NAME)->where($column,$item)->count();
    if($count > 0) {
        return true;
    }
}

FormFactory

public function duplicityUsername($item) {
       if($this->model->duplicity('username',$item->value) === true) {
           return true;
       }
   }

   /**
    * @return Form
    */
   public function create(callable $onSuccess) {
       $form = $this->factory->create();
       $form->addText('username','Přihlašovací jméno: ')
            ->addRule([$this,'duplicityUsername'],'Uživatelské jméno již existuje')
            ->setRequired();
       $form->addEmail('email','E-mail: ')
            ->setRequired();
       $form->addSubmit('save', 'Uložit');
       $defaults = $this->model->fetch($this->user->id);
       $form->setDefaults($defaults);
       $form->onSuccess[] = function (Form $form,$values) use ($onSuccess) {
           try {
               $this->model->update($this->user->id,$values->username,$values->email);
           } catch (Exception $e) {
               $form->addError('Profil se nepodařilo aktualizovat');
               return;
           }
           $onSuccess();
       };
       return $form;
   }
Honza.Mottl
Člen | 104
+
0
-

Zacal bych kontrolou od databaze. Vytahl bych inkriminovany SQL prikaz z Ladenky a zkusil ho z ruky, jestli je v poradku.

kiCkZ
Člen | 153
+
0
-

Honza.Mottl napsal(a):

Zacal bych kontrolou od databaze. Vytahl bych inkriminovany SQL prikaz z Ladenky a zkusil ho z ruky, jestli je v poradku.

Na ten jsem právě koukal:

SELECT `id`
FROM `users`
WHERE (`username` = 'aasasdasdasd')

ROWS 0

Nemá důvod házet false, když je výsledek 0.

Honza.Mottl
Člen | 104
+
0
-

A kod bych upravil tak, aby funkce vzdy vracela navratovou hodnotu. Treba takto

public function duplicity($column,$item) {
    return $this->database->table(self::TABLE_NAME)->where($column,$item)->count() > 0;
}
Honza.Mottl
Člen | 104
+
0
-
public function duplicityUsername($item) {
       return $this->model->duplicity('username',$item->value);
   }
kiCkZ
Člen | 153
+
0
-

Honza.Mottl napsal(a):

public function duplicityUsername($item) {
       return $this->model->duplicity('username',$item->value);
   }

Tak i s tímto mám úplně stejný problém.

jiri.pudil
Nette Blogger | 1032
+
+2
-

Validační funkce pro formulář má obrácenou logiku, takže správně tam má být ještě negace:

public function duplicityUsername($item) {
    return ! $this->model->duplicity('username',$item->value);
}

A v rámci redukování WTF momentů ji můžeš rovnou i přejmenovat, třeba na isUniqueUsername :)

Editoval jiri.pudil (6. 9. 2017 16:32)

kiCkZ
Člen | 153
+
0
-

jiri.pudil napsal(a):

Validační funkce pro formulář má obrácenou logiku, takže správně tam má být ještě negace:

public function duplicityUsername($item) {
    return ! $this->model->duplicity('username',$item->value);
}

A v rámci redukování WTF momentů ji můžeš rovnou i přejmenovat, třeba na isUniqueUsername :)

Jirko moc děkuju, taková maličkost a tolik trápení :D
Tohle si musim pamatovat :D Nevíš zda je to i v dokumentaci ?

jiri.pudil
Nette Blogger | 1032
+
+2
-

V dokumentaci to tuším nijak explicitně není, ale ono to docela dává smysl: funkce vrací true, pokud hodnota odpovídá validačnímu pravidlu, a false, pokud neodpovídá. Validační pravidlo je v tvém případě „uživatelské jméno není duplicitní/je unikátní“, proto jsem ti navrhoval tu funkci pojmenovat isUniqueUsername; když si ji správně pojmenuješ, už se nemusíš moc zamýšlet nad tím, jakou pravdivostní hodnotu má vlastně vrátit :)