[php + mysql] korte sql functie: performance sucker?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
hallo allen,

ik heb een functietje geschreven om in 1 klap een hele recordset in een array op te slaan. de vraag is of dit een slordige methode is, en onnodig veel geheugen vreet. wat ik nl. doe is ik kwak alle columns en rows in een 2d- array, die ik vervolgens retourneer:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function sql2array($myquery) {

    $myresult   = mysql_query($myquery) or exit("Error while executing SQL: " . $mysql_error());
    $mynumber   = mysql_num_rows($myresult);

    if ($mynumber) {
        //
        // pomp alle columns per row in het sql object;
        //
        $row = 0;
        while ($sqlobj[$row] = mysql_fetch_assoc($myresult)) {
            $row++;
        }
    } else {
        //
        // no results;
        //
        $sqlobj = false;
    }

    mysql_free_result($myresult);
    return $sqlobj;
}

vervolgens roep ik deze aan:
code:
1
2
 $sqlobj = sql2array("SELECT label, orde FROM help_chapters ORDER BY orde ASC");
 print_r($sqlobj);

kan dit economischer? stel namelijk dat ik een recordset van 1000 rows met per row bijv. 20 columns opvraag, dan wordt er een array gemaakt die heel groot is die ik vervolgens weer wegpleur bij het verlaten vd functie (nadat ik deze weer in een array buiten de functie inlaadt).
ik ben geen oo held dus vandaar deze aanpak.

Acties:
  • 0 Henk 'm!

  • eborn
  • Registratie: April 2000
  • Laatst online: 16-09 09:14
Als ik het goed heb wordt er nu bij return een kopie gemaakt van het hele array. Je kunt het array beter by reference returnen (door er een & voor te zetten).

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 08:24

gorgi_19

Kruimeltjes zijn weer op :9

Andere vraag: Wat is hier het nut van?
Waarom pak je niet de benodigde records?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
nut hiervan is dat ik m'n sql query's los kan trekken van de weergave ervan, in bijv. een lijstje of in een selectbox. zo kan ik mbv 1 regel een query doen en dan los hiervan html genereren.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

Dat kun je toch altijd :?

Jij vervangt 1 regel code met een stuk of 10 :P

En loopt dus dubbel door de resultaten heen (1x om het op te slaan in je array en dan nog een keer om je html te genereren).. dat kan dus wel in 1 keer.

[ Voor 51% gewijzigd door Bosmonster op 30-07-2003 17:21 ]


Acties:
  • 0 Henk 'm!

  • TheJee93
  • Registratie: Oktober 2000
  • Laatst online: 06-08-2015
Ik volg het ook niet helemaal volgens mij kan dit altijd al..

 Fanboy | Code monkey | Occasional speaker


Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
Dat kun je toch altijd
hoe bedoel je?
wat ik probeer te voorkomen is om telkens weer die paar regels code om een query te doen naar 1 terug te brengen, zodat m'n html pagina's redelijk leesbaar blijven.
ik weet het hier zijn ook handige template systemen voor, maar zover ben ik nog niet.

ja ik weet dat het niet optimaal is om 2x een loop te maken door de results heen (1x door mysql object, later 1x door array).

[ Voor 19% gewijzigd door js303 op 30-07-2003 17:24 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

Wat is het verschil nou tussen dit:

code:
1
$sqlobj = sql2array("SELECT label, orde FROM help_chapters ORDER BY orde ASC");


en

code:
1
$rs = mysql_query ("SELECT label, orde FROM help_chapters ORDER BY orde ASC");


:? Voor die eerste krijg je een array ipv een resultset (onnodige conversie, belemmert je flexibiliteit ook).

Als je error_reporting of logging in wilt bouwen.. maak dan een simpele functie die dit voor je doet en gewoon weer een resultset returned ipv het om te gooien naar een array.

[ Voor 39% gewijzigd door Bosmonster op 30-07-2003 17:26 ]


Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
TheJee schreef op 30 July 2003 @ 17:21:
Ik volg het ook niet helemaal volgens mij kan dit altijd al..
Hoe dan? Wellicht begrijp ik een basis concept niet helemaal van php, anyway, waar ik naartoe wil is een systeem waarbij ik met slechts 1-regel aanroep een blok met data tot m'n beschikking heb waarmee ik vervolgens kan doen wat ik wil. Dus bijv. 2x printen, 1x in een selectbox en 1x in een UL lijstje.

of zeggen jullie: "vergeet het idee dat je 2x door een set heenfietst en genereer DIRECT de gewenste (html) output tijdens het lopen door de mysql results!" ??

OK ik begrijp wat Bosmonster zegt. moet ik ff over nadenken, of hier toch niet nadelen aan zitten ($rs = mysql_query enzovoort)

volgens mij zit ik idd onnodig moeilijk te doen... ok ik meld me weer als ik eruit ben

[ Voor 21% gewijzigd door js303 op 30-07-2003 17:38 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

Een resultset kun je ook meerdere keren doorheen lopen of specifieke records uit opvragen..

kijk eens naar de mysql_ functies op php.net, zoals mysql_result of mysql_data_seek
Pagina: 1