dynamické generování dotazu

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

Zdravím,
Hodil by se mi přibližně takovýto model:

<?php
	public function update ($id, $record, $editor) {
		$dotaz = '$this->find($id)->update(array(';
		$run = false;
		foreach ($record as $key=>$value) {
			$run = true;
			if (is_bool($value) or is_numeric($value)) {
				$dotaz .= "'$key'=>$value, ";
			} else {
				$dotaz .= "'$key'=>'$value', ";
			}
		}
		if ($run) {
			$dotaz .= "'edited'=>new \DateTime()));";
			$return = eval("return $dotaz;");
			return $return;
		} else {
			return 0;
		}
	}
?>

V zásadě to sice ve většině případů chodí, ale teď jsem narazil na zprávu

Possible problem: you are sending a HTTP header while already having some data in output buffer. Try OutputDebugger or start session earlier.

A nevím, proč. Děkuji za radu.

David Matějka
Moderator | 6445
+
+18
-

co tam dela ten eval??

Editoval matej21 (18. 8. 2014 14:01)

jik
Člen | 149
+
-8
-

matej21 napsal(a):
EDIT: co tam dela ten eval??

A jak jinak nechám provést dotaz sestavený dynamicky?

Robin Martinez
Člen | 89
+
+3
-

py tíčo…

O_o

začal bych tím, že to celý předělám = zbavil se evilu evalu a dotaz skládal normálně (poslal jako pole).

Editoval 3ugeene (18. 8. 2014 14:39)

bazo
Člen | 620
+
+3
-

uff, pouzi nette database alebo dibi alebo doctrine alebo iny orm. v kazdom z nich sa daju dynamicky skladat dotazy, bez takychto divocin ako mas ty

Glubo
Člen | 12
+
+6
-

No pro začátek o dost lepčí zápis téhož vypadá nějak takto:

<?php
public function update ($id, $record) {
	if (!$record)
		return 0;
	return $this->find($id)->update(array_merge($record, ['edited' => new \DateTime()]));
}
jik
Člen | 149
+
+2
-

Aha, už mi kapalo na karbid, takže:

<?php
	public function update ($id, $record) {
		return = $this->find($id)->update($record);
	}
?>

a funguje…

Glubo
Člen | 12
+
0
-

jik napsal(a):

Aha, už mi kapalo na karbid, takže:

<?php
	public function update ($id, $record) {
		return = $this->find($id)->update($record);
	}
?>

a funguje…

Btw. to edited se takhle samo spravne updatne?

Robin Martinez
Člen | 89
+
0
-

Glubo napsal(a):

jik napsal(a):

Aha, už mi kapalo na karbid, takže:

<?php
	public function update ($id, $record) {
		return = $this->find($id)->update($record);
	}
?>

a funguje…

Btw. to edited se takhle samo spravne updatne?

ne, leda to řeší někde před tím :D

Editoval 3ugeene (18. 8. 2014 16:10)

Mysteria
Člen | 797
+
0
-
<?php
  public function update ($id, $record) {
      return $this->find($id)->update($record + ['edited' => new \DateTime()]);
  }
?>

Případně úplně nejčistší řešení je nastavit ten sloupec v databázi s příznakem ON UPDATE CURRENT_TIMESTAMP.

Editoval Mysteria (18. 8. 2014 16:16)

Glubo
Člen | 12
+
0
-

Mysteria napsal(a):

<?php
  public function update ($id, $record) {
      return $this->find($id)->update($record + ['edited' => new \DateTime()]);
  }
?>

Případně úplně nejčistší řešení je nastavit ten sloupec v databázi s příznakem ON UPDATE CURRENT_TIMESTAMP.

On někde napsal, jaký db systém používá?

Mysteria
Člen | 797
+
-1
-

A nějaký databázový systém snad tuhle funkcionalitu nemá?

jiri.pudil
Nette Blogger | 1032
+
-1
-

A nějaký databázový systém snad tuhle funkcionalitu nemá?

Tohle neumí žádný kromě MySQL.

Pavel Macháň
Člen | 282
+
0
-

jiri.pudil napsal(a):

A nějaký databázový systém snad tuhle funkcionalitu nemá?

Tohle neumí žádný kromě MySQL.

Třeba Oracle má možnost tuto:

insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);

Případně vytvořit trigger který CURRENT_TIMESTAMP použije a updatne záznam

Editoval Pavel Macháň (19. 8. 2014 19:46)

Glubo
Člen | 12
+
0
-

Mysteria napsal(a):

A nějaký databázový systém snad tuhle funkcionalitu nemá?

Což o to, funkcionalitu ano, nicméně ne pod toudle mysql specific syntaxí. Třeba v postgresu a oracle se to dělá přes triggery.