Ukládání NULL do databáze

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

Ahoj,
Mám formulář a v něm

$form->addText('number', 'Číslo');

Problém je, že pokud hodnota není vyplněná, tak se do databáze se sloupcem ‚number‘ int(11) uloží 0, ale já potřebuji uložit NULL. Nette si někde musí zjišťovat typ sloupce a automaticky doplnit do query 0. Výchozí hodnota sloupce je přitom nastavená na NULL.

Napadlo mě pouze

foreach ($values as $key => & $value) if ($value == '') unset($values[$key]);

Ale není to ideální

Prosím o pomoc a předem děkuji

Editoval lukas-frana (25. 6. 2016 12:20)

Ages
Člen | 129
+
+1
-

Ahoj,
Také jsem to řešil a nic lepšího než toto mě nenapadlo.

foreach ($values as $key => $val) {
            if ($values[$key] === '') {
                $values[$key] = NULL;
            }
}

Napsal jsem si vlastní metodu a veškeré ukládání do DB provádím přes tento cyklus.

Editoval Ages (26. 6. 2016 10:47)

Altimit
Člen | 82
+
-1
-

ono ti to neukládá nette, ale samotná databáze. ono to bere tak, že když je pole prázdné tak tam nic nedá, ale v číselném oboru nic = 0

GEpic
Člen | 566
+
+1
-

Altimit napsal(a):

ono ti to neukládá nette, ale samotná databáze. ono to bere tak, že když je pole prázdné tak tam nic nedá, ale v číselném oboru nic = 0

Ano, ale v programování 0 neni NULL.

Jinak https://secure.php.net/…y-filter.php

Editoval GEpic (26. 6. 2016 18:23)

kalatalabnik
Člen | 35
+
0
-

Co používáš za knihovnu na spojení do DB?

Např. v dibi je přímo modifikátor:
%iN integer, ale 0 se přeloží jako NULL

https://dibiphp.com/cs/quick-start

lukas-frana
Člen | 10
+
0
-

Používám Nette\Database a mám dojem, že tohle dělá Nette, protože nuly jsou už ve SQL. Pokud nechám prázdný prvky z pole odstranit, tak se to nestane. Pak mám další otázku, která s tím nepřímo souvisí, ale nechci zakládat nové téma:

Toto mám v BasePresenteru

$form->onSuccess[] = function (Form $form) {
            $values = $form->getValues();
            foreach ($values as $key => $value) if ($value == '') unset($values[$key]);
            $form->setValues($values, true);
            print_r($form->getValues());
        };

Nevím proč, ale pořád mi to vypisuje původní hodnoty.

Díky moc za funkci array_filter(), určitě ji použiji.

Unlink
Člen | 298
+
0
-

lukas-frana napsal(a):

Používám Nette\Database a mám dojem, že tohle dělá Nette, protože nuly jsou už ve SQL.

A ako to tam vkladáš?

$this->db->table('tabulka')->insert(['stlpec' => '']);
$this->db->query('INSERT INTO tabulka', ['stlpec' => '']);

Oba vygenerujú:

INSERT INTO `tabulka` (`stlpec`)
VALUES ('')

A db si prázdny reťazec prekonvertuje na 0.

Nevím proč, ale pořád mi to vypisuje původní hodnoty.

Lebo vymazal si tie ktoré boli prázdne, a potom ich nanovo nastavil s earse = TRUE, ale vymazanie textinputov neznamená že budú mať null ale proste ''. https://github.com/…TextBase.php#L35

Editoval Unlink (27. 6. 2016 20:41)