Zur Navigation

Code übersichtlicher schreiben

1 Marcel (Gast)

Hallo

Ich, als totaler Leie in PHP, habe einen Code, der für jeden "Profi" sicherlich einige Mängel aufweist. Daher würde ich mich über Verbesserungsvorschläge freuen:


<html>
<head>
<?php
include("zus/namen.php");
?>
<title>Taschenrechner / <?php echo $name["nrrechner"]; ?></title>
<link rel="stylesheet" type="text/css" href="zus/layout.css">
</head>
<body>
<?php
echo $name["linkrechner"];
?>
- <a href="#" onclick="javascript:window.open('zus/v.rechner.php','','height=550,width=700,scrollbars=0,toolbar=0,resizable=1,menubar=0,directories=0,status=0')">Versionshistory <b>dieses Rechners</b> ansehen</a><br>
<table>
<tr>
<td width="453"> Mit diesem Rechner haben Sie die M&ouml;glichkeit mit den 4 Grundrechenarten zu arbeiten. Nebenbei bietet dieser Rechnung die Funktion das Ergebnis zu runden (Stelle kann bestimmt werden) und per eMail an eine gew&uuml;nschte Adresse zu senden (Obacht: Die IP wird gespeichert.).
</td>
</tr>
</table>
<br><br><br>
<table>
<tr>
<td width="160" align="center" bgcolor="#C7C7C7"><b>Pflichtangaben</td>
<td width="190" align="center" bgcolor="#C7C7C7"><b>optionale Angaben</td>
</tr>
<tr>
<td width="160">
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post">
<br><b>Zahl 1:&nbsp;&nbsp;<input type="text" size="8" name="a" maxlength="8"><br>
Zahl 2:&nbsp;&nbsp;<input type="text" size="8" name="b" maxlength="8"></b><br><br>
<select name="methode" size="1">
<option value="add">Addieren&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+</option>
<option value="sub">Subtrahieren&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-</option>
<option value="multi">Multiplizieren&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</option>
<option value="divi">Dividieren&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/</option>
<option value="divirest">Dividieren mit Rest</option>
</select>
</td>
<td width="220">
<br>Ergebnis runden auf die Stelle
<input type="text" name="stelle" size="1" maxlength="1"><br><br>
Ergebnis an folgende eMail senden:<br>
<input type="text" name="email" size="30" maxlength="40">
</td>
</tr>
</table>
<br><input type="hidden" name="checked" value="1">
<input type="hidden" name="ip" value="<?php echo $REMOTE_ADDR ?>">
<input type="submit" value="Ergebnis berechnen">
<input type="reset" value="Felder zur&uuml;cksetzen">
<?php
    $a = $_POST["a"];
    $b = $_POST["b"];
    $stelle = $_POST["stelle"];
    $empfaenger = $_POST["email"];
    $speicherung = $_POST["ip"]." - ".date("d.m.Y")." / ".date("H:i:s")." - ".$methode;
    
    $tagesname = array("<font color=\"red\">Sonntag</font>", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
    $wochentag = $tagesname[date(w)];
    
    $betreff = "Taschenrechner cpox.de - Ergebnis zusenden";
    $absender = "webmaster@cpox.de";
    $emailone = "Sehr geehrte Damen und Herren!\n";
    $emailtwo = "\nSollten Sie diese eMail nicht angefordert haben, wenden Sie sich bitte an den Nutzer der IP ".$_POST["ip"]." oder schicken Sie eine eMail an webmaster@cpox.de.\n\nMit freundlichen Grüßen,\n***";

    $emailsend = "Das Ergebnis wurde am <b>".$wochentag."</b>, den <b>".date("d.m.Y")."</b> um <b>".date("H:i:s")." Uhr</b><br> von der IP <b>".$_POST["ip"]."</b> angefordert und an <b>".$empfaenger."</b> geschickt.<br><br>";
    $rechnung = "Rechnung und Ergebnis: ";
    $gerund = "Ergebnis gerundet auf die ".$stelle.". Stelle: ";
    
    $re = "^[a-z0-9\#\.\_\=\+\~\-]+@([a-z0-9\-]+\.)+[a-z]{2,4}$";
    $erg = ereg($re,$empfaenger);  
    
    
    if ((!is_numeric($a) || !is_numeric($b)) && $_POST["checked"]) {
    return;
// Ergebnis wird gerundet und an die  eMail geschickt        
    } elseif ($empfaenger && $stelle) {          
      if ($a == "0" OR $b == "0" OR $stelle == "0" && $_POST["checked"]) {
         echo "<br><br>";
         echo $name["linie"];
         echo "<font color=\"red\">Sie haben die Zahl 0 angegeben. Diese wird nicht akzeptiert.</font>";   
      }
      else {     
    $addip = fopen ("zus/ips.txt","a");
	  fwrite ($addip, "
$speicherung");
	  fclose ($addip);   
       switch ($_POST["methode"])
    {        
         case "add": 
             $Ergeb = $a + $b;
             echo "<br><br>";
             echo $name["linie"];
         if ($erg == false) {
             echo "Sie haben leider eine ung&uuml;ltige eMail angegeben.<br><br>";
             echo "<font color=\"green\">".$rechnung."<b>".$a." + ".$b." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
         } else {        
             echo $emailsend;
             echo "<font color=\"green\">".$rechnung."<b>".$a." + ".$b." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
             $message = $emailone."
             ".$rechnung." ".$a." + ".$b." = ".$Ergeb."
             ".$gerund." ".$gerundet."
             ".$emailtwo;
             @mail($empfaenger,$betreff,$message,$absender);
          }   
             break;      
         case "sub":
             $Ergeb = $a - $b;
             echo "<br><br>";
             echo $name["linie"];
           if ($erg == false) {
             echo "Sie haben leider eine ung&uuml;ltige eMail angegeben.<br><br>";
             echo "<font color=\"green\">".$rechnung."<b>".$a." - ".$b." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
         } else {        
             echo $emailsend;
             echo "<font color=\"green\">".$rechnung."<b>".$a." - ".$b." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
             $message = $emailone."
             ".$rechnung." ".$a." - ".$b." = ".$Ergeb."
             ".$gerund." ".$gerundet."
             ".$emailtwo;
             @mail($empfaenger,$betreff,$message,$absender);
          }   
             break;
         case "multi":
             $Ergeb = $a * $b;
             echo "<br><br>";
             echo $name["linie"];
         if ($erg == false) {
             echo "Sie haben leider eine ung&uuml;ltige eMail angegeben.<br><br>";
             echo "<font color=\"green\">".$rechnung."<b>".$a." * ".$b." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
         } else {         
             echo $emailsend;
             echo "<font color=\"green\">".$rechnung."<b>".$a." * ".$b." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
             $message = $emailone."
             ".$rechnung." ".$a." * ".$b." = ".$Ergeb."
             ".$gerund." ".$gerundet."
             ".$emailtwo;
             @mail($empfaenger,$betreff,$message,$absender);
          }   
             break;
         case "divi":
             $Ergeb = $a / $b;
             echo "<br><br>";
             echo $name["linie"];
         if ($erg == false) {;
             echo "Sie haben leider eine ung&uuml;ltige eMail angegeben.<br><br>";
             echo "<font color=\"green\">".$rechnung."<b>".$a." / ".$b." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
         } else {       
             echo $emailsend;
             echo "<font color=\"green\">".$rechnung."<b>".$a." / ".$b." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
             $message = $emailone."
             ".$rechnung." ".$a." / ".$b." = ".$Ergeb."
             ".$gerund." ".$gerundet."
             ".$emailtwo;
             @mail($empfaenger,$betreff,$message,$absender);
          }   
             break;
         case "divirest":
             $Ergeb = $a % $b;
             echo "<br><br>";
             echo $name["linie"];
         if ($erg == false) {
             echo "Sie haben leider eine ung&uuml;ltige eMail angegeben.<br><br>";
             echo "<font color=\"green\">".$rechnung."<b>".$a." / ".$b." = ".$Ergeb." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
         } else {          
             echo $emailsend;
             echo "<font color=\"green\">".$rechnung."<b>".$a." / ".$b." = ".$Ergeb." = ".$Ergeb."</b></font>";
             $message = $emailone."
             ".$rechnung." ".$a." / ".$b." = ".$Ergeb." = ".$Ergeb."
             ".$emailtwo;
             @mail($empfaenger,$betreff,$message,$absender);
          }   
             break;    
    }
    }
// Ergebnis wird nur an die eMail geschickt
    } elseif ($empfaenger) {  
      if ($a == "0" OR $b == "0" && $_POST["checked"]) {
         echo "<br><br>";
         echo $name["linie"];
         echo "<font color=\"red\">Sie haben die Zahl 0 angegeben. Diese wird nicht akzeptiert.</font>";
      }
      else {   
    $addip = fopen ("zus/ips.txt","a");
	  fwrite ($addip, "
$speicherung");
       switch ($_POST["methode"])
    {     
         case "add":
             $Ergeb = $a + $b;
             echo "<br><br>";
             echo $name["linie"];
         if ($erg == false) {
             echo "Sie haben leider eine ung&uuml;ltige eMail angegeben.<br><br>";
             echo "<font color=\"green\">".$rechnung."<b>".$a." + ".$b." = ".$Ergeb."</b></font>";
         } else {          
             echo $emailsend;
             echo "<font color=\"green\">".$rechnung."<b>".$a." + ".$b." = ".$Ergeb."</b></font>";
             $message = $emailone."
             ".$rechnung." ".$a." + ".$b." = ".$Ergeb."
             ".$emailtwo;
             @mail($empfaenger,$betreff,$message,$absender);
          }
             break;
         case "sub":
             $Ergeb = $a - $b;
             echo "<br><br>";
             echo $name["linie"];
         if ($erg == false) {
             echo "Sie haben leider eine ung&uuml;ltige eMail angegeben.<br><br>";
             echo "<font color=\"green\">".$rechnung."<b>".$a." - ".$b." = ".$Ergeb."</b></font>";
         } else {          
             echo $emailsend;
             echo "<font color=\"green\">".$rechnung."<b>".$a." - ".$b." = ".$Ergeb."</b></font>";
             $message = $emailone."
             ".$rechnung." ".$a." - ".$b." = ".$Ergeb."
             ".$emailtwo;
             @mail($empfaenger,$betreff,$message,$absender);
          }
             break;
         case "multi":
             $Ergeb = $a * $b;
             echo "<br><br>";
             echo $name["linie"];
         if ($erg == false) {
             echo "Sie haben leider eine ung&uuml;ltige eMail angegeben.<br><br>";
             echo "<font color=\"green\">".$rechnung."<b>".$a." * ".$b." = ".$Ergeb."</b></font>";
         } else {          
             echo $emailsend;
             echo "<font color=\"green\">".$rechnung."<b>".$a." * ".$b." = ".$Ergeb."</b></font>";
             $message = $emailone."
             ".$rechnung." ".$a." * ".$b." = ".$Ergeb."
             ".$emailtwo;
             @mail($empfaenger,$betreff,$message,$absender);
          }
             break;
         case "divi":
             $Ergeb = $a / $b;
             echo "<br><br>";
             echo $name["linie"];
         if ($erg == false) {
             echo "Sie haben leider eine ung&uuml;ltige eMail angegeben.<br><br>";
             echo "<font color=\"green\">".$rechnung."<b>".$a." / ".$b." = ".$Ergeb."</b></font>";
         } else {          
             echo $emailsend;
             echo "<font color=\"green\">".$rechnung."<b>".$a." / ".$b." = ".$Ergeb."</b></font>";
             $message = $emailone."
             ".$rechnung." ".$a." / ".$b." = ".$Ergeb."
             ".$emailtwo;
             @mail($empfaenger,$betreff,$message,$absender);
          }
             break;
          case "divirest":
             $Ergeb = $a % $b;
             echo "<br><br>";
             echo $name["linie"];
         if ($erg == false) {
             echo "Sie haben leider eine ung&uuml;ltige eMail angegeben.<br><br>";
             echo "<font color=\"green\">".$rechnung."<b>".$a." / ".$b." = ".$Ergeb." = ".$Ergeb."</b></font>";
         } else {          
             echo $emailsend;
             echo "<font color=\"green\">".$rechnung."<b>".$a." / ".$b." = ".$Ergeb." = ".$Ergeb."</b></font>";
             $message = $emailone."
             ".$rechnung." ".$a." / ".$b." = ".$Ergeb." = ".$Ergeb."
             ".$emailtwo;
             @mail($empfaenger,$betreff,$message,$absender);
          }
             break;
             
    }
    }
// Ergebnis wird nur gerundet
    } elseif ($stelle) {
      if (($a == "0" OR $b == "0" OR $stelle == "0") && $_POST["checked"]) {
         echo "<br><br>";
         echo $name["linie"];
         echo "<font color=\"red\">Sie haben die Zahl 0 angegeben. Diese wird nicht akzeptiert.</font>";
      }
      else {   
    $addip = fopen ("zus/ips.txt","a");
	  fwrite ($addip, "
$speicherung");
         switch ($_POST["methode"]) 
    {
         case "add":
             $Ergeb = $a + $b;
             echo "<br><br>";
             echo $name["linie"];
             echo "<font color=\"green\">".$rechnung."<b>".$a." + ".$b." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
             break;
         case "sub":
             $Ergeb = $a - $b;
             echo "<br><br>";
             echo $name["linie"];
             echo "<font color=\"green\">".$rechnung."<b>".$a." - ".$b." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
             break;
         case "multi":
             $Ergeb = $a * $b;
             echo "<br><br>";
             echo $name["linie"];
             echo "<font color=\"green\">".$rechnung."<b>".$a." * ".$b." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
             break;
         case "divi":
             $Ergeb = $a / $b;
             echo "<br><br>";
             echo $name["linie"];
             echo "<font color=\"green\">".$rechnung."<b>".$a." / ".$b." = ".$Ergeb."</b><br>";
             $runden = round($Ergeb,$stelle);
             $gerundet = number_format($Ergeb, $stelle, '.', '');
             echo $gerund."<b>".$gerundet."</b></font>";
             break;
         case "divirest":
             $Ergeb = $a % $b;
             echo "<br><br>";
             echo $name["linie"];
             echo "<font color=\"green\">".$rechnung."<b>".$a." / ".$b." = ".$Ergeb." = ".$Ergeb."</b></font>";
             break; 
    }
    }
// Ergebnis wird nur ausgegeben
    } else {
      if ($a == "0" OR $b == "0" && $_POST["checked"]) {
         echo "<br><br>";
         echo $name["linie"];
         echo "<font color=\"red\">Sie haben die Zahl 0 angegeben. Diese wird nicht akzeptiert.</font>";
      }
      else {   
    $addip = fopen ("zus/ips.txt","a");
	  fwrite ($addip, "
$speicherung");
         switch ($_POST["methode"])     
    {
        case "add":
             $Ergeb = $a + $b;
             echo "<br><br>";
             echo $name["linie"];
             echo "<font color=\"green\">".$rechnung."<b>".$a." + ".$b." = ".$Ergeb."</b><br></font>";
             break;
        case "sub":
             $Ergeb = $a - $b;
             echo "<br><br>";
             echo $name["linie"];
             echo "<font color=\"green\">".$rechnung."<b>".$a." - ".$b." = ".$Ergeb."</b><br></font>";
             break;
        case "multi":
             $Ergeb = $a * $b;
             echo "<br><br>";
             echo $name["linie"];
             echo "<font color=\"green\">".$rechnung."<b>".$a." * ".$b." = ".$Ergeb."</b><br></font>";
             break;
        case "divi":
             $Ergeb = $a / $b;
             echo "<br><br>";
             echo $name["linie"];
             echo "<font color=\"green\">".$rechnung."<b>".$a." / ".$b." = ".$Ergeb."</b><br></font>";
             break;
        case "divirest":
             $Ergeb = $a % $b;
             echo "<br><br>";
             echo $name["linie"];
             echo "<font color=\"green\">".$rechnung."<b>".$a." / ".$b." = ".$Ergeb." = ".$Ergeb."</b></font>";  
             break;
     }
     }
     }
?>
</form>
</body>
</html>

Vielen Dank.

10.03.2006 08:52

3 Marcel (Gast)

Danke.

Kannst du mir eventuell sagen, warum folgende Zeile nicht funktioniert?:

     if (($a == "0" OR $b == "0" OR $stelle == "0") && $_POST["checked"]) {


Mit "nicht funktioniert" meine ich die Variable $stelle. $a und $b überprüft er. $stelle wird aber auch mit dem Wert "0" akzeptiert.

11.03.2006 11:31

4 Jörg Kruse

Du hast diese if-Konstruktion mehrmals eingebaut, in Zeile 358 ohne die Variable $stelle zu prüfen:

if ($a == "0" OR $b == "0" && $_POST["checked"]) { 

Das musst du dort nur noch entsprechend ergänzen

Besser wäre es, die if-Konstrukte so ineinander zu verschachteln, dass du die Bedingungen jeweils nur einmal prüfen musst. Also die Prüfung nach der "0" z.B. weiter nach außen, so dass du sie nicht jedesmal wiederholen musst

11.03.2006 13:12

5 Marcel (Gast)

So habe ich mir das zu Anfang auch vorgestellt. Aber wenn ich es so mache, dann komm ich nicht zu dem gewünschten Ergebnis. Und zwar sind die Stelle und die eMail optionale Felder. Wenn ich die Stelle automatisch überprüfe, dann geht er natürlich davon aus, dass sie gesetzt sein muss. Deswegen habe ich es so gemacht, dass er je nach Bedingung eine andere Prüfung durchführt.

if ($a == "0" OR $b == "0" && $_POST["checked"]) { 

Hier ist es ganz genauso; hier kann ich die Stelle nicht überprüfen, da sie gar nicht pflicht ist.

11.03.2006 13:26

6 Jörg Kruse

hier kann ich die Stelle nicht überprüfen, da sie gar nicht pflicht ist.

Warum nicht? Auch wenn eine Variable leer ist, kann sie verglichen werden mit einem Wert

11.03.2006 13:53

7 Marcel (Gast)

BAH, du hast Recht. Es funktioniert. :)

Aber wie stellst du dir das mit der verschachtelten Prüfung nun vor?

11.03.2006 14:06

8 Jörg Kruse

Die if-Konstrukte so verschachteln, dass du jedes - soweit möglich - nur einmal aufführst. Beispiel: wenn du so eine Verschachtelung hast:

if($a == 1) {
if($b == "") {
echo "b muss ausgefüllt sein";
} else {
echo "richtig";
}
} else {
if($b == "") {
echo "b muss ausgefüllt sein";
} else {
echo "falsch";
}
}

... diese ändern in:

if($b == "") {
echo "b muss ausgefüllt sein";
} else {
if($a == 1) {
echo "richtig";
} else {
echo "falsch";
}
}

Das ist kürzer und übersichtlicher, da die Prüfung nach $b nur einmal aufgeführt ist

11.03.2006 15:41 | geändert: 11.03.2006 15:43

9 Marcel (Gast)

Naja, aber ich habe so gemacht, dass das Ergebnis auch ausgegeben wird, wenn z. B. die eMail falsch ist. Da die Rechnung mit Ergebnis jedes Mal anders ist, muss ich es doch einzeln abfragen.

11.03.2006 15:54

10 Jörg Kruse

Was meinst du mit "einzeln abfragen"?

Wenn es Abfragen gibt, die auf allen unteren Ebenen identisch sind, dann würde ich prüfen, ob man diese nicht auf einer höheren Ebene zusammenfassen kann, indem man die Reihenfolge der if-Konstrukte innerhalb der Verschachtelung ändert. So wie in meinem Beispiel. Die beiden Varianten bewirken exakt das gleiche, nur dass zweitere kürzer und übersichtlicher und infolge dessen auch pflegeleichter ist

12.03.2006 09:42 | geändert: 12.03.2006 09:44

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]