Hauptmenü

Untermenü

PHP/MySQL - Praxistutorial 2 - Notices abfangen

1. Die Abschnitte

2. Und jetzt wird es ernst

Im vorherigen Abschnitt habt ihr ja schon ein wenig über Notices erfahren. Und jetzt zeige ich euch mal, zu was das führen kann. Dafür nehmen wir als Beispiel die Datei data/hersteller.php. Klickt jetzt in der Navigation auf Hersteller und dann im rechten Bereich bei einem Hersteller eurer Wahl auf "Ändern".

Sofort bekommt ihr den ersten Hinweis mit Notice: Undefined variable: update in euer_pfad\data\hersteller.php on line 39. Nun, das Problem kann man ganz einfach mit if (!empty($update)) lösen.

3. Aber!

Klickt jetzt auf "Eingeben" und wundert euch. Denn im Hauptfenster steht auf einmal Manipulationsversuch!. Aber warum nur? Nun, schaut mal die in Adresszeile eures Hauptfensters! Da steht auf einmal ...?tabelle=<br /><b>Notice</b>: Undefined index: id in <b>euer_pfad\data\hersteller.php</b> on line <b>46</b><br />hersteller&id=4. Lustig, nicht?

Das Problem

... kennt ihr schon aus dem vorherigen Abschnitt. Also die Sache mit $_GET['tabelle'] und $_GET['id']. Das hier ist dasselbe in Grün, nur ein wenig anders. Da wir hier das eine Mal mit $_GET und das andere Mal mit $_POST arbeiten basteln wir uns eine einfache Fallunterscheidung. Und zwar außerhalb jedweder bereits existierender Bedingung.


if (!empty($_GET['id']))
{
  $id $_GET['id'];
}
else if (!empty($_POST['id']))
{
  $id $_POST['id'];
}

Jetzt müssen wir nur noch innerhalb des action-Attributes unseres Formulars den PHP-Code so anpassen


<?php echo $_GET['tabelle'].'&id='.$id?>

und das gilt natürlich auch für das entsprechende hidden-Feld


<input type="hidden" name="id" value="<?php echo $id?>">

4. Noch etwas

Jetzt scheint so weit ja alles in Ordnung zu sein. Aber einen Fehler haben wir immer noch. Kommentiert dazu bitte mal die if (!empty($update))-Bedingung komplett aus. Dazu müsst ihr einfach vor das if ein /* und hinter der schließenden geschweiften Klammer ein */setzen.

Dann ändert ihr einen Wert und klickt auf "Eingeben". Et voilà. Auf einmal steht in allen Textfeldern ein <br /> <b>Notice</b>: Undefined variable: hersteller in <b> euer_pfad\data\hersteller.php </b> on line <b>X</b><br />.

Des Rätsels Lösung

Schaut euch genau den Code an. Dann seht ihr, dass $hersteller nur gesetzt wird, wenn keine Formulardaten via POST gesendet worden sind. Sobald wir also auf den "Eingeben"-Button drücken, ist selbige Variable nicht deklariert und wir bekommen den entsprechenden Hinweis. Und zwar direkt in den einzelnen input-Feldern. Lasst euch mal den erzeugten Quelltext vom Browser anzeigen.

Und wozu

... brauchen wir das jetzt? Es funktioniert doch. Ja schon. Aber! Was ist, wenn ihr die Daten zusätzlich überprüfen wollt? Dann müsst ihr bei einer fehlerhaften Eingabe alle Informationen neu eintragen. Um das zu vermeiden, müssen wir den Code ein wenig umstrukturieren. Zunächst mal packen wir den Abschnitt mit dem UPDATE-Statement nach oben. Aber natürlich unterhalb des require ('../inc/db.inc.php');.


if ($_POST)
{
  ...
}

Danach kommt die oben beschriebene Fallunterscheidung


if (!empty($_GET['id']))
...

und zum Schluss die geänderte Abfrage nach dem ausgewählten Datensatz, wobei die ursprüngliche Bedingung if (!$_POST)) entfernt wird.


$query 'SELECT 
            * 
          FROM 
            hersteller 
          WHERE 
            id = '.$id;
$result mysql_query ($query);
$hersteller mysql_fetch_row($result);

Damit wird also jedes Mal nach den entsprechenden Herstellerdaten gesucht und das Ergebnis in die Variable geschrieben. Sie ist somit immer vorhanden.

5. Fazit

Damit haben wir hier(!) alle Notices beseitigt. Auch wenn das nicht so ganz koscher war. Da gibt es bessere Möglichkeiten. Aber hier ging es ja nur um das Prinzip und darum, dass ihr euch der Problematik bewusst werdet. Wer will, kann jetzt das auskommentierte if (!empty($update)) wieder aktivieren. Und wer mit meinen Erläuterungen nicht klarkommt, soll sich einfach mal den Lösungscode ansehen.

Und mit dem nun erworbenen Wissen, wagen wir uns jetzt an die Überprüfung von Formulardaten. Man weiß ja nie, was für einen Schwachsinn die Leute so eingeben.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt