tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Ignorovanie prazdnych hodnot pri vkladani do databazy z pola

před 7 lety

fliper333
Člen | 36

Ahojte,

Potreboval by som poradit, ci dibi dokaze pri vkladani riadku do databazy ignorovat „prazdne“ hodnoty (0, ''). Formulare vytvaram v nette a po uspesnej validacii ukladam udaje do DB takto nejak:
"

dibi::query('INSERT INTO [table]', $this->_form->getValues());

(v skutocnosti to mam rozdelene medzi controllerom a modelom, sem to pisem do 1 prikazu pre zjednodusenie)

Problem je v tom, ak su vo formulari nepovinne polia, a uzivatel ich nevyplni, tak sa do databazy ulozi prazdny string, co potom robi problemy napriklad funkcii COALESCE. Momentalne to robim tak, ze si vysledok ulozim do pomocnej premmenej, foreachom ju prejdem a vymazem prazdne hodnoty. Takto nejak:

$values = $this->_form->getValues();
foreach ($values as $key => $value) if ($value === '') unset($values[$key]);
dibi::query('INSERT INTO [table]', $values);

Viem ze ak udaje vkladam po jednom tak existuju modifikatory napr %sN, ktore funguju vinijakuco, ale daju sa tieto modifikatory pouzit aj v mojom pripade? Ak ano ako?

Za odpoved vopred dakujem :)

před 7 lety

fliper333
Člen | 36

Este to upresnim. Ak ukadam do DB hodnoty, pouzivam

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

Aby sa povodne hodnoty prepisali NULL, ak ich uzivatel vymazal.

Ak hladam v databaze, pouzivam

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

aby dibi ignoroval nevyplnene udaje vo vyhladavacom formulari

PS: Pre selecty mam vytvorenu funkciu, ktora do zoznamu moznosti prida „prazdnu moznost“ tak, ze jej hodnota je prazdny string, aby som selecty mohol precistit spolu s textovymi vstupmi.

function _addEmptyOption($options, $optionKey = NULL, $optionVal = '')
{
    return array($optionKey => $optionVal) + $options;
}

před 7 lety

Milo
Nette Core | 1119

Žádnou takovou „automatiku“ dibi neumí. Při insertu nebo updatu lze v poli použít modifikátor u klíče, ale ve Tvém případě to nepomůže.

dibi::query('INSERT INTO [tabulka]', array(
    'id%i' => 1,
    'name%sN' => $name,
));

před 7 lety

fliper333
Člen | 36

Jasne, chapem. To co si napisal obcas pouzivam ako riesenie, ale da sa pouzit iba v pripade, ze je pole ktore vkladam staticke (v pripade ak formular generujem dynamicky podla prav uzivatela by som si to iba viac skomplikoval).

Dakujem za odpoved.