Saubereren PHP-Code (=schneller?)

loddarmattheus

Erfahrenes Mitglied
Guten Morgen,
ich bin kein Experte in php/MySQL und von daher meistens auf vorgefertigte Scripte angewiesen, die ich dann entsprechend anpasse. Jedenfalls habe ich für meine Freundin einen Wochenkalender für ihren Laden geschrieben, der auch funktioniert. Nur ist der Code halt über 1200 Zeilen lang und 120 Datenbankabfragen, was natürlich dauern kann.

Ob sich das mal bitte jemand anschauen kann und mir kurz einen Verbesserungstipp geben kann?
VG Loddar
Code:
<?php
include('include/config.inc.php');
      <div class="calender_woche">
         <div class="pagination_woche">
           <div class="today"><a href="day.php?date=<?php echo $sqlmontag; ?>">Montag,&nbsp;den&nbsp;<?php echo $startmontag; ?></a></div>
           <div class="morning">
           <a href="?timestamp=<?php echo kwBack($date); ?>" class="last">&laquo;&laquo;&nbsp;</a>
           <span><?php echo $aktuellekalenderwoche; ?>.&nbsp;Kalenderwoche</span>
           <a href="?timestamp=<?php echo kwForward($date); ?>" class="next">&nbsp;&raquo;&raquo;</a>
           </div>
         </div>
         <div>
           <div class="namen1">&nbsp;</div>
           <div class="namen"><?php echo $mitarbeiter1; ?></div>
           <div class="namen"><?php echo $mitarbeiter2; ?></div>
           <div class="namen"><?php echo $mitarbeiter3; ?></div>
           <div class="namen"><?php echo $mitarbeiter4; ?></div>
           <div class="namen"><?php echo $mitarbeiter5; ?></div>
         </div>
         <div class="wochenplan">
           <?php
           $sum_hours = 19;
           
           for( $z = 8; $z <= $sum_hours; $z++ )
             {
             
         ############# Volle Stunden #############################################################
             echo '<div class="stunden">&nbsp;'.$z.':00&nbsp;</div>';
             
           ######### Abfrage MA 1 ##############################################################
             $checkung = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'00 AND ma=1 ORDER by dauer');
             $check = mysql_fetch_array($checkung);
               if($check['kunde']!='') echo '<div class="stunden1">';
               else echo '<div class="stunden2">';

             $checkung1 = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'00 AND ma=1 ORDER by id');
             while ($row = mysql_fetch_array($checkung1))
               {     
                 $thumb = 'bilder/'.$row['kunde'].'.jpg';
                 $laeng = strlen($row['kunde']);
                   if($laeng == 1)   echo '<img src="'.$thumb.'" width="196" height="46" border="0">';
                   elseif($laeng > 1)    echo '<span><b>&nbsp;'.$row['kunde'].'</b> '.$row['anfang'].' '.$row['beh1'].' '.$row['beh2'].' '.$row['beh3'].'</span></br>';
               }
             echo '</div>';
           #####################################################################################
           ########## Abfrage MA 3 #############################################################
             $checkung = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'00 AND ma=3 ORDER by dauer');
             $check = mysql_fetch_array($checkung);
               if($check['kunde']!='') echo '<div class="stunden1">';
               else echo '<div class="stunden2">';

             $checkung1 = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'00 AND ma=3 ORDER by id');
             while ($row = mysql_fetch_array($checkung1))
               {     
                 $thumb = 'bilder/'.$row['kunde'].'.jpg';
                 $laeng = strlen($row['kunde']);
                   if($laeng == 1)   echo '<img src="'.$thumb.'" width="196" height="46" border="0">';
                   elseif($laeng > 1)    echo '<span><b>&nbsp;'.$row['kunde'].'</b> '.$row['anfang'].' '.$row['beh1'].' '.$row['beh2'].' '.$row['beh3'].'</span></br>';
               }
             echo '</div>';
           #####################################################################################
           ########## Abfrage MA 2 #############################################################
             $checkung = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'00 AND ma=2 ORDER by dauer');
             $check = mysql_fetch_array($checkung);
               if($check['kunde']!='') echo '<div class="stunden1">';
               else echo '<div class="stunden2">';

             $checkung1 = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'00 AND ma=2 ORDER by id');
             while ($row = mysql_fetch_array($checkung1))
               {     
                 $thumb = 'bilder/'.$row['kunde'].'.jpg';
                 $laeng = strlen($row['kunde']);
                   if($laeng == 1)   echo '<img src="'.$thumb.'" width="196" height="46" border="0">';
                   elseif($laeng > 1)    echo '<span><b>&nbsp;'.$row['kunde'].'</b> '.$row['anfang'].' '.$row['beh1'].' '.$row['beh2'].' '.$row['beh3'].'</span></br>';
               }
             echo '</div>';
           #####################################################################################
           ########## Abfrage MA 4 #############################################################
             $checkung = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'00 AND ma=4 ORDER by dauer');
             $check = mysql_fetch_array($checkung);
               if($check['kunde']!='') echo '<div class="stunden1">';
               else echo '<div class="stunden2">';

             $checkung1 = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'00 AND ma=4 ORDER by id');
             while ($row = mysql_fetch_array($checkung1))
               {     
                 $thumb = 'bilder/'.$row['kunde'].'.jpg';
                 $laeng = strlen($row['kunde']);
                   if($laeng == 1)   echo '<img src="'.$thumb.'" width="196" height="46" border="0">';
                   elseif($laeng > 1)    echo '<span><b>&nbsp;'.$row['kunde'].'</b> '.$row['anfang'].' '.$row['beh1'].' '.$row['beh2'].' '.$row['beh3'].'</span></br>';
               }
             echo '</div>';
           #####################################################################################
           ########## Abfrage MA 5 #############################################################
             $checkung = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'00 AND ma=5 ORDER by dauer');
             $check = mysql_fetch_array($checkung);
               if($check['kunde']!='') echo '<div class="stunden1">';
               else echo '<div class="stunden2">';

             $checkung1 = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'00 AND ma=5 ORDER by id');
             while ($row = mysql_fetch_array($checkung1))
               {     
                 $thumb = 'bilder/'.$row['kunde'].'.jpg';
                 $laeng = strlen($row['kunde']);
                   if($laeng == 1)   echo '<img src="'.$thumb.'" width="196" height="46" border="0">';
                   elseif($laeng > 1)    echo '<span><b>&nbsp;'.$row['kunde'].'</b> '.$row['anfang'].' '.$row['beh1'].' '.$row['beh2'].' '.$row['beh3'].'</span></br>';
               }
             echo '</div>';
           #####################################################################################
             
             
         ############# Halbe Stunden #############################################################
         #########################################################################################
             echo '<div class="stunden">&nbsp;'.$z.':30&nbsp;</div>';
             
           ######### Abfrage MA 1 ##############################################################
             $checkung = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'30 AND ma=1 ORDER by dauer');
             $check = mysql_fetch_array($checkung);
               if($check['kunde']!='') echo '<div class="stunden1">';
               else echo '<div class="stunden2">';

             $checkung1 = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'30 AND ma=1 ORDER by id');
             while ($row = mysql_fetch_array($checkung1))
               {     
                 $thumb = 'bilder/'.$row['kunde'].'.jpg';
                 $laeng = strlen($row['kunde']);
                   if($laeng == 1)   echo '<img src="'.$thumb.'" width="196" height="46" border="0">';
                   elseif($laeng > 1)    echo '<span><b>&nbsp;'.$row['kunde'].'</b> '.$row['anfang'].' '.$row['beh1'].' '.$row['beh2'].' '.$row['beh3'].'</span></br>';
               }
             echo '</div>';
           #####################################################################################
           ######### MA 3 ######################################################################
             $checkung = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'30 AND ma=3 ORDER by dauer');
             $check = mysql_fetch_array($checkung);
               if($check['kunde']!='') echo '<div class="stunden1">';
               else echo '<div class="stunden2">';

             $checkung1 = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'30 AND ma=3 ORDER by id');
             while ($row = mysql_fetch_array($checkung1))
               {     
                 $thumb = 'bilder/'.$row['kunde'].'.jpg';
                 $laeng = strlen($row['kunde']);
                   if($laeng == 1)   echo '<img src="'.$thumb.'" width="196" height="46" border="0">';
                   elseif($laeng > 1)    echo '<span><b>&nbsp;'.$row['kunde'].'</b> '.$row['anfang'].' '.$row['beh1'].' '.$row['beh2'].' '.$row['beh3'].'</span></br>';
               }
             echo '</div>';
           #####################################################################################
           ######### MA 2 ######################################################################
             $checkung = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'30 AND ma=2 ORDER by dauer');
             $check = mysql_fetch_array($checkung);
               if($check['kunde']!='') echo '<div class="stunden1">';
               else echo '<div class="stunden2">';

             $checkung1 = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'30 AND ma=2 ORDER by id');
             while ($row = mysql_fetch_array($checkung1))
               {     
                 $thumb = 'bilder/'.$row['kunde'].'.jpg';
                 $laeng = strlen($row['kunde']);
                   if($laeng == 1)   echo '<img src="'.$thumb.'" width="196" height="46" border="0">';
                   elseif($laeng > 1)    echo '<span><b>&nbsp;'.$row['kunde'].'</b> '.$row['anfang'].' '.$row['beh1'].' '.$row['beh2'].' '.$row['beh3'].'</span></br>';
               }
             echo '</div>';
           #####################################################################################
           ######### MA 4 ######################################################################
             $checkung = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'30 AND ma=4 ORDER by dauer');
             $check = mysql_fetch_array($checkung);
               if($check['kunde']!='') echo '<div class="stunden1">';
               else echo '<div class="stunden2">';

             $checkung1 = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'30 AND ma=4 ORDER by id');
             while ($row = mysql_fetch_array($checkung1))
               {     
                 $thumb = 'bilder/'.$row['kunde'].'.jpg';
                 $laeng = strlen($row['kunde']);
                   if($laeng == 1)   echo '<img src="'.$thumb.'" width="196" height="46" border="0">';
                   elseif($laeng > 1)    echo '<span><b>&nbsp;'.$row['kunde'].'</b> '.$row['anfang'].' '.$row['beh1'].' '.$row['beh2'].' '.$row['beh3'].'</span></br>';
               }
             echo '</div>';
           #####################################################################################
           ######### MA 5 ######################################################################
             $checkung = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'30 AND ma=5 ORDER by dauer');
             $check = mysql_fetch_array($checkung);
               if($check['kunde']!='') echo '<div class="stunden1">';
               else echo '<div class="stunden2">';

             $checkung1 = mysql_query('select * from termin where date='.$sqlmontag.' AND time='.$z.'30 AND ma=5 ORDER by id');
             while ($row = mysql_fetch_array($checkung1))
               {     
                 $thumb = 'bilder/'.$row['kunde'].'.jpg';
                 $laeng = strlen($row['kunde']);
                   if($laeng == 1)   echo '<img src="'.$thumb.'" width="196" height="46" border="0">';
                   elseif($laeng > 1)    echo '<span><b>&nbsp;'.$row['kunde'].'</b> '.$row['anfang'].' '.$row['beh1'].' '.$row['beh2'].' '.$row['beh3'].'</span></br>';
               }
             echo '</div>';
           #####################################################################################
             }
             
           ?>
         </div>
         <div class="clear"></div>
       </div>
         <div style="float:left; width:1046px; height:40px; background-color:#666; margin: 2px"></div>
     </div>   

.....................   
   
   
   

?>
 
Hallo,

1. Du mischst HTML (=View) mit Businesslogik. Ein ganz großes No-Go, sieh dir bitte das MVC-Pattern z. B. bei der englischen Wikipedia an. (Ich fands es dort besser als bei der deutschen erklärt, als ich das letzte Mal dort reinsah).

2. Du arbeitest noch mit der alten MySQL-Erweiterung. Die wird bald GANZ aus PHP entfernt.

3. Du benutzt anscheinend Nutzereingaben in SQL-Queries, ohne diese zu "entschärfen". Im Zuge des Aktualisierens auf MySQLi oder PDO sollte sich dieses Problem durch die Verwendung von Prepared Statements in Luft auflösen.

4. Du hast $mitarbeiter1 bis 5. Bist du sicher, dass nicht ein Array angebrachter wäre?

5. Du mischst die deutsche und englische Sprache.

6. Einrückungen im Code sind wild gemischt. Hast du schon mal einen Editor benutzt, der Autoformatting bereitstellt?

7. Konstanten im Code (z. B. der Pfad zu bilder/ oder $sum_hours = 19) sind "hard coded". Willst du einmal den Pfad ändern, so musst du dies an mehreren Stellen tun.

8. Du benutzt SELECT * FROM anstatt einzelne Felder explizit anzugeben.

9. Du benutzt style-Angaben in HTML-Elementen. Dafür gibt es externe CSS-Stylesheets.

10. 1200 Zeilen lang?! Das rührt mitunter auch von der nicht vorhandenen Trennung von View und Businesslogik her.

11. 120 DB-Abfragen? Bist du sicher, dass du keine redundanten Abfragen hast?

Meine Empfehlung: Wirf deinen aktuellen Code über den Haufen, schaff dir ein gescheites PHP-Framework an und schreibe deinen Code neu - diesmal sauberer!

Deinen aktuellen Code kann keiner pflegen, noch nicht einmal du in der Zukunft, würde ich wetten.

12. Daumen hoch dafür, dass du deinen Code bewerten lassen wolltest!
 
Danke erstmal für die konstruktive Kritik.
Wie bereits geschrieben, ist das alles nicht auf meinem Mist gewachsen, sondern ein fertiges Kalenderscript einfach optisch angepasst.
Das ich das nicht einfach "wegwerfen" kann und neu schreiben habe ich auch schon gesagt, weil ich es einfach nicht kann :)

Und - ich wollte doch "meinen" Code nicht bewerten lassen! Ist ja auch nicht meiner, aber erfüllt auf einem lokalen Rechner seinen Zweck.
 
Hallo,

da es dir anscheinend vor allem um die Geschwindigkeit geht, du aber - wenn ich es richtig verstehe - keine tieferen Kenntnisse hast, solltest du dir jemanden suchen, der dir

- das Teil neu schreibt mit Fokus auf Geschwindigkeit oder
- profiled, wo der Schuh drückt.

Abhängig davon, wieviele Einträge in der Datenbank sind, könnte man bspw.

- mehrere Abfragen zusammenfassen und mittels JOIN nur einen Query statt 4 oder 6 an die Datenbank senden und/oder
- Indices auf die Spalten anlegen, wo es Sinn macht (z.B. bei denen, die in den WHERE-Klauseln angegeben sind).

Ich würde damit anfangen, für eine Analyse mal mit xdebug eine Profiling-Session auf einer Test-Umgebung machen. Auf der alten Tutorials.de-Seite gab es da mal ein Tutorial dafür, wie man sein System einrichtet und was man alles für Tools braucht. Aber leider sind noch nicht viele der Tutorials in die neue Struktur aufgenommen worden. Daher verweise ich mal auf die englische Doku: http://www.xdebug.org/docs/profiler
 
Zurück