Jaka je return hodnota po ->update()

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

Ahoj

narazil jsem na divne chovani, ono to mozna divne chovani neni, tak se radji ptam.

mam jednoduchy update

public function get($id)
{
	return $this->database->table('users')->get($id);
}

...
// po odeslani formulare udelej...
$data = array();
$data['name'] = $v->name;
$status = $this->get($userId)->update($data);

pokud ve formulari nastavim jine jmeno nez je ulozeno v databazi vraci $status TRUE, ale pokud je jmeno stejne jako je v databazi (tj.: uzivatel kliknul jen na save, ale nic nezmenil) tak vysledek je FALSE.

je to tak spravne? Pro me to je celkem neocekavane chovani, ikdyz chapu ze technicky zadny radek nebyl zmenen. Ale jak tedy mam zjistit ze to probehlo bez chyby? ze nevyskocila zadna vyjimka?

H.

David Matějka
Moderator | 6445
+
0
-

ze nevyskocila zadna vyjimka?

presne tak, pri chybe vyskoci PDOException

David Grudl
Nette Core | 8228
+
0
-

Testovat návratovou hodnotu nemá smysl u žádné funkce z NDB, jestli se nepletu.

chemix
Nette Core | 1310
+
0
-

A pokud si PDOException neodchytnu hodi to 500 a vsichni vidi ze je chyba. Takze ja se k tomu muzu chovat jako ze se to provede vzdy…?

	public function edit($userId, $change)
	{
		$data = array();

		if (isset($change['name'])) {
			$data['name'] = $change['name'];
		}

		$avatar = NULL;

		if ($this->useFiles && isset($change['avatar'])) {
			$avatar = $change['avatar'];

			if ($avatar->isOk()) {
				$data['avatar'] = $this->saveImage($avatar);
			}
		}

		$this->get($userId)->update($data);

		return $this->get($userId);
	}

nebo je lepsi toto?

	public function edit($userId, $change)
	{
		$data = array();

		if (isset($change['name'])) {
			$data['name'] = $change['name'];
		}

		$avatar = NULL;

		if ($this->useFiles && isset($change['avatar'])) {
			$avatar = $change['avatar'];

			if ($avatar->isOk()) {
				$data['avatar'] = $this->saveImage($avatar);
			}
		}

		try {
			$this->get($userId)->update($data);
			$status = TRUE;
		} catch (\PDOExcaption){
			$status = FALSE;
		}

		if ($status){
			return $this->get($userId);
		} else {
			return FALSE;
		}
	}


// + o uroven vyse v presenteru

	...

		$status = $this->userManager->edit(
			$this->user->id,
			array(
				'name' => $values->name,
				'avatar' => $values->avatar)
		);

		if ($status){
			// do other stuff
			$this->flashMessage('Ok');
		} else {
			// problem...
			$this->flashMessage('Upsss', 'error');
		}
David Matějka
Moderator | 6445
+
0
-

@chemix pokud chces tu chybu chytat, tak ji zaloguj. jinak budes vedet prd, ze se stala…

ale ja takovyhle vyjimky, u kterych neni predpoklad, ze se za normalnich okolnosti vyvolaji, vubec nechytam. proste je necham spadnout do error presenteru.

Myiyk
Člen | 321
+
0
-

Já chytám chyby jen tam, kde je možnost problému s UNIQUE INDEX. V takových případech PDOExpection má kód 23000. Když ta chyba má jiný kód, tak ji zase vyhodím (throw).

Nevím jestli to je zrovna ideální postup, ale přijde mi to spolehlivé.