Avatar billede cronck Nybegynder
03. oktober 2008 - 12:26 Der er 11 kommentarer og
1 løsning

Udtræk, kan vist gøres bedre?

Hej eksperter

Jeg er igang med at lave et vagt-planlægningssystem i PHP. Jeg bruger følg. kode til at trække vagterne ud fra en MySQL db, og smide dem ind i en tabel på en hjemmeside.

Umiddelbart tror jeg dog at det kan gøres en del smartere/bedre end den måde jeg har gjort det på.

Er der nogen af Jer som kan hjælpe mig med at optimere koden?

Hvorfor? Der er højest 10 brugere på systemet, hvoraf der sjældent logger mere end én på ad gangen, så serveren bliver ikke overbelastet ... Dog vil jeg gerne optimere min "crappy" code lidt, så jeg også selv lærer noget mere af det. :)

Her er koden jeg pt. bruger:

    $DayCounter = 1; // Tæller uge-dag, og starter forfra med ny uge.
    $OddRow = 0; // Skifter farve på hver 2. række
    $uge = 1; // Hvis den overskrider 10 uger, begynd forfra fra uge 1 i vagt-rotationen
    $weekStart = date(W, date(U));
    $firstMonth= 1;
    $temp = date(U);
    $calcTime = date('U');
   
    echo $weekStart;
   
    echo "<table cellspacing='0' width='850px'><tbody>";   
    echo "<tr><td colspan=6 class='UgeNummer2'> Uge ". date(W, $calcTime) ."</td></tr>";
    echo "<tr class='Hours'><td class='sUgeNummer'> Uge ". date(W, $calcTime) ."</td><td scope='col'>00:00 - 08:00</td><td scope='col'>08:00 - 16:00</td><td scope='col'>16:00 - 24:00</td><td scope='col'>07:00 - 19:00</td><td scope='col'>19:00 - 07:00*</td></tr>";
   
    $dag = 1;
    while ($dag <= 7) {
        if ($calcTime == mktime(0,0,0,date(m),date(j),date(Y))) { // Hvis det er dagen derpå, lav baggrundsfarven grøn
            $isToday = "hourtoday";
            $OddRow = "today";
        } else {
            $isToday = "hour";
        }
       
        if ( $OddRow == "odd") { // Skift farve på hver anden række
            $OddRow = "";
        } else {
            $OddRow = "odd";
        }
        echo "\n    <tr class=". $OddRow .">\n      <td class=". $isToday .">". date("D, j. M",$calcTime) ."</td>\n      "; // Indsæt række
        $vagt = 1; // Vagt nr. 1...2...3...4...5
       
        while ($vagt <= 5){
            $myquery = mysql_query("SELECT intOwner FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', $calcTime)."'");
            $recordcount = mysql_num_rows($myquery);
           
            $minVagt = 0;
            $i = 0;
           
            while ($i < $recordcount) {
                $findEjer = mysql_query("SELECT intOwner FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', $calcTime)."'");
                $temp = mysql_result($findEjer,$i);
                    if ($temp['intOwner'] == $_SESSION['MyId']) {
                    $minVagt = 1;
                }
                $i++;
            }
        echo "<td>";
           
            $i = 0;
            while($i < $recordcount){
                $findEjer = mysql_query("SELECT intOwner, Id FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', $calcTime)."'");
                $temp = mysql_result($findEjer,$i);
               
                $query2 = "SELECT * FROM users WHERE Id = ". $temp['intOwner'];
                $result2 = mysql_query($query2) or die('Query failed: ' . mysql_error());
                $temp2 = mysql_fetch_array($result2, MYSQL_ASSOC);
                echo $temp2['navn'] ." (". $temp[IntOwner] .")<br>";
                ++$i;
            }
            echo "</td>\n      ";
            $vagt++;
        }
       
        echo "</td>\n    </tr>";
        $dag++;
    }
   
    echo "</tbody></table>";
Avatar billede cronck Nybegynder
03. oktober 2008 - 12:28 #1
Kan lige uddybbe det lidt.

Der er 5 slags vagter.
1 = 00:00 til 08:00
2 = 08:00 til 16:00
3 = 16:00 til 24:00
4 = 07:00 til 19:00
5 = 19:00 til 07:00

Derfor jeg har valgt for eks. at køre while ($vagt <= 5)
Avatar billede w13 Novice
03. oktober 2008 - 12:38 #2
while ($i < $recordcount) {
                $findEjer = mysql_query("SELECT intOwner FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', $calcTime)."'");
                $temp = mysql_result($findEjer,$i);
                    if ($temp['intOwner'] == $_SESSION['MyId']) {
                    $minVagt = 1;
                }
                $i++;
            }

kan vel bare skrives noget i retning af:

            $findEjer = mysql_query("SELECT id FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', $calcTime)."' AND intOwner = '".$_SESSION['MyId']."'");
            if (mysql_num_rows($myquery)) {
                $minVagt = 1;
            }
Avatar billede w13 Novice
03. oktober 2008 - 12:38 #3
Det er altid en fordel at gøre flest muligt af sine kommandoer i SQL-sætningen.
Avatar billede cronck Nybegynder
03. oktober 2008 - 12:48 #4
Det har du selvfølgelig helt ret i.
Dog har jeg aldrig haft brug for at lave 'større' database-udtræk, så har aldrig tænkt særlig meget over det.

Kan samtidig se at koden jeg har pasted, er fra en tidligere udgave jeg skrev. Har lavet nogle rettelser hist og pist.

Smider lige ny og opdateret kode ind om et øjeblik :)
Avatar billede w13 Novice
03. oktober 2008 - 12:54 #5
Mit eksempel skulle have været:

            if (mysql_num_rows(mysql_query("SELECT id FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', $calcTime)."' AND intOwner = '".$_SESSION['MyId']."'"))) {
                $minVagt = 1;
            }
Avatar billede cronck Nybegynder
03. oktober 2008 - 13:09 #6
Den sidste du lavede dér, virker strålende.

Dog har jeg kaldt nogle af variablerne nogle andre ting i den "nyere" udgave jeg skrev. Fik desværre posted den gamle herinde. :)

Her er den nyere, som den ser ud nu:

    $curDate = $_GET['startDate'];
    $endDate = $_GET['endDate'];
   
    if (!$curDate) {
        $curDate = date("Y-m-d",strtotime(date('Y-m') ."-01"));
    }
    if (!$endDate) {
        $endDate = date("Y-m-d",strtotime(date("Y-m-d", strtotime($curDate)) . " +1 month"));
    }
   
    // Debug information
    if ($_SESSION['Debug']) { echo "<b>Start Date:</b> ". $curDate ."<br>"; echo "<b>End Date:</b> ". $endDate ."<br>"; }
   
    $curMonth = date(F, strtotime($curDate));
    $firstMonth = 1;
    $OddRow = 0; // Skifter farve på hver 2. række
   
   
    while ($curDate <= $endDate) {
       
        if ($firstMonth == 1) {
            echo "<table cellspacing='0' width='850px'><caption>1 -". date(t, strtotime($curDate)) ." ". date(F, strtotime($curDate)) ." ".date(Y, strtotime($curDate))."</caption>\n<thead>\n<tr><th class='print'><a href='java script:onclick=window.print()'>print</a></th><th scope='col'>00:00 - 08:00</th><th scope='col'>08:00 - 16:00</th><th scope='col'>16:00 - 24:00</th><th scope='col'>07:00 - 19:00</th><th scope='col'>19:00 - 07:00*</th></tr></thead><tbody>\n      ";
            $firstMonth = 0;
        } else {
            echo "</tbody></table>\n";
            echo "<table cellspacing='0' width='850px'><caption>1 -". date(t, strtotime($curDate)) ." ". date(F, strtotime($curDate)) ." ".date(Y, strtotime($curDate))."</caption>\n<thead>\n<tr>\n<th class='print'><a href='java script:onclick=window.print()'>print</a></th><th scope='col'>00:00 - 08:00</th><th scope='col'>08:00 - 16:00</th><th scope='col'>16:00 - 24:00</th><th scope='col'>07:00 - 19:00</th><th scope='col'>19:00 - 07:00*</th></tr></thead><tbody>\n      ";   
        }
       
        while ($curMonth == date(F, strtotime($curDate))) {
       
            if ( $OddRow == "odd") { // Skift farve på hver anden række
                $OddRow = "";
            } else {
                $OddRow = "odd";
            }
           
            if ($curDate == date('Y-m-d')) { // Hvis det er dagen derpå, lav baggrundsfarven grøn
                $isToday = "hourtoday";
                $OddRow = "today";
            } else {
                $isToday = "hour";
            }
           
            echo "\n    <tr class=". $OddRow .">\n      <td class=". $isToday .">". date("D, j. M",strtotime($curDate)) ."</td>\n      "; // Indsæt række
            $vagt = 1; // Vagt nr. 1...2...3...4...5
       
            while ($vagt <= 5){
               
                $EchoString = NULL;
               
                $myquery = mysql_query("SELECT intOwner FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', strtotime($curDate))."'");
                $recordcount = mysql_num_rows($myquery);
               
                $minVagt = 0;
                $i = 0;
               
                if (mysql_num_rows(mysql_query("SELECT intOwner FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', strtotime($curDate))."' AND intOwner = '".$_SESSION['MyId'] ."'"))) {
                    $minVagt = 1;
                }
                if ($minVagt == 0) {
                    $EchoString = $EchoString . "<td>";
                }
                else {
                    $EchoString = $EchoString .  "<td class='EgenVagt'>". $result['intOwner'];
                }
               
                $i = 0;
                while($i < $recordcount){
                    $findEjer = mysql_query("SELECT intOwner, Id FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', strtotime($curDate))."'");
                    $temp = mysql_result($findEjer,$i);
                   
                    $query2 = "SELECT * FROM users WHERE Id = ". $temp['intOwner'];
                    $result2 = mysql_query($query2) or die('Query failed: ' . mysql_error());
                    $temp2 = mysql_fetch_array($result2, MYSQL_ASSOC);
                    $EchoString = $EchoString . $temp2['navn'];
                   
                    if ($_SESSION['Debug']) { // Debug information
                        $EchoString = $EchoString ." (". $temp[IntOwner] .")";
                    }
                   
                    $EchoString = $EchoString . "<br>\n      ";
                    ++$i;
                }
                $EchoString = $EchoString . "</td>\n      ";
                echo $EchoString;
                $vagt++;
            }
            echo "</tr>";
            $curDate = date("Y-m-d",strtotime(date("Y-m-d", strtotime($curDate)) . " +1 day"));        // Increase day-counter
        }
        $curMonth = date(F, strtotime($curDate));
       
    }
    echo "</tbody></table>";
Avatar billede cronck Nybegynder
03. oktober 2008 - 13:42 #7
Har rettet lidt flere småting hist og pist.
Hvis du ikke mener der er mere som kan gøres anderledes eller bedre, så smid du blot et svar.

Her er min nuværende kode:

    $curDate = $_GET['startDate'];
    $endDate = $_GET['endDate'];
   
    if (!$curDate) {
        $curDate = date("Y-m-d",strtotime(date('Y-m') ."-01"));
    }
    if (!$endDate) {
        $endDate = date("Y-m-d",strtotime(date("Y-m-d", strtotime($curDate)) . " +1 month"));
    }
   
    // Debug information
    if ($_SESSION['Debug']) { echo "<b>Start Date:</b> ". $curDate ."<br>"; echo "<b>End Date:</b> ". $endDate ."<br>"; }
   
    $curMonth = date(F, strtotime($curDate));
    $firstMonth = 1;
    $OddRow = 0; // Skifter farve på hver 2. række
   
    while ($curDate <= $endDate) {
       
        if ($firstMonth == 0) {
            echo "</tbody></table>\n";
        }
           
        echo "<table cellspacing='0' width='850px'><caption>1 -". date(t, strtotime($curDate)) ." ". date(F, strtotime($curDate)) ." ".date(Y, strtotime($curDate))."</caption>\n<thead>\n<tr>\n<th class='print'><a href='java script:onclick=window.print()'>print</a></th><th scope='col'>00:00 - 08:00</th><th scope='col'>08:00 - 16:00</th><th scope='col'>16:00 - 24:00</th><th scope='col'>07:00 - 19:00</th><th scope='col'>19:00 - 07:00*</th></tr></thead><tbody>\n      ";   
        $firstMonth = 0;
       
        while ($curMonth == date(F, strtotime($curDate))) {
       
            if ( $OddRow == "odd") { // Skift farve på hver anden række
                $OddRow = "";
            } else {
                $OddRow = "odd";
            }
           
            if ($curDate == date('Y-m-d')) { // Hvis det er dagen derpå, lav baggrundsfarven grøn
                $isToday = "hourtoday";
                $OddRow = "today";
            } else {
                $isToday = "hour";
            }
           
            echo "\n    <tr class=". $OddRow .">\n      <td class=". $isToday .">". date("D, j. M",strtotime($curDate)) ."</td>\n      "; // Indsæt række
            $vagt = 1; // Vagt nr. 1...2...3...4...5
       
            while ($vagt <= 5){
               
                $EchoString = NULL;
               
                $myquery = mysql_query("SELECT intOwner FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', strtotime($curDate))."'");
                $recordcount = mysql_num_rows($myquery);
               
                if (mysql_num_rows(mysql_query("SELECT intOwner FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', strtotime($curDate))."' AND intOwner = '".$_SESSION['MyId'] ."'"))) {
                    $EchoString = $EchoString .  "<td class='EgenVagt'>". $result['intOwner'];
                } else {
                    $EchoString = $EchoString . "<td>";
                }
               
                $i = 0;
                while($i < $recordcount){ // Hvis der er flere personer på samme vagt, kører den loop flere gange
                    $findEjer = mysql_query("SELECT intOwner FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', strtotime($curDate))."'");
                    $temp = mysql_result($findEjer,$i);
                   
                    $query2 = "SELECT * FROM users WHERE Id = ". $temp['intOwner'];
                    $result2 = mysql_query($query2) or die('Query failed: ' . mysql_error());
                    $temp2 = mysql_fetch_array($result2, MYSQL_ASSOC);
                    $EchoString = $EchoString . $temp2['navn'];
                   
                    if ($_SESSION['Debug']) { // Debug information
                        $EchoString = $EchoString ." (". $temp['IntOwner'] .")";
                    }
                   
                    $EchoString = $EchoString . "<br>\n      ";
                    $i++;
                }
                $EchoString = $EchoString . "</td>\n      ";
                echo $EchoString;
                $vagt++;
            }
            echo "</tr>";
            $curDate = date("Y-m-d",strtotime(date("Y-m-d", strtotime($curDate)) . " +1 day"));        // Increase day-counter
        }
        $curMonth = date(F, strtotime($curDate));
       
    }
    echo "</tbody></table>";
Avatar billede w13 Novice
03. oktober 2008 - 13:48 #8
Det kan nok stadig gøres bedre, men jeg har lidt svært ved at overskue det.

En lille ting er f.eks. denne:

            if ( $OddRow == "odd") { // Skift farve på hver anden række
                $OddRow = "";
            } else {
                $OddRow = "odd";
            }

som kan skrives:

$OddRow = ($OddRow == "odd" ? "" : "odd");

Men jeg smider et svar her, og så synes jeg, du skal lade spørgsmålet ligge i noget tid endnu, og se om der ikke kommer andre eksperter forbi.

Så kan du bare give en lille smule af pointene til den tid. =)
Avatar billede cronck Nybegynder
03. oktober 2008 - 14:12 #9
Ok, jeg venter og ser om der kommer andre forbi. :)

Takker for hjælpen :)
Avatar billede cronck Nybegynder
03. oktober 2008 - 14:23 #10
Det som jeg egentlig spekulerede mest over i starten, var denne:

$findEjer = mysql_query("SELECT intOwner FROM fasteuger WHERE intShift = ". $vagt ." AND Dato = '". date('Y-m-d', strtotime($curDate))."'");
$temp = mysql_result($findEjer,$i);

$query2 = "SELECT * FROM users WHERE Id = ". $temp['intOwner'];
$result2 = mysql_query($query2) or die('Query failed: ' . mysql_error());
$temp2 = mysql_fetch_array($result2, MYSQL_ASSOC);
$EchoString = $EchoString . $temp2['navn'];

Tænkte på om man ikke kunne lave en Join tabel? Men det ville måske ikke gøre det meget bedre i den sidste ende alligevel? :)
Avatar billede w13 Novice
03. oktober 2008 - 15:04 #11
Jo, det er altid bedst at have så få SQL-sætninger som muligt. =)
Avatar billede w13 Novice
24. oktober 2008 - 19:02 #12
Tak for points! :)
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
Computerworld tilbyder specialiserede kurser i database-management

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