Ako testovať vrátené hodnoty z DB

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

Zdravím,
robím akurát registračný formulár a narazil som na problém.
Neviem ako otestovať hodnotu vrátenú z DB.
Mám registračný formulár. Po odoslaní chcem zistiť, či v DB už existuje niekto s rovnakým menom(kôli duplicitám).
Ako sa to v Nette píše? Mám toto:

	public function registFormSucceeded($form)
	{
		$values = $form->getValues();

		$username = $this->database->table('users')->where('username = ?', $values['username']);
		if($username['username']) <- ?????????
		{
			$this->flashMessage('Zadané meno je už obsadené iným užívateľom. Vyberte si prosím iné.', 'success');
			$this->redirect('this');
		}

		$this->database->table('users')->insert(array('username' => $values['username'],
			'password' => sha1($values['password'])));

		$this->flashMessage('Boli ste úspešne zaregistrovaný.', 'success');
		$this->flashMessage('Teraz sa môžete prihlásiť.', 'success');
		$this->redirect("Sign:in");

	}
}

Editoval Čamo (2. 6. 2014 17:54)

David Matějka
Moderator | 6445
+
0
-

v $username mas selection, za where pridej ->fetch(), coz ti vrati radek, viz treba https://forum.nette.org/…object-given

a nepouzivej sha1, ale treba Nette\Security\Passwords (v nette od 2.2)

Editoval matej21 (2. 6. 2014 18:05)

Čamo
Člen | 798
+
0
-

matej21:
Díky.
Takto je to správne: if($result->fetch()){} ???

Oli
Člen | 1215
+
0
-

Zalezi na tom, co chces testovat. Pokud očekáváš jeden řádek tak je to správně takhle (pokud očekáváš ActiveRow). Pokud očekáváš víc řádků (Selection), tak potom použij

if (count($result)){} // nebo if($result->count()){}
JDC
Člen | 19
+
0
-

Takhle bych to neřešil. Lepší je ten sloupec dát jako UNIQUE a pak to testovat v nette pomocí try {} catch {}, kde si odchytíš PDOException a pak přes $e->errorInfo (vrací array!) si ověříš přímo chybový kód, který hlásí MySQL. Krásně je to popsané tady Tímto krásně ušetříš ten SELECT dotaz navíc :)

Čamo
Člen | 798
+
0
-

JDC:
Tiež ma to napadlo s tým unikatným stĺpcom.