• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Feedback gewünscht Erlernen von PHP

Jonny42

Neues Mitglied
Hallo liebe Community,

ich lerne derzeitig HTML und PHP. Um mich langsam hineinzufinden habe ich angefangen Übungsaufgaben zu lösen. An sich bekomme ich auch mit den bisher gelernten Mitteln alles gelöst, doch möchte ich nun etwas mehr lernen. Daher wollte ich hier mal fragen, ob mir jemand den ein oder anderen Kniff an einer schon von mir gelösten Aufgabe zeigen kann.

2015-09-22_1538.jpg

Meine HTML sieht so aus:

Code:
<!DOCTYPE html>
<html>

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>IT-Abschlussprüfung</title>
<!-- Schriftart für die Überschrift -->
<style type="text/css">
.auto-style1 {
	font-size: x-large;
}
.auto-style2 {
	text-align: center;
}
</style>
</head>

<body>
<!-- Start des Formulars -->
<form method="post" action="abschlusspruefung_auswertung.php">
<strong><br>
<span class="auto-style1">Auswertung schriftliche IT-Abschlussprüfung</span>
</strong>
<table style="width: 51%">
	<tr>
		<td colspan="3" class="auto-style2">
		<strong><br><br>Teil A<br><br></strong></td>
	</tr>
	<tr>
		<td>Betriebliche Projekarbeit und Dokumentation</td>
		<td>Präsentation und Fachgespräch</td>
		<td>&nbsp;</td>
	</tr>
	<tr>
		<td>Punkte <input type="text" name="a1"></td>
		<td>Punkte <input type="text" name="a2"></td>
		<td>&nbsp;</td>
	</tr>
	<tr>
		<td colspan="3" class="auto-style2"><strong><br><br>Teil B<br><br></strong></td>
	</tr>
	<tr>
		<td>Ganzheitliche Aufgabe I Fachqualifikation</td>
		<td>Ganzheitliche Aufgabe II Kernqualifikation</td>
		<td>Wirtschafts- und Sozialkunde</td>
	</tr>
	<tr>
		<td>Punkte <input type="text" name="b1"></td>
		<td>Punkte <input type="text" name="b2"></td>
		<td>Punkte <input type="text" name="b3"></td>
	</tr>
</table>

	<br>
	<br><input name="Submit1" type="submit" value="Auswerten">
	&nbsp;&nbsp;&nbsp;<input name="Reset1" type="reset" value="Zurücksetzen" /></form>
	
</body>

</html>

Und meine PHP so:

Code:
<!DOCTYPE html>
<html>

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>IT-Abschlussprüfung Auswertung</title>
<!-- Schriftart für die Überschrift -->
<style type="text/css">
.auto-style1 {
	font-size: x-large;
}
</style>
</head>

<body>

<?php
//////////////////////////////////////////////////////////////////////
//Einstellungen für die prozentualen Anteile (Angaben sind in %)//////
//A-Doku														//////
$a1prozent = 50;												//////
//a-PräsFach													//////
$a2prozent = 50;												//////
//B-GA1															//////
$b1prozent = 40;												//////
//B-GA2															//////
$b2prozent = 40;												//////
//B-WiSo														//////
$b3prozent = 20;												//////
//////////////////////////////////////////////////////////////////////

// Variablen
$a1 = $_POST['a1'];
$a2 = $_POST['a2'];
$b1 = $_POST['b1'];
$b2 = $_POST['b2'];
$b3 = $_POST['b3'];

$a1auswertung = $a1 / 100 * $a1prozent;
$a2auswertung = $a2 / 100 * $a2prozent;
$b1auswertung = $b1 / 100 * $b1prozent;
$b2auswertung = $b2 / 100 * $b2prozent;
$b3auswertung = $b3 / 100 * $b3prozent;

$agesamt = $a1auswertung + $a2auswertung;
$bgesamt = $b1auswertung + $b2auswertung + $b3auswertung;

