Îmi vine să urlu

M-am culcat pe la ora 4 când, dpă o zi întreagă de programare, baze de date, tabele, etc mi se împăienjeneau ochii. Cred şi eu, de la oboseală. Dar să încep cu începutul.

Ieri m-am apucat să fac un plugin de system, pentru Joomla! Şi parto ore am înjurat ca ultimul birjar. De ce nu mergea? Pentru că fişierul avea un nume tâmpit. Nume dat de mine, evident. În fine, l-am făcut să meargă.

Apoi m-am apucat să mai fac nişte chestii. La un moment dat interogam baza de date şi dintr-o dată sistemul meu devenise foarte lent. Extrem de lent. Mă uit în log-ul de erori de la Apache (webserver), cu Notepad. Eroare: "The file is too large and cannot be opened with Notepad".

Măi să fie. Acum treizeci de secunde avea 4,18 KB. Acum cât are? Şi mă uit. 2 GB. Adică trei CD-uri şi ceva, sau o jumătate de DVD. Mult. Pentru posteritate:

Pentru cunoscători (puteţi sări peste aceste paragrafe dacă nu sunteţi cu programarea): Făcusem o introgare OOP (Programare Orientată pe Obiecte) a bazei de date folosind sintaxa de Joomla! pentru framework-ul respectiv. Aşa:

$db = & JFactory::getDBO(); //Cerem acces la baza de date
$db->setQuery( ‘SELECT * FROM #__tabel WHERE `ic`="’.$row->ic.’" ORDER BY `id` DESC LIMIT 1′ );  //interogăm baza de date
$obiect = $db->loadObjectList();  //încărcăm rezultatul interogării precedente

while ($obiect) //cât timp avem un obiect

{

for ($i=0, $i<=9, $i++) // pentru fiecare element din obiect

    {

    $info[] = $obiect[i]; //îi luăm valoarea şi o dăm altcuiva

    }

}

Pare corect, nu? Da, doar pare. Pentru că în realitate funcţia loadObjectList() îmi returnează mai multe obiecte. Şi ce parsam eu acolo nu mă întrebaţi. Ştiţi unde era greşeala? Trebuia să folosesc loadObject(). Atât. Deci un singur cuvânt mi-a generat 2GB de erori la o singură execuţie…

Să revin. Deci fac toată ziua programare. Ba mă bucur, ba mă enervez. Etc. Şi mă culc pe la ora 4 dimineaţa cu ochii împăienjeniţi, după cum spuneam. Ba chiar mi-am pus şi mobilul pe silenţios, ca să pot să dorm şi să nu păţesc ca ieri. Şi ce credeţi? Pe la ora 9 dimineaţa sună fixul, chiar lângă urechile mele… Cum să nu-mi vină să urlu?

5 Comentarii

  1. skywalker 28 iunie 2009 la 08:27 - Raspunde

    ar fi bine ca de acum înainte să-ți iei măsuri de precauție cînd ști că vrei să dormi pînă tîrziu 😀

    • Robin Molnar 28 iunie 2009 la 11:47 - Raspunde

      😆 O să deconectez telefonul că altă soluţie nu văd. Culmea culmilor… După aceea mâţa a umblat pe lângă telefon şi a scos receptorul din furcă… 😆

  2. Mihai Todor 28 iunie 2009 la 11:09 - Raspunde

    Man, read the f\’kin manual: [url=http://help.joomla.org/content/view/709/212/]1[/url] şi [url=http://help.joomla.org/content/view/708/212/]2[/url]. Zice foarte clar şi la obiect ce fac ambele funcţii.

    Hai să o iau în ordine:

    Ce anume vrei să faci? Ai nevoie de un singur rând din \”#__tabel\”? După cum ai scris acel query (WHERE `ic` = \” \’ .$row->ic. \’ \” ), tind să cred că da, caz în care clauza ORDER BY şi LIMIT 1 nu îşi mai au rostul!

    După cum zice şi în documentaţie, funcţia loadObjectList este folosită pentru a extrage un array de obiecte iar loadObject pentru a extrage un singur obiect. Acuma nu te opreşte nimeni să foloseşti loadObjectList în loc de loadObject chiar dacă selectul tău returnează un sigur obiect. Ideea e să prelucrezi rezultatul cum trebuie.

    Eu tind să cred că ai folosit iniţial loadObject şi ai tratat rezultatul ($obiect) ca răspunsul lui loadObjectList adică ai considerat că e array de obiecte şi de aia ţi-a crăpat.

    [quote]for ($i=0, $i

  3. Mihai Todor 28 iunie 2009 la 11:11 - Raspunde

    Mda, super… S-a pierdut jumate de comment… Hai că îţi explic mai târziu pe mess dacă e că acu\’ mă cam grăbesc…

    • Robin Molnar 28 iunie 2009 la 11:50 - Raspunde

      😆 Dude, aia am rezolvat-o, mersi frumos. 🙂 În loc de loadObjectList() trebuia doar loadObject(), adică un rând din tabel. În fine. Ajută-mă cu o treabă. De azi dimineaţă mă chinui să resetez table ordering-ul din Joomla Pagination (JPagination class). Morţii mă-sii, băga-mi-aş. Şi nu găsesc ajutor pe nicăieri. Please help. :s M-am găsit şi pe Google când am întrebat pe forum, acum câteva ore, aşa de relevantă este întrebarea mea. :dry:

Lasa un raspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Vreau să fiu părtaș la faptă. Poți, de asemenea, să fii părtaș și fără martori.

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.