Problém s ověřením duplicity v databázi (MySQL)
- kiCkZ
- Člen | 153
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
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
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
Zacal bych kontrolou od databaze. Vytahl bych inkriminovany SQL prikaz z Ladenky a zkusil ho z ruky, jestli je v poradku.
- kiCkZ
- Člen | 153
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
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
public function duplicityUsername($item) {
return $this->model->duplicity('username',$item->value);
}
- jiri.pudil
- Nette Blogger | 1032
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
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
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 :)