tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

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)