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 | 1034
+
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 | 1034
+
+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 | 1034
+
+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 :)