Autor | Zpráva | ||
---|---|---|---|
pcmanik Profil |
#1 · Zasláno: 6. 2. 2013, 23:15:04
Dobrý večer,
začal som prerábať zdrojové kódy na extenziu PDO a narazil som na nasledujúci problém. Mám funkciu: function dalsia_sprava($sql, $id, $i, $pocet) { if ($pocet != $i) { mysql_data_seek($sql, $i); $result = mysql_fetch_array($sql); if ($result['id'] == $id) { echo '<br>'.vystup($result['sprava']); $i++; dalsia_sprava($sql, $id, $i, $pocet); } else mysql_data_seek($sql, $i); } } function dalsia_sprava($sql, $id, $i, $pocet) { if ($pocet != $i) { $result = $sql->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_ABS, $i); if ($result['id'] == $id) { echo '<br>'. smajlici(vystup($result['sprava'])); $i++; dalsia_sprava($sql, $id, $i, $pocet); } else $sql->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_ABS, $i); } } Po hladaní som prišiel na to, že je potrebné doplniť array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL) do PDO::Prepare, ale táto zmena nemala žiadny účinok. Za každú radu, ako by sa dal kód opraviť budem vďačný. |
||
Joker Profil |
#2 · Zasláno: 7. 2. 2013, 11:51:35
pcmanik:
Rozdíl podle mě bude v té else části na řádku 8 (v původním kódu ř. 9), protože zatímco mysql_data_seek posune ukazatel, metoda fetch vrátí záznam. Čili podle mě v tom novém kódu výsledkem řádku 8 není nic (vrátí se data z databáze, se kterými se nic neudělá). Pokud někde venku další kód spoléhá na to, že mu ta funkce někam nastaví ukazatel, asi to nebude fungovat. Nejsem si jistý, jak v PDO ten ukazatel nastavit. Nicméně jestli je příčinou to co jsem napsal, možná by stálo za to to celé přepsat do nějaké lepší podoby. Když už to stejně měníte. V první řadě by běh funkce nikdy neměl mít „vedlejší účinky“ na okolí (tzn. že funkce něco zpracuje a kromě toho zůstane nějak nastavený ukazatel, na což okolní kód spoléhá a pak s tím pracuje). Nejenže to způsobuje problémy při údržbě, jak ostatně ukazuje tento dotaz, ale navíc to může způsobovat těžko dohledatelné chyby. A je dobré i u funkcí dodržovat single responsibility principle z objektového programování: Jedna metoda (zde tedy funkce) by měla mít na starosti jen jednu činnost. Ta uvedená dělá tři nesouvisející věci: Čte data z databáze, vypisuje věci do stránky a nastavuje ukazatel ve výsledku SQL dotazu. |
||
pcmanik Profil |
Joker:
Ďakujem za odpoveď, ale spravil som to inak. Zmenil som cyklus, ktorý tie správy vypisuje, tak aby táto "pomocná" funkcia už nebola potrebná a funguje mi to bez problémov. Tým pádom už nemám žiadny "vedľajší účinok" na okolie. Ešte raz ďakujem, po prečítaní odpovede, som sa nad tým viac zamyslel a zistil že tú funkciu netreba :) |
||
Časová prodleva: 11 let
|
0