Autor Zpráva
pcmanik
Profil
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);
    }
}
Ktorú, ale ani po hodinách nedokážem prerobiť na PDO, tak aby správne fungovala. Skončil som pri tomto kóde, ale ten nefunguje správne. Mám pocit, že ukazateľ sa neposúva tam, kam by som chcel. Resp. ide stále len dopredu.
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
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 :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: