Avatar billede blach Nybegynder
10. august 2005 - 21:41 Der er 14 kommentarer og
1 løsning

Optimering af kode - vha. løkker

Jeg har følgende kode, som jeg gerne vil have optimeret. Det eneste den gør, er at tage A, B, C, D osv.. (indtil der ikke er flere i DB)
Så tænkte at man måske kunne COUNT'e antallet i DB og så lave en FOR-løkke, som starter med A?

--code--

open();
$query = mysql_query("SELECT * FROM text WHERE cat='A' ORDER BY sub_cat") or die(mysql_error());
while($row = mysql_fetch_array($query)){
  echo '+ <a href="index.php?page=av_red_tekst&id='. $row[id] '.">'. $row[menu] .'</a><br>';
}

$query = mysql_query("SELECT * FROM hostel_text WHERE cat='B' ORDER BY sub_cat") or die(mysql_error());
while($row = mysql_fetch_array($query)){
  echo '+ <a href="index.php?page=av_red_tekst&id='. $row[id] '.">'. $row[menu] .'</a><br>';
}

$query = mysql_query("SELECT * FROM hostel_text WHERE cat='C' ORDER BY sub_cat") or die(mysql_error());
while($row = mysql_fetch_array($query)){
  echo '+ <a href="index.php?page=av_red_tekst&id='. $row[id] '.">'. $row[menu] .'</a><br>';
}

close();
--/code--
Avatar billede blach Nybegynder
10. august 2005 - 21:42 #1
--code--

open();
$query = mysql_query("SELECT * FROM text WHERE cat='A' ORDER BY sub_cat") or die(mysql_error());
while($row = mysql_fetch_array($query)){
  echo '+ <a href="index.php?page=av_red_tekst&id='. $row[id] '.">'. $row[menu] .'</a><br>';
}

$query = mysql_query("SELECT * FROM text WHERE cat='B' ORDER BY sub_cat") or die(mysql_error());
while($row = mysql_fetch_array($query)){
  echo '+ <a href="index.php?page=av_red_tekst&id='. $row[id] '.">'. $row[menu] .'</a><br>';
}

$query = mysql_query("SELECT * FROM text WHERE cat='C' ORDER BY sub_cat") or die(mysql_error());
while($row = mysql_fetch_array($query)){
  echo '+ <a href="index.php?page=av_red_tekst&id='. $row[id] '.">'. $row[menu] .'</a><br>';
}

close();

--/code--
Avatar billede nielle Nybegynder
10. august 2005 - 21:53 #2
F.eks. sådan:

$output = "";

open();

mysql_query("SELECT íd, menu FROM text WHERE cat IN ['A', 'B', 'C'] ORDER BY cat ASC, sub_cat") or die(mysql_error());
while ($row = mysql_fetch_assoc($query))
{
    $output .= '+ <a href="index.php?page=av_red_tekst&id=' . $row[id] . '>' . $row[menu] . '</a><br>';
}

close();

echo $output;
Avatar billede nielle Nybegynder
10. august 2005 - 21:54 #3
Hov, jeg tabte noget:

$output = "";

open();

$query = mysql_query("SELECT íd, menu FROM text WHERE cat IN ['A', 'B', 'C'] ORDER BY cat ASC, sub_cat") or die(mysql_error());
while ($row = mysql_fetch_assoc($query))
{
    $output .= '+ <a href="index.php?page=av_red_tekst&id=' . $row[id] . '>' . $row[menu] . '</a><br>';
}

close();

echo $output;
Avatar billede blach Nybegynder
10. august 2005 - 22:00 #4
Ser godt ud...
Med hvad så hvis databasen indeholder A,B,C & D? Kunne være smartest hvis den selv fandt ud af antallet..
Avatar billede nielle Nybegynder
10. august 2005 - 22:02 #5
Optimering nr. 1) Gem teksten i en streng i stedet for at skrive den ud med det samme. Skriv den først ud til sidst. Dette spare en masse I/O.

Optimering nr. 2) Saml de tre SQL-sætninger i en. Dette spare to gennemløb af hele tabellen.

Optimering nr. 3) Træk kun de data ud som du rent faktisk skal bruge til noget.

Optimering nr. 4) Brug mysql_fetch_assoc i stedet for mysql_fetch_array. Den bruger færre resurser.
Avatar billede nielle Nybegynder
10. august 2005 - 22:04 #6
Hvis du skal have alle sammen ud, og ikke kun A, B, C og D, så der SQL'en endda meget simplere:

"SELECT íd, menu FROM text ORDER BY cat ASC, sub_cat"
Avatar billede nielle Nybegynder
10. august 2005 - 22:05 #7
Hov, dit id-felt hedder selvfølgelig "id" og ikke "íd".
Avatar billede blach Nybegynder
10. august 2005 - 22:09 #8
Hehe kanon ;)
Man kan ikke gøre, så der kommer et <br> ind imellem hver cat? Altså
A'erne
<br>
B'erne
<br>

osv
Avatar billede nielle Nybegynder
10. august 2005 - 22:15 #9
Det koster jo noget performance, fordi at man så også skal trække "cat" ud af tabellen, samt at man så skal supplere med nogle if-tjek. Men det kunne da se sådan her ud:

$output = "";

open();

$query = mysql_query("SELECT id, menu, cat FROM text ORDER BY cat ASC, sub_cat") or die(mysql_error());

$oldCat = "";
while ($row = mysql_fetch_assoc($query))
{
    $newCat = $row["cat"];
    if ($newCat != $oldCat)
    {
        if ($oldCat != "") $output .= "<br>";
        $oldCat = $newCat;
    }
   
    $output .= '+ <a href="index.php?page=av_red_tekst&id=' . $row[id] . '>' . $row[menu] . '</a><br>';
}

close();

echo $output;
Avatar billede nielle Nybegynder
16. august 2005 - 18:56 #10
Har du fået kigget på det?
Avatar billede blach Nybegynder
24. august 2005 - 17:06 #11
yup, det er helt perfekt.. mange tak! Ligger du et svar?
Avatar billede nielle Nybegynder
24. august 2005 - 20:06 #12
Svar :^)
Avatar billede blach Nybegynder
24. august 2005 - 21:08 #13
Måske du kan hjælpe her også...
http://www.eksperten.dk/spm/642766
Avatar billede nielle Nybegynder
24. august 2005 - 22:07 #14
Det ser jo faktisk ud til at du allerede får kvalifiseret hjælp der - og så skal jeg ikke blande mig (før det eventuelt går i hårdknude). :^)
Avatar billede blach Nybegynder
24. august 2005 - 22:53 #15
Brugte faktisk bare din kode.. så tak for hjælpen :)
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