Problém s připojením k databázi a práce s ní

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

Ahoj,
zrovna řeším ukládání dat do databáze, ale data se neukládají – nevím, zda je problém s modelem nebo s čím.
V Modelu mám nadefinovanou jednoduchou třídu:

class SqlManager
{
	public function __construct()
	{
		$this->connection = dibi::getConnection();
	}

	public function findAll($table)
	{
		return $this->connection->select('*')->from($table);
	}

        public function createItem($array)
        {
             return dibi::query('INSERT INTO [items]', $array);
         }
}

A v presenteru se snažím data zpracovat následovně:

	public function renderDefault() //tohle mi zobrazuje data v pořádku
	{
		$sql = new \SqlManager;
		$this->template->items= $sql->findAll('items')->orderBy('name');
	}

	public function processFormular(AppForm $form)
	{
		$sql = new \SqlManager;

		$arrItems = array(
		    'item1' => $values['item1'],
		    'item2'  => $values['item2'],
		    'item2' => $values['item3']
		);
		$sql->createItem($arrItems ); //tady už je problém, data se neukládají
	}

Data v poli jsou správně… Nepřehlížím nebo neopomněl jsem nějakou důležitou věc? Díky

Panda
Člen | 569
+
0
-

Co nějaká chybová hláška? Jaký dotaz ta funkce modelu vytváří (otestuješ to pomocí dibi::test(...))?

Jinak určitě by bylo vhodnější ho posílat pomocí

$this->connection->query( /* ... */ );
westrem
Člen | 398
+
0
-

Ak spravne chapem, nechces ulozit informacie o jednom iteme ale viac itemov naraz. V tom pripade to musis dibi oznamit pomocou operatoru %ex tzn. tvoja query bude vypadat:

dibi::query('INSERT INTO [items] %ex', $array);
toka
Člen | 253
+
0
-

Ve třídě SqlManager nemáš nikde definovanou proměnnou connection, i když ji v metodách (funkcích) používáš.

Manny7
Člen | 67
+
0
-

Tak už se mi to podařilo rozjet, ale popravdě – zatím moc nevím, v čem byla chyba – zkusil jsem ten kod použít jinde a jde… po přepsání funguje i u mně… divné
@Panda: posílání jsem upravil
@westrem: my fail… nazval jsem ty položky blbě – do DB se ukládá jeden řádek, item1, item2, item3 byly atributu (sloupce) toho řádku.. sorry za zmatení
@toka: hmm… tím to nebylo… ale doplnil jsem

Ale co mi vrtá hlavou:
1 – dá se nějak jednoudše vypsat přímo ten SQL dotaz, kde budu mít přímo celý ten dotaz? Ne ve formě pole (obdoba print_r), ale klasicky „INSERT INTO table SET a="retezecA“, b=44" např.? Případně i třeba s errorem toho dotazu… nějak se mi to nepodařilo vyhledat

2 – zkusil jsem následující dotazy:

return dibi::insert('tabulka', $array); // tohle mi vypíše kompletní info tak, jak to dělá print_r() -- tzn. dostanu výpis pole, kde jsou informace o připojení k databází, prvky v poli apod.
return dibi::test('INSERT INTO [tabulka]', $array); // tohle mi neudělá vůbec nic
return dibi::query('INSERT INTO [tabulka]', $array); // tohle mi uloží řádek do DB

A co mi vrtá hlavou – není ta funkčnost insert() a test() nějak prohozená? …fungují totiž nějak divně, hlavně ten insert() že mi vypíše pole mi nejde moc do hlavy

Editoval Manny7 (23. 8. 2010 13:49)

toka
Člen | 253
+
0
-

Použítí dibi::test už přímo samo vypisuje – echo. Takže return dibi::test('...') ani echo dibi::test('...') neudělá co očekáváš.

LuKo
Člen | 116
+
0
-

Manny7 napsal(a):

Ale co mi vrtá hlavou:
1 – dá se nějak jednoudše vypsat přímo ten SQL dotaz, kde budu mít přímo celý ten dotaz? Ne ve formě pole (obdoba print_r), ale klasicky „INSERT INTO table SET a="retezecA“, b=44" např.? Případně i třeba s errorem toho dotazu… nějak se mi to nepodařilo vyhledat

Viz https://phpfashion.com/…bazovy-layer#…