Avatar billede nemlig Professor
24. april 2011 - 17:08 Der er 13 kommentarer og
1 løsning

2 x MySQL-while driller

Hejsa.
Jeg har 2 udtræk fra MySQL, hvor jeg skal printe alle værdierne.
Jeg afvikler 2 x while - den anden "while" afvikles inde i den første, hvorfor den anden "while" skal køre flere gange. Men den kører kun første gang.

$sql  ="SELECT `id` FROM `table1`"; //3 poster
$res1 = database($sql);
$sql  ="SELECT `tal` FROM `table2`"; //5 poster
$res2 = database($sql);

    while($row1 = mysql_fetch_array($res1))
    {
      echo $row1['id']."<br />";
        while($row2 = mysql_fetch_array($res2))
        {
            echo $row2['tal']."<br />";
        }
    }
Avatar billede repox Seniormester
24. april 2011 - 17:21 #1
Hvad gør database()?
Avatar billede nemlig Professor
24. april 2011 - 17:28 #2
#1

function database($sql){//Funktion der laver alm databasekald og returnerer resultatet
  $config = ini();//Hent databaseparametre
  mysql_select_db($config['db_base']);
  $res = mysql_query($sql); //Udfør forespørgsel
  if (!$res) {//Tjek om det gik godt
    die("<b>Databasefejl:<br></b>" . mysql_error() ."<b><br>MySQL-sætningen var:<br></b>". $sql);//Udskriv fejlmelding og stop udførsel
  }
  return $res;//Returner resultat af forespørgsel
}
Avatar billede nemlig Professor
24. april 2011 - 17:29 #3
Det fungerer fint, hvis jeg bare gør sådan her, men det er vel unødig belastning af databasen:

$sql  ="SELECT `id` FROM `table1`"; //3 poster
$res1 = database($sql);

    while($row1 = mysql_fetch_array($res1))
    {
      echo $row1['id']."<br />";
        $sql  ="SELECT `tal` FROM `table2`"; //5 poster
        $res2 = database($sql);
        while($row2 = mysql_fetch_array($res2))
        {
            echo $row2['tal']."<br />";
        }
    }
Avatar billede repox Seniormester
24. april 2011 - 17:39 #4
Det må være din logik der ikke passer. Hvad du gør i #0 er absolut ikke det samme som du gør i #3.

I #0 udfører du to sql forespørgsler lige efter hinanden - og så færdig. Resultatet af den anden forespørgsel forsøger du så at genanvende i en while to gange (tre gange i alt) og det kan du ikke med mysql_fetch_array() da indeks pointeren allerede er flyttet helt til slut i den resource.

Ydermere, giver det ikke umiddelbar mening at din database() funktion skal vælge database hver gang du kører funktion - det er unødvendig belastning af serveren. Funktionen sparer dig heller ingenting, da logikken må være at fin funktion alligevel skal gøre tre gange for at kunne gennemløbe den anden forespørgsel tre gange.

Et bedre alternativ ville være at gennemløbe den anden forespørgsel en gang, lægge indholdet i et array og iterere hen over det de tre gange.
Avatar billede nemlig Professor
24. april 2011 - 17:39 #5
Og jeg kunne også have spurgt, hvorfor der ikke sker noget, når "while" køres igennem 2.gang og senere:

$sql  ="SELECT `id` FROM `table1`"; //3 poster
$res1 = database($sql);

    while($row1 = mysql_fetch_array($res1))
    {
      echo $row1['id']."<br />";
    }

    while($row1 = mysql_fetch_array($res1))
    {
      echo $row1['id']."<br />";
    }
Avatar billede nemlig Professor
24. april 2011 - 17:41 #6
#4
OK - jeg forstår.
Det giver også svar på #5.

Array-løsningen virker som den rigtige - så det laver jeg i stedet.

Tak for bidragene og send venligst et svar. :)
Avatar billede repox Seniormester
24. april 2011 - 17:47 #7
Du fik svar her.
Avatar billede wanze Nybegynder
25. april 2011 - 06:23 #8
Det er unødvendigt at oprette et array. Brug istedet mysql_data_seek() til at resette pointeren i din resource.
Avatar billede nemlig Professor
25. april 2011 - 09:50 #9
#8 OK - det skal da også prøves. Tak for tippet.
Avatar billede repox Seniormester
25. april 2011 - 12:56 #10
#8
Er 'unødvendigt' virkelig det rigtige ord? Selvom det også løser opgaven, hvordan kan det så være unødvendigt' at ville anvende arrays i stedet?
Avatar billede wanze Nybegynder
25. april 2011 - 16:00 #11
@nemlig Velbekomme.

@repox I langt de fleste programmeringsopgaver er det besværlige ikke at løse opgaven, men derimod at gøre det smart, effektivt og hurtigt. Du bruger her unødvendigt meget RAM, idet du gemmer al dataen to gange.
Avatar billede repox Seniormester
25. april 2011 - 16:29 #12
#11
Så vil jeg nok nærmere kalde det en holdningssag - det er ikke just hukommelsen jeg bekymrer mig om i sådanne tilfælde. Og ofte vil jeg heller ikke lægge en database funktionalitet sammen med output delen, men hellere have et abstraktionslag til at udføre det for mig i et lokalt scope som returnere et array eller objekt jeg kan behandle i stedet. Dette giver mig stadig en MySQL ressource der frigives efter funktionen er kørt.
Avatar billede wanze Nybegynder
25. april 2011 - 16:35 #13
@repox RAM-forbrug er aldrig en holdningssag. Overvej, hvis det er et 10MB blob udtræk han laver.

Jeg er enig i, at han også burde benytte en MVC-lignende struktur, men det er ikke det denne tråd handler om.
Avatar billede repox Seniormester
25. april 2011 - 20:01 #14
#13
Jeg er bestemt ikke enig med dig. MySQL og PHP anvender ikke samme hukommelse, da de ikke bruger den samme proces. Så udover at man skulle skamme sig over at bruge blobs på 10MB, så er det også et performance-mæssigt spørgsmål som jeg mener falder uden for kategorien her.

For at hente trivielt data - tekst, varekataloger, nyheder og andet skrammel - ud, ser jeg det bestemt ikke som en fordel at bibeholde dataene i en ufleksibel MySQL-ressource. Derfor mener jeg at det er en holdningssag at ville optimere i forhold til RAM forbruget. Skulle det ske at mængden af data fra MySQL ville være et performance-problem vil jeg til enhver tid råde folk til at anvende cache-systemer.

Med andre ord; at du vil genbruge en MySQL ressource i det omfang du vil, er naturligvis op til dig. Jeg ser bare ikke selv nogen fordel i det og anvender derfor andre metoder som jeg mener giver mig den performance som jeg har behov for.
Der er trods alt heller ikke kun en rigtig vej for at nå målet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester