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=' + param, datei, '...');
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