PHP fóra: Builder | JakPsatWeb | Webtrh
Nejste přihlášen(a)
Stránky: 1
Ahoj, potřebuji poradit. Mám zde funkci, ale provede jen první operaci a na druhou se zřejmě už nedostane. Můžete mi poradit jestli v rámci jedné funkce modelu lze třeba aktualizovat více řádek v databázi pomocí UPDATE ?
Zmiňovaná funkce:
<?php
function posun_nahoru($id_stranky,$poradi_posunovane_radky)
{
$poradi_predchozi_radky = $poradi_posunovane_radky - 1;
$this->db->update('clanky', array('poradi' => $poradi_predchozi_radky), array('id_stranky' => $id_stranky, 'poradi' => $poradi_posunovane_radky));
$this->db->update('clanky', array('poradi' => $poradi_posunovane_radky), array('id_stranky' => $id_stranky, 'poradi' => $poradi_predchozi_radky));
}
?>
// Editoval Tomik: Kód obarven…
Precti si jak spravne vkladat kod do fora zde
Jak na druhou se zrejme nedostane??? To to samovolne skonci? Nebo nejaka chyba???
Nechapu proc by neslo poslat 2 SQL dotazy za sebou.
Jaky DB layer pouzivas?
@karapa: neznám codeigniter, ale takovou záludnost snad nedělá žádný
fw ani db layer. jediné smysluplné co mě napadá je to, že máš třeba na
id_stranky a poradi společný unikátní klíč a
chybuje to při té změně
zadna chyba neni. Vsechno to probehne ale bohuzel se spatnym vysledkem. Jinak oba sql dotazy zvlast funguji ale soucasne zapsany ne. Takze chyba je nejspise jinde nez v kodu. Pouzivam XAMPP v zakladnim nastavenim a PHPMYADMIN na serveru. Nemáte tušení kde může být chyba ? Možná jsem neodpověděl na ten DB LAYER …
Dejme tomu, ze $poradi_posunovane_radky = 10 → $poradi_predchozi_radky = 9.
Ty ale provedes $poradi = 9 kdyz $poradi = 10 a potom $poradi = 10 kdyz $poradi = 9.
Coz by melo udelat to, ze ve vesledku bude mit 2 radky s poradim 10. Nebude v tomto problem?
Pokud ne tak posli CREATE tabulky a konkretni SQL prikazy do DB.
ted mam tuhle funkci …
<?php
function posun_nahoru($id_stranky,$poradi_posunovane_radky)
{
$this->db->set('poradi', $poradi_posunovane_radky, FALSE);
$this->db->where(array('id_stranky' => $id_stranky, 'poradi' => $poradi_posunovane_radky - 1));
$query_2 = $this->db->update('clanky');
$this->db->set('poradi', $poradi_posunovane_radky - 1, FALSE);
$this->db->where(array('id_stranky' => $id_stranky, 'poradi' => $poradi_posunovane_radky));
$query_1 = $this->db->update('clanky');
}
?>
přišel jsem na to … chyba je tam, že já si vezmu řádku a té přepíšu pořadí na o jedničku větší a pak hledam řádku s pořadím ale které jsem si už přepsal a nenajdu tu správnou řádku
Editoval karapa (27. 8. 2009 9:53)
Takze uz to funguje?
Zase ten nebarevnej php kod???!!!
NE NE tohle nefunguje a asi ani nebude. Je tam obycejna chyba. Dve radky maji po prvnim UPDATE stejne poradi a ja uz se nedostanu k te co potrebuji abych ji zmenil poradi o jednicku mene. Pouziju k tomu jeste jeden parametr ID te radky kterej je pro kazdou radku unikatni a tim se k ni dostanu a zmenim ji poradi jak potrebuji.
diky za odpovedi
funkce ktera jiz funguje:
<?php
function posun_nahoru($id_stranky,$poradi_posunovane_radky,$id) // novy parametr $id, unikatni
{
$this->db->set('poradi', $poradi_posunovane_radky, FALSE);
$this->db->where(array('id_stranky' => $id_stranky, 'poradi' => $poradi_posunovane_radky - 1));
$query_2 = $this->db->update('clanky');
$this->db->set('poradi', $poradi_posunovane_radky - 1, FALSE);
$this->db->where(array('id_stranky' => $id_stranky, 'id' => $id));
$query_1 = $this->db->update('clanky');
}
?>
Fajn:) Sice to nove reseni moc nechapu, ale to bude asi neznalosti CodeIgniter. Osobne na takoveto pripady pouzivam but PK radku nebo priznakovy sloupec. A to cele uzavrene v transakci aby to bylo atomicke.
Jen pozor aby jsi mel neprerusovanou cislovanou radu, protoze pouzivat poradi – 1.
aha! jak evidentní :P
mimochodem, když se oprostíme od těch ‚všemocných‘ db layerů, tak to jde i jedním dotazem
UPDATE `clanky` SET `poradi` = IF(`poradi` = $prvni, $druhy, $prvni) WHERE `id_stranky` = $idStranky AND `poradi` IN ($prvni, $druhy)