$astat = "bestanden";
$bstat = "bestanden";
$anot = "";
$bnot = "";

//Überschrift
echo "<strong><br><span class=\"auto-style1\">Auswertung schriftliche IT-Abschlussprüfung</span></strong><br><br>";

// Test auf Einhaltung des Limits
$test = array($a1, $a2, $b1, $b2, $b3);

foreach($test as $element) {
    if ($element > 100 || $element < 0) {
        echo "<p style='color : red'>Achtung: '{$element}' befindet sich nicht im Bereich zwischen 0 und 100. Bitte überprüfen Sie Ihre Eingabe.</p>";
        die();
    }
}

// Für den Test erstellte Variable löschen
unset($element);

//Auswertung Teil A
if ($agesamt >= 50 && $a1 < 30 && $a2 >= 30) {
$astat = "nicht bestanden";
$anot = ", Doku ($a1 Punkte, ungenügend)";
} elseif ($agesamt >= 50 && $a1 >= 30 && $a2 < 30) {
$astat = "nicht bestanden";
$anot = ", PräsFach ($a2 Punkte, ungenügend)";
} elseif ($agesamt < 50) {
$astat = "nicht bestanden";
}

//Notenauswertung Teil A
if ($agesamt < 30) {
$anote = "ungenügend";
} elseif ($agesamt < 50) {
$anote = "mangelhaft";
} elseif ($agesamt < 67) {
$anote = "ausreichend";
} elseif ($agesamt < 81) {
$anote = "befriedigend";
} elseif ($agesamt < 92) {
$anote = "gut";
} else {
$anote = "sehr gut";
}

//Auswertung Teil B
if ($bgesamt >= 50 && $b1 < 30 && $b2 >= 30 && $b3 >= 30) {
$bstat = "nicht bestanden";
$bnot = ", GA1 ($b1 Punkte, ungenügend)";
} elseif ($bgesamt >= 50 && $b1 >= 30 && $b2 < 30 && $b3 >= 30) {
$bstat = "nicht bestanden";
$bnot = ", GA2 ($b2 Punkte, ungenügend)";
} elseif ($bgesamt >= 50 && $b1 >= 30 && $b2 >= 30 && $b3 < 30) {
$bstat = "nicht bestanden";
$bnot = ", WiSo ($b3 Punkte, ungenügend)";
} elseif ($bgesamt >= 50 && $b1 < 30 && $b2 >= 30 && $b3 < 30) {
$bstat = "nicht bestanden";
$bnot = ", GA1 ($b1 Punkte, ungenügend), WiSo ($b3 Punkte, ungenügend)";
} elseif ($bgesamt >= 50 && $b1 >= 30 && $b2 < 30 && $b3 < 30) {
$bstat = "nicht bestanden";
$bnot = ", GA2 ($b2 Punkte, ungenügend), WiSo ($b3 Punkte, ungenügend)";
} elseif ($bgesamt >= 50 && $b1 < 30 && $b2 < 30 && $b3 >= 30) {
$bstat = "nicht bestanden";
$bnot = ", GA1 ($b1 Punkte, ungenügend), GA2 ($b2 Punkte, ungenügend)";
} elseif ($bgesamt < 50) {
$bstat = "nicht bestanden";
}

//Notenauswertung Teil B
if ($bgesamt < 30) {
$bnote = "ungenügend";
} elseif ($bgesamt < 50) {
$bnote = "mangelhaft";
} elseif ($bgesamt < 67) {
$bnote = "ausreichend";
} elseif ($bgesamt < 81) {
$bnote = "befriedigend";
} elseif ($bgesamt < 92) {
$bnote = "gut";
} else {
$bnote = "sehr gut";
}


//Ausgabe
echo "Ergebnis Teil A: $astat ($agesamt Punkte, $anote)$anot";
echo "<br>";
echo "Ergebnis Teil B: $bstat ($bgesamt Punkte, $bnote)$bnot";

?>

