Hauptmenü

Untermenü

PHP/MySQL - Praxistutorial 1 - Daten ändern

1. Die Abschnitte

2. Erweiterung

Damit ein Datensatz geändert werden kann, muss die eindeutige ID bekannt sein. Und die haben wir uns ja beim Abschnitt Daten abfragen schon geholt. Jetzt müssen wir nur die gewünschte Datei aufrufen (in diesem Fall die hersteller.php) und sie übergeben. Dazu müsst ihr den Eintrag innerhalb der Schleife von funtions.inc.php entsprechend ändern.


$ausgabe .= '<p>
              <a href="#"
                onclick="fenster('."'".$_GET['tabelle']."',
                '".$_GET['tabelle'].'&id='.$list[$i]['id']."'".');">
                Ändern
              </a>'.
              $list[$i]['list'].
            '</p>';

Und mit &id='.$list[$i]['id'] erweitern wir unseren GET-Parameter um einen weiteren Wert.

3. Die hersteller.php

Um euch mal zu zeigen, wie unkomfortabel es ist, mit numerischen Indizes zu arbeiten, machen wir das jetzt mal. Ich habe aus der kunden.php schon ein wenig Code übernommen, der muss nur noch ergänzt werden. Als Erstes wollen wir die Daten abfragen. Tragt unterhalb des Zugangs zur Datenbank (wo ist das wohl?) Folgendes ein.


if (!$_POST)
{
  $query 'SELECT 
              * 
            FROM 
              hersteller 
            WHERE 
              id = '.$_GET['id'];
  $result mysql_query ($query) or die (mysql_error());
  $hersteller mysql_fetch_row($result);
}

Erläuterung

Die Bedingung wird nur dann ausgeführt, wenn keine Formulardaten übermittelt werden. In der Variable $hersteller stehen dann alle Informationen in einem numerischen Array. Mit print_r($hersteller) könnt ihr den Inhalt überprüfen. Ach ja, mysql_fetch_row gibt die Werte im Gegensatz zu mysql_fetch_assoc in einem numerischen und nicht in einem assoziativen Array zurück. Darum der kommende Zahlensalat, denn die Treffer werden von 0 bis X durchnummeriert.

4. Die Ausgabe

Und wie bekommen wir nun die Daten in die Formularfelder? Ganz einfach, über das Attribut value. Ergänzt die <input>-Tags nun um die entsprechenden Werte also zum Beispiel so.


<input type="text" name="zulieferer" class="feld"
  value="<?php echo $hersteller[1]; ?>" />

Bei den folgenden Feldern könnt ihr den numerischen Index einfach hochzählen, also 2 bei telefon, 3 bei telefax und so weiter. Bis hierhin klappt das ja noch ganz gut, aber stellt euch mal ein Formular mit 20 Einträgen vor. Also arbeitet in Zukunft mit assoziativen Arrays, wie bei "Daten abfragen".

Für unser nächstes Schmankerl müssen wir diesmal die ID mit durchschleifen. Das machen wir über ein verstecktes <input>-Feld. Tragt also oberhalb des Submit-Buttons mal Folgendes ein.


<input type="hidden" name="id" value="<?php echo $_GET['id']; ?>" />

Ein Hinweis

Die ID könnte man anders übermitteln, da wir sie in der Abfrage ja auch geholt haben. Der Wert steht also in $hersteller[0]. Und warum nehmen wir die nicht? Genau, warum eigentlich nicht? Macht es ruhig mal und wundert euch. Oder ihr denkt genau nach. Dann findet die Lösung ganz schnell (Stichwort if (!$_POST)).

5. Die Änderungen

Ändert jetzt ein paar Einträge in den Feldern und sendet die Daten ab. Dabei werden die Korrekturen folgendermaßen eingegeben.


if ($_POST)
{
  $query 'UPDATE 
              hersteller 
            SET
              zulieferer = \''.$_POST['zulieferer'].'\',
              telefon = \''.$_POST['telefon'].'\',
              fax = \''.$_POST['telefax'].'\',
              strasse = \''.$_POST['strasse'].'\',
              plz = \''.$_POST['plz'].'\',
              ort = \''.$_POST['ort'].'\'
            WHERE 
              id = '.$_POST['id'];
  $update mysql_query ($query) or die (mysql_error());
}

