Oznámení
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ď:
- 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
- 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)