tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

NULL v poli dat přímo z formuláře

před 10 lety

Michalek
Člen | 192
$data=$form->getValues();

dibi::update('uzivatel', $data)
  ->where('id=%i',$id)
  ->execute();

dibi::test = UPDATE `uzivatel` SET ... `kredit`='' ... WHERE id=3

Potřeboval bych, aby to vypadalo jako kredit=NULL :-) Ty data přejímám přímo z formuláře. Hodně jsem tady na fóru našel, jenže na tomhle si lámu zuby už dlouho, neumím to nějak vtipně zkombinovat třeba se %sn. Je tam na to nějaký fígl? Díky moc.

před 10 lety

kravco
Člen | 723

Michalek napsal(a):

$data=$form->getValues();

dibi::update('uzivatel', $data)
  ->where('id=%i',$id)
  ->execute();

dibi::test = UPDATE `uzivatel` SET ... `kredit`='' ... WHERE id=3

Potřeboval bych, aby to vypadalo jako kredit=NULL :-) Ty data přejímám přímo z formuláře. Hodně jsem tady na fóru našel, jenže na tomhle si lámu zuby už dlouho, neumím to nějak vtipně zkombinovat třeba se %sn. Je tam na to nějaký fígl? Díky moc.

Ja som tento „problém“ riešil takto:

$data = $form->getValues();

$data['kredit%sn'] = $data['kredit'];
unset($data['kredit']);

// do the stuff...

Čisté to veľmi nie je, fungovať to funguje…

Keď som skúšal finty ako setType(), prípadne „čarovnú“ DibiVariable, neuspel som, pretože funkcionalita modifikátora %sn nereprezentuje žiaden typ. Možno by problém pohol v budúcnosti vyriešiť hybrid medzi validátorom a filtrom… uvidíme :)

před 10 lety

Michalek
Člen | 192

Díky, právě přes setType jsem to taky zkoušel, ale taky bez úspěchu :-) Tohle je moc zajímavý, jdu to tam nahodit, ještě jednou díky.

před 10 lety

phx
Člen | 652

Osobne to resim obecne takto:

$data = $form->getValues();

foreach ($data as $key=>$value) {
    if (!$value) {
        $data[$key] = null;
    }
}

Popripade nejaky vyjimky na ciselne hodnoty (0) nebo misto projiti pole vyjmenovat ktere prvky pole prochazet.

před 10 lety

kravco
Člen | 723

phx napsal(a):

Osobne to resim obecne takto:

$data = $form->getValues();

foreach ($data as $key=>$value) {
  if (!$value) {
      $data[$key] = null;
  }
}

Popripade nejaky vyjimky na ciselne hodnoty (0) nebo misto projiti pole vyjmenovat ktere prvky pole prochazet.

Presne, to ti nahradí číselné hodnoty 0 (int) a prázdny string "" (string), čo síce môže byť želané, ale čo je horšie, nahradí to aj špecifický string "0" (string), ktorý zvačša nahradiť nechceme…

před 10 lety

phx
Člen | 652

Pravda… staci tedy spravne upravit podminku:)

před 10 lety

Jod
Člen | 703

Ja na null používam new DibiVariable(‚NULL‘, ‚sql‘);

před 10 lety

oerto
Člen | 8

omlouvam se jen v rychlosti treba ti pomuze tohle

$this->connection->select(‚idCombo‘)
->select($sloupec)
->from(‚comba‘)
->where ($sloupec.' IS NOT NULL')
->fetchPairs(‚idCombo‘, $sloupec);

jen tam nebude IS NOT NULL, IS NULL

před 10 lety

viktorc
Člen | 21

kravco napsal(a):

Ja som tento „problém“ riešil takto:

$data = $form->getValues();

$data['kredit%sn'] = $data['kredit'];
unset($data['kredit']);

// do the stuff...

Čisté to veľmi nie je, fungovať to funguje…

Práve začínam s dibi a nad týmto som dnes tiež maturoval. Vo formulári mám pole dátum a keď ho užívateľ nevyplní, dostávam prázdny reťazec, ktorý samozrejme databáza do poľa typu date nezoberie. Predpokladám, že očakávané chovanie je uložiť tam NULL.
Riešenie od kravca je funkčné, ale pracné.

Elegantnejšie mi pripadá buď:

  1. Doplniť k modifikátoru %v (resp. prečo nie aj k ostatným – %a, %l, alebo aj %d, %t) NULL variantu – %vn (%an, %ln, %dn, %tn), ktorá by '' v hodnotách poľa nahrádzala ‚NULL‘.

A robiť insert/update cez

dibi::query('insert into [table] %vn', $data);
dibi::query('update [table] set %an', $data, 'where [id]=%i', $data['id']);

alebo

  1. Upraviť DibiTranslator::formatValue tak, aby defaultne (bez modifikátora) pri práznom reťazci vracala ‚NULL‘;
public function formatValue($value, $modifier) {
    ....
    // without modifier procession
    if (is_string($value))
        // return $this->driver->escape($value, dibi::TEXT);
        return $value == ''? 'NULL': $this->driver->escape($value, dibi::TEXT);
    ...

Toto (b) je však dosť vážny zásah, takže možno by bolo lepšie, keď by sa dala defaultna konverzia '' ⇒ ‚NULL‘ zapnúť zvonku.
Na druhej strane by potom (na rozdiel od (a)) fungoval aj fluent insert/update bez nutnosti úprav

dibi::insert('table', $data)->test();
dibi::update('table', $data)->where('[id]=%i', $data['id'])->test();

Čo Vy (a hlavne David) na to?

Editoval viktorc (8. 9. 2009 18:04)