Erläuterung

Was macht er denn jetzt? Eben diese Anführungszeichen-Hochkommata-Orgie und jetzt das. Nun. liebe Leute, auch das ist eine Möglichkeit. Man packt alles in Hochkommata und wenn selbige in der Zeichenkette auftauchen, so werden sie mit dem Backslash (\) maskiert. Oder neudeutsch "escaped". Und wer jetzt wieder mit den Anführungszeichen ankommt, bitte lesen!

Ein Hinweis

Eigentlich sollte man die bereits existierende Bedingung if (!$_POST) mit obiger durch ein else if verbinden. Ich lasse es aber mal. Wer will, kann das selber machen.

Bitte, bitte...

... noch nicht testen! Das Schönste kommt noch. Wir wollen nun den geänderten Datensatz in unserer Liste optisch hervorheben. Dazu benutzen wir dasselbe Prinzip, wie beim Eingeben von Daten, also die JavaScript-Geschichte.


echo '<body';
if ($update)
{
  echo ' onload="window.opener.location.href='."'".'../index.php'.
         '?tabelle='.$_GET['tabelle'].'&id='.$_POST['id'].
         "'".'; window.close();"';
}
echo '>';

6. Cooool

Um nun den geänderten Datensatz optisch hervorzuheben, benötigen wir zwei Änderungen. Die Funktion showList muss um einen Parameter erweitert und der Aufruf in der index.php entsprechend angepasst werden.


// functions.inc.php
function showList ($list$id)

// index.php
$code .= showList ($list$_GET['id']);



Für die farbliche Hervorhebung des geänderten Datensatzes wird showList folgendermaßen geändert.


// functions.inc.php
$ausgabe .= '<p>
              <a href="#"
                onclick="fenster('."'".$_GET['tabelle']."',
                '".$_GET['tabelle'].'&id='.$list[$i]['id']."'".');">
                Ändern
              </a>';
if ($id == $list[$i]['id']) 
{
  $ausgabe .= '<span class="show">';
}
$ausgabe .= $list[$i]['list'];
if ($id == $list[$i]['id']) 
{
  $ausgabe .= '</span>';
}
$ausgabe .= '</p>';

Erläuterung

Mit if ($id == $list[$i]['id']) überprüfen wir, ob die per GET übermittelte ID des geänderten Datensatzes mit einer aus der Liste übereinstimmt. Wenn ja, so wird ein entsprechendes <span>-Element an der Stelle eingefügt ($ausgabe .= '<span class="show">';). Und da wir auch ein schließendes Element benötigen, wiederholt sich das Ganze mit if ($id == $list[$i]['id']).

Noch ein Hinweis

Man hätte sich die Sache mit dem zweiten Parameter bei Funktion showList auch sparen und das über das (super)globale Array $_GET lösen können. Das aber nur am Rande.

7. Die Sache mit den zwei Parametern

So, jetzt werde ich euch dieses Geheimnis lüften. Das hat zwar nichts mit PHP zu tun, aber egal. Wenn man per window.open ein Fenster mit JavaScript öffnet, so erfolgt die Steuerung über den Namen. Dabei handelt es sich um den zweiten Paramter.

files/menue.js


window.open('data/' datei '.php?tabelle=' paramdatei'...');

Wenn man da jetzt immer denselben Namen vergibt, so kann man auch immer nur ein(!) Fenster öffnen. In unserem Fall wäre es also nicht möglich, gleichzeitig zwei Popups zu öffnen. Ist hier zwar unerheblich, kann aber sonst störend wirken.

Alles Tinnef

... werden einige denken. Und in diesem Fall stimmt das auch. Es hätte ein Parameter für die JavaScript-Funktion ausgereicht. Aber! Gerade bei JavaScript muss man höllisch aufpassen. So macht zum Beispiel der Internet Explorer (alle Versionen!) schlapp, wenn im Namen für ein Fenster auch nur ein Leerzeichen ist. Und je nachdem, was man übergibt, kann das Probleme machen. Darum habe ich mich auch für diese auf den ersten Blick seltsame Vorgehensweise entschieden.

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