</body>

</html>

Wäre nett wenn mir wer ein paar Tipps geben könnte, was ich anders/besser machen kann. Bin für jeden Vorschlag offen und dankbar.
 
Werbung:
Ich arbeite mich mal oben nach unten durch:
1. Mit welchem Medium lernst du die Sprachen?
2. Tabellenlayouts in HTML sind veraltet und werden kaum noch gebraucht.
3. Ehrlich gesagt verstehe Ich den ganzen Nutzen/die Aufgabe des Programms nicht. Soll man seine Punktzahl in der Klausur eintragen und sieht dann ob man bestanden hat oder wie funktioniert das?
4. Du benutzt mehrmals verzweigte If-Konstrukte mit elseif und so. Kannst du natürlich machen aber einfacher ist eine switch/case Anweisung. Wenn die in deinem Tutorial noch kommt habe Ich nichts gesagt, wenn nicht ist sie ein nützliches Werkzeug um Bedingungen abzuklappern :)
5. Sehr gut finde Ich dass du viele Komentare machst, weshalb dein Code gut lesbar ist
 
Ich arbeite mich mal oben nach unten durch:
1. Mit welchem Medium lernst du die Sprachen?
2. Tabellenlayouts in HTML sind veraltet und werden kaum noch gebraucht.
3. Ehrlich gesagt verstehe Ich den ganzen Nutzen/die Aufgabe des Programms nicht. Soll man seine Punktzahl in der Klausur eintragen und sieht dann ob man bestanden hat oder wie funktioniert das?
4. Du benutzt mehrmals verzweigte If-Konstrukte mit elseif und so. Kannst du natürlich machen aber einfacher ist eine switch/case Anweisung. Wenn die in deinem Tutorial noch kommt habe Ich nichts gesagt, wenn nicht ist sie ein nützliches Werkzeug um Bedingungen abzuklappern :)
5. Sehr gut finde Ich dass du viele Komentare machst, weshalb dein Code gut lesbar ist

2. Stimmt wohl, allerdings ist das hier ein Zwitter. Tabellen sollten eig. nur für die Auflistung von Daten verwendet werden.
4. Bei Switch-Case hat er, wenn er es so umsetzt, die gleiche Menge an Kot.
5. Eininge Kommentare hätte man sich sparen können, so komplex ist es ja doch nicht.

Achja und das "<br>" und &nbsp; - geschisse kann auch raus. :D
 
Werbung:
Ich arbeite mich mal oben nach unten durch:
1. Mit welchem Medium lernst du die Sprachen?
Naja, an sich querbeet. Habe da keine festen Tutorials oder sonst was, da ich die Beispiele oft gar nicht wirklich in die Praxis umsetzen kann und oft schlecht oder gar nicht erklärt wird wie ich es in Fall xyz anzuwenden habe. Einiges habe ich durchs erfragen gelernt, weshalb ich hier gerade mit dem "Konstrukt" versuche ein besseres Verständnis zu bekommen, bzw. evtl. ein paar Tipps wie es besser geht.
2. Tabellenlayouts in HTML sind veraltet und werden kaum noch gebraucht.
Wird das alles über CSS geregelt? Damit habe ich mich leider noch so gut wie gar nicht befasst.
3. Ehrlich gesagt verstehe Ich den ganzen Nutzen/die Aufgabe des Programms nicht. Soll man seine Punktzahl in der Klausur eintragen und sieht dann ob man bestanden hat oder wie funktioniert das?
Indem die Punkte für alle Teilbereiche eingetragen werden, soll das Programm am Ende bestimmen ob man die Prüfung bestanden hat. Dazu ist die Prüfung in Teil A und B aufgeteilt, mit jeweils zwei bzw. drei Aufgaben, die unterschiedlich schwer wiegen. Um Teil A bzw B zu bestehen müssen insgesamt mindestens 50 Punkte erreicht werden, es darf aber keine einzelne Aufgabe weniger als 30 Punkte haben. Siehe z.B. den letzten Satz in der Aufgabenstellung. Es wurden mehr als 50 Punkte insgesamt für Teil B erreicht, allerdings ist ein Teilbereich mit weniger als 30 Punkten abgeschlossen worden.
4. Du benutzt mehrmals verzweigte If-Konstrukte mit elseif und so. Kannst du natürlich machen aber einfacher ist eine switch/case Anweisung. Wenn die in deinem Tutorial noch kommt habe Ich nichts gesagt, wenn nicht ist sie ein nützliches Werkzeug um Bedingungen abzuklappern :)
Damit kenne ich mich noch nicht wirklich aus. Könntest du mir da ein Beispiel geben? Habe extra eine schon gelöste Aufgabe genommen, damit man daran direkt arbeiten kann, die Veränderung sieht und es auch verstehen kann. =D

PS: Ich möchte hier nicht den Eindruck erwecken, dass ihr hier für mich Korrektur lesen sollt. Es ist einfach nur meine erste etwas komplexere Aufgabe und es lässt mir einfach keine Ruhe ;)
 
Zuletzt bearbeitet:
Naja, an sich querbeet. Habe da keine festen Tutorials oder sonst was, da ich die Beispiele oft gar nicht wirklich in die Praxis umsetzen kann und oft schlecht oder gar nicht erklärt wird wie ich es in Fall xyz anzuwenden habe. Einiges habe ich durchs erfragen gelernt, weshalb ich hier gerade mit dem "Konstrukt" versuche ein besseres Verständnis zu bekommen, bzw. evtl. ein paar Tipps wie es besser geht.
http://www.phptherightway.com/

Wird das alles über CSS geregelt? Damit habe ich mich leider noch so gut wie gar nicht befasst.
Right.

Damit kenne ich mich noch nicht wirklich aus. Könntest du mir da ein Beispiel geben? Habe extra eine schon gelöste Aufgabe genommen, damit man daran direkt arbeiten kann, die Veränderung sieht und es auch verstehen kann. =D

PHP:
$fruit = "Banane";

switch($fruit) {
    case "Banane":
         echo "Die Banane ist gelb.";
         break;
 
   case "Apfel":
        echo "Äpfel hängen am Baum.";
        break;

   case "Erdbeere":
        echo "Die Erdbeere ist rot,  so wie wenn meine Frau Ihre Tage hat."
        break;

   default:
        echo "Keine bekannte Frucht angegeben.";
        break;
}
 
Ok, mit dem switch wüsste ich jetzt nicht wirklich viel anzufangen, wie ich es einbinden könnte und wie ich damit Code einsparen kann.

Ich Lege bei switch also eine Variable fest und wenn diese dann zutrifft wird der jeweilige Teil, hier echo, ausgegeben?
 
Werbung:
Wäre sonst noch was wichtiges? Irgendwelche schweren Patzer oder Verbesserungsvorschläge?

Bisher halte ich schon mal fest, dass ich mir unbedingt CSS für Tabellen anschauen muss.
 
Also ich finde die if bedingungen schon in Ordnung. Denn wie nookie schon sagte du hast die gleiche Menge bzw. sogar mehr zu schreiben bei der switch case. Das was mir noch aufgefallen ist, ist das du nichts abfängst, also keinerlei Fehler.

Denn wenn du im Formular zum beispiel eine 0 eingibst oder ein String ( also text wie "Hallo Welt") Wird es nicht klappen. Das könntest du abfangen und eine weiterleitung zurück zu deinem Formular setzen mit einer Fehlermeldung wie "Eingaben müssen aus Zahlen bestehen" oder so

Für die Prozentualen Anteile würde ich sogar Konstante nehmen.
 
Werbung:
Denn wenn du im Formular zum beispiel eine 0 eingibst oder ein String ( also text wie "Hallo Welt") Wird es nicht klappen. Das könntest du abfangen und eine weiterleitung zurück zu deinem Formular setzen mit einer Fehlermeldung wie "Eingaben müssen aus Zahlen bestehen" oder so
Daran habe ich mich schon versucht. Ich habe es bisher geschafft, dass nur Zahlen eingegeben werden konnten und alles andere abgefangen wurde. Allerdings war dann auch die Eingabe mit einem Dezimalkommer nicht mehr möglich.
Andersherum habe ich es geschafft Schrifteingaben abzufangen, allerdings ließ es Schrift in Kombination mit Zahlen zu. Also "123Hallo" ging einfach durch.
Ehrlich gesagt habe ich daran mehrere Stunden gesessen und einfach keine zufriedenstellende Lösung gefunden.

Für die Prozentualen Anteile würde ich sogar Konstante nehmen.
Wie meinst du?
 
Das wird dir bei dem abfangen helfen
http://php.net/manual/de/function.is-numeric.php

Beispiel wäre dann
PHP:
if(is_numeric($value)) {
   // $value ist eine Zahl bzw. numerisch, also 
}else{
   // $value ist keine Zahl
}
Anstelle von
//A-Doku //////
$a1prozent = 50; //////
//a-PräsFach //////
$a2prozent = 50; //////
//B-GA1 //////
$b1prozent = 40; //////
//B-GA2 //////
$b2prozent = 40; //////
//B-WiSo //////
$b3prozent = 20;

könntest du folgendes machen
http://php.net/manual/de/language.constants.php

PHP:
define('A1Prozent', 50);

echo A1Prozent;
Konstanten kannst du zur Laufzeit des Scripts halt nicht mehr ändern. Und für einfache Werte ist das ganz gut geeignet, vorrausgesetzt das sich die Werte nicht mehr ändern
 
Danke für den Tipp mit den Konstanten. Werde ich gleich mal umsetzen.

Das mit is_numeric habe ich schon probiert. Genau dabei habe ich ja das Problem, dass das Dezimalkomma nicht mehr genommen wird. Oder gilt das Komma als Tausendertrennzeichen, sodass ich mit einem Punkt den Dezimalwert bestimme? Also 22.34 anstelle von 22,34? Wenn ja, wie könnte ich das ändern?
 
Werbung:
Also beim programmieren musst du immer mit Punkt rechnen. Du müsstest denn falls du es mit Komma eingeben willst das komma durch einen Punkt ersetzen. Da gibt es nun mehrere Möglichkeiten, number_format und sicher noch paar Sachen, aber ich zeig dir erstmal das einfachste

PHP:
$value = "22,38";
$newValue = str_replace(',', '.', $value);
Und dann den neuen Wert mit is_numeric() prüfen. Denn wenn du auf den Link oben von is_numeric gehst, siehst du ja auch im beispiel das es geht mit float Werten
 
Heißt also ich müsste meinen 5 Variablen erst einmal eine, ich sag mal, neue Variable zuweisen.
Kann ich das schon irgendwie vorher mit einbauen oder geht das erst wenn ich die Daten aus der HTML zugeordnet habe?

Also so?
PHP:
$a1 = $_POST['a1'];
$a1new = str_replace(',', '.', $a1);

Oder gehts auch besser?
 
Werbung:
Ok, das wollte ich wissen. Danke sehr.

Für die Numerische Eingabe würde ich es dann wohl so lösen:
PHP:
foreach($test as $element) {
    if (!preg_match("#^[0-9\.]+$#", $element)) {
        echo "<p style='color : red'>Achtung: '{$element}' ist keine Zahl. Bitte überprüfen Sie Ihre Eingabe.</p>";
        die();
    }
}
 
Geht auch, aber das musst du natürlich vor deinem Berechnungen machen. Weil sonst würde es zu einem Fehler kommen, weil 0 kannst du nicht multiplizieren. Weiß nur gerade net ob es ein Warning gibt oder ein Fatal Error,
 
Hm, ich habe soweit keine Probleme mit der 0.

Habe für Teil A die Werte 100 und 0 gesetzt. (Beide Bereiche werden mit 50% gewertet)

Ergebnis Teil A: nicht bestanden (50 Punkte, ausreichend), Doku (0 Punkte, ungenügend)

XAMPP ist eingestellt mir alle Fehler auszugeben und ich bekomm auch keinen.
 
Werbung:
Hallo
Mit 0 Kann man multiplizieren, man darf nicht durch 0 dividieren!

Du hast ja schon einiges an Tips beklommen.
Ein allgemeiner Tip:
Achte immer darauf, dass du das EVA-Prinzip einhälst.

Ich weiss ja nicht, ob du schon so weit bist, aber dein Beispiel eignet sich sehr schön, um require, require_once und die entsprechenden includes zu üben, so könntest du z.B. den HTML-Kopf in eine html_head.php auslagern und diese Datei jedes Mal per require_once("html_head.php"); einbinden. Den header kannst du auch in deinem Formular verwenden.

das sieht dann so aus:

html_head.php
PHP:
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>IT-Abschlussprüfung Auswertung</title>
<!-- Schriftart für die Überschrift -->
<style type="text/css">
.auto-style1 {
    font-size: x-large;
}
</style>
</head>
<body>

Dein PHP Code
PHP:
<?php
require_once("html_head.php");

// ab hier dann dein Code

Der HTML-Teil?
Bedeutet das, du speicherst dein Formular als HTML-Datei und deinen Berchnungscode als PHP-Script?
Dass würde ich vermeiden. Auch dein Formular kannst du als PHP-Datei speichern, was dir wieder den Vorteil des require_once("html_head.php"); bringen würde (der header ist ja auf den ersten Blick der selbe wie im PHP-Script)

PHP:
$a1 = $_POST['a1'];
$a2 = $_POST['a2'];
$b1 = $_POST['b1'];
$b2 = $_POST['b2'];
$b3 = $_POST['b3'];
Das ist unnötig, du kannst direkt mit den $_POST Variablen arbeiten, eine Neubelegung ist nicht notwendig.

Viele Kommentare, sehr gut. Die vielen // sind aber unter Umständen eine Fehlerquelle, an der falschen Stelle gesetzt, setzen sie ein REM und du suchst nach Fehlern. Natürlich ist das Geschmackssache, aber ich setze Kommentare immer vor dem eigentlichen Code. Z.B.

PHP:
/*
**********************************************************************************************************************
* ####################################################################################################################
*
*  Ab hier kann man ruhig die Gundeinstellungen verwenden und später über die Konfiguration anpassen
*
* ####################################################################################################################
**********************************************************************************************************************
*/

// Soll die Konfiguration aus der conf.php komplett neu eingelesen werden muss truncate=1 und update=0 gesetzt werden
$config['truncate_conf_table']          = 1;
$config['update_conf_table_only']       = 1;

Das wirkt leserlich und ist auch noch optisch halbwegs schön. Zwischen /* und */ wird alles als REM betrachtet, so lassen sich mehrere Zeilen als REM definieren.

Es gäbe da noch ein paar Kleinigkeiten, wie z.B. dein test-array, das man sich ersparen könnte, wenn man die Prozente gleich in ein Array füllen würde, aber das lassen wir, das ist ja ein Übungsscript.

So, nun war ich sehr pingelig, aber nichts für Ungut, soll ja eine Hilfestellung sein. Dein Code ist schon recht ordentlich, weiter so.
 
Zuletzt bearbeitet:
Danke für die vielen Tipps. Jeder Ratschlag hilft mir weiter :)

Ich hätte noch eine kleine Frage. Gibt es eine einfache Möglichkeit folgendes auf alle meine Variablen anzuwenden, oder muss ich es so, wie ich es jetzt habe, einzeln abfragen?

PHP:
if (empty($a1)) {
    $a1 = 0;
}
 
Zurück
Oben