Oznámení
insert ako asociativne pole
před 11 lety
- greppi
- Člen | 2
Ahojte,
pri pouzivani Dibi som narazil na jeden problem.
Tento kod spolahlivo funguje:
<?php
$arr = array(
'pole' => 'hodnota',
'bit' => TRUE,
);
dibi::query('INSERT INTO [table]', $arr);
?>
Ale co ak mam pole poli kde mam tie hodnoty (?), viac ukazka:
<?php
$arr = array(
array('pole' => 'hodnota1', 'bit' => TRUE,),
array('pole' => 'hodnota2', 'bit' => TRUE,),
array('pole' => 'hodnota3', 'bit' => TRUE,)
);
dibi::query('INSERT INTO [table]', $arr);
?>
Je nato v Dibi nejaka feature ?
před 11 lety
- David Grudl
- Nette Core | 6806
Ty bys potřeboval zapsat
dibi::query('INSERT INTO [table]', $arr[0], $arr[1], ...);
což se dá docílit modifikátorem %ex
(jako expand)
dibi::query('INSERT INTO [table] %ex', $arr);
před 11 lety
- oerto
- Člen | 8
Ahoj ve spolek. Nevíte někdo jak ošetřit formát času při vkládaní dat asociat.polem pomocí DIBI.
<?php
foreach ($arrCSV as $radek){
list( $arr[opravenka],
$arr[typVyrobku],
$arr[druhVyrobku],
$arr[vyrobce],
$arr[typOpravy],
$arr[stavOpravy],
$arr[datumReklamace], //datum
$arr[datumPrijeti], //datum
$arr[datumUkonceni], //datum
$arr[telefon],
$arr[email],
$arr[cenaOpravy],
$arr[kodProdejce],
$arr[reklamacniProtokol])= explode(";",$radek);
dibi::query('INSERT INTO [opravy]', $arr);
}
?>
před 11 lety
- phx
- Člen | 652
Napada me neco jako
$arr[datumReklamace] = date("...", $arr[datumReklamace]);
A nebo pokud to je datum jako text tak nejaky sikovny regulerni vyraz, kterym zprehazis cisla do spravneho poradi.
před 11 lety
- oerto
- Člen | 8
Diky za radu, osetreny regulernim vyrazem to jiz mam, ale zajimalo mi jestli je to mozne pomoci DIBI, myslim ze v quick startu je zmineno, ze pri vkladani polem se da pouzit modifikator %d jenom na cele pole, coz mi fungovalo. Zkousel jsem vytvorit dve pole, jednom pro normalni sloupce a jedno pro datumove s modifikatorem %d, ale to se mi nepodarilo nejak sesmolit.
před 11 lety
- David Grudl
- Nette Core | 6806
Zkus tam dat ... $arr['datumReklamace%d'], ...
před 11 lety
- oerto
- Člen | 8
děkuji, funguje to super i s %ex, když to vkládám jedním sql příkazem a ne po řádkách v cyklu
před 11 lety
- kravco
- Člen | 723
oerto napsal(a):
Ahoj ve spolek. Nevíte někdo jak ošetřit formát času při vkládaní dat asociat.polem pomocí DIBI.
Rovnaký problém akurát riešim i ja. Mám asociatívne pole, ktoré obsahuje dáta – tie môžu byť rôznorodého typu, niektoré sú dátumy (unix timestampy). Informáciu o typoch mám v druhom poli, čiže na príklade to vyzerá asi takto:
<?php
$data = array(
'id' => 15,
'name' => 'Jožko',
'birth' => 1234567890, // unix timestamp
);
$types = array(
'id' => dibi::FIELD_INTEGER,
'name' => dibi::FIELD_TEXT,
'birth' => dibi::FIELD_DATETIME,
);
?>
Polia majú premenlivé kľúče, moja obslužná funkcia s nimi pracuje všeobecne. Pri štandardnom vkladaní
dibi::query('UPDATE people SET %a', $data)
sa mi (MySQL) vloží namiesto dátumu '0000-00-00 00:00:00'
,
čo je podľa všetkého správne, keďže dibi netuší, že to číslo má
chápať ako timestamp. Páčilo by sa mi niečo ako
dibi::query('UPDATE people SET %at', $data, $types)
alebo niečo podobné, čo by dáta najprv skonvertovalo a potom uložilo. Nakoniec, to by možno bolo ešte čitateľnejšie:
$conv_data = dibi::convert($data, $types);
dibi::query('UPDATE people SET %a', $conv_data);
Riešil niekto niečo podobné?
Prípadne existuje niečo také v dibi, len som to nenašiel?
před 11 lety
- kravco
- Člen | 723
Tak, potvrdil sa starý známy fakt, že občas sa treba na veci vyspať. dibi samozrejme vie aj toto, len trochu inak, ako som predpokladal. Riešenie by mohlo vyzerať:
$typed_data = array();
foreach ($data as $name => $value) {
$typed_data[$name] = new DibiVariable($value, $types[$name]);
}
dibi::query('UPDATE people SET %a', $typed_data);
Editoval kravco (16. 11. 2008 13:00)
před 11 lety
- phx
- Člen | 652
Tusim, ze dibi zvlada i neco takovehoto:
$data = array(
'id%i' => 15,
'name%s' => 'Jožko',
'birth%d' => 1234567890,
);
před 11 lety
- kravco
- Člen | 723
phx napsal(a):
Tusim, ze dibi zvlada i neco takovehoto:
$data = array( 'id%i' => 15, 'name%s' => 'Jožko', 'birth%d' => 1234567890, );
neskúšal som to ale podľa všetkého áno, veď
David Grudl napsal(a):
Zkus tam dat
... $arr['datumReklamace%d'], ...
Spôsob ktorý popisujem mi príde jednoduchší, aj keď je možno ukecanejší, a to preto, že pracujem s rôznymi dátami nad rôznymi typmi, nie s jedným fixným poľom. A do dát radšej nešahám, ak sa dá…
před 11 lety
- RaR
- Člen | 42
//Datum ve formuláři je d.m.Y
$form->addText('termineDate', 'Datum:');
//do databáze ho chci uložit jako unixtimestamp.
dibi::insert('termines', $form->getValues())->execute(); //což takhle nejde
//Asi bude třeba data z formuláře uložit do nějakého pole
$data = $form->getValues();`
//Pak na nich nějak provést přetypování. (Sice nevím jak, ale třeba na to přijdu)
//a potom je uložit
dibi::insert('termines', $data)->execute();
Nejde to nějak jednodušeji? Nechci vymýšlet vymyšlené.
Díky za každou radu.
před 11 lety
- David Grudl
- Nette Core | 6806
Připravuju novou verzi formulářů, která tohle bude umět. Zatím je potřeba provést přetypování manuálně.
před 10 lety
- westrem
- Člen | 398
David Grudl napsal(a):
Ty bys potřeboval zapsat
dibi::query('INSERT INTO [table]', $arr[0], $arr[1], ...);
což se dá docílit modifikátorem
%ex
(jako expand)dibi::query('INSERT INTO [table] %ex', $arr);
Presne toto som hladal, genialne!
PS: Skoda len, ze tento modifikator %ex nie je blizsie popisany aj v quick reference, odtial som totiz nebol schopny zistit, ze takto skvele funguje aj pri viacnasobnom INSERTe
před 10 lety
- phx
- Člen | 652
Ha nasel jsem drobnou chybku v dibi.
$data = array(
'id%i' => 15,
'name%s' => 'Jožko',
'birth%d' => 1234567890,
);
dibi::insert('tabulka', $data);
Nefunguje korektne:(
INSERT INTO `tabulka` (`id%i`, `name%s`, `birth%d`)
VALUES (15, 'Jožko', 1234567890)