Dateien bearbeiten mit php

Werbung
Informatik
MySQL-Datenbanken mit php bearbeiten
1 von 4
Daten in MySQL-Datenbanken schreiben mit php
Zuerst muss der Kontakt zum Datenbanksystem hergestellt werden, dann eine Datenbank
gewählt, und schließlich ein Abfrage-, Einfüge- oder Veränderungs-Operation durchgeführt
werden.
1. Verbindung herstellen und Datenbank wählen:
$link= mysql_connect(<hostname>, <dbuser>, <dbpasswort>);
mysql_select_db(<dbname>, $link);
Diese beiden ersten Befehle sind bei jeder Datenbankabfrage oder –Manipulation absolut
identisch. Andererseits hängen sie vom Server ab. Falls man nun einmal die Datenbankanwendung auf einem anderen Server laufen lassen möchte (Tests oder Serverumzug) so
müsste man diese Zeilen bei jeder DB-Operation ändern. Deswegen bietet es sich an, diese
Zeilen in eine extra Include-Datei zu schreiben und vor den Datenbankzugriffen diese
immer zu includen:
mysqlconnect.inc.php
Kommentare:
keinen Einfluss auf die
Funktion, nur zum Lesen
und Verstehen
Eigentliche php-Datei
<?php
...
// host="localhost"; user="hugo"; password="xxx"
include("mysqlconnect.inc.php");
//dbname= "pg";
…
$link= mysql_connect("localhost", "hugo", "xxx")
or die('Keine Verbindung zur Datenbank!');
Das bewirkt genau das
mysql_select_db("pg", $link) or die ('Datenbank nicht
gleiche wie wenn man
den ganzen Code der
gefunden!');
mysqlconnect.inc hier
Falls was schief geht, wird
?>
der nachfolgende String
ausgegeben
2.
reinkopieren würde
SQL-Befehl ausführen mit mysql_query:
Mit dem "mysql_query"-Befehl werden die SQL-Befehle ausgeführt. Beim SelectBefehl wird das Abfrageergebnis in einer Variablen gespeichert. (im Beispiel
$result)
Die Datenbankanbindungsvariable $link, kann auch weggelassen werden,
Beispiele:
wenn nur mit einer MySQL-Datenbank gearbeitet wird (Normalfall!)
$sql = "SELECT * from testtabelle";
$result = mysql_query($sql, $link);
$sql = "DELETE FROM testtabelle WHERE ID=3";
mysql_query($sql, $link);
$sql = "INSERT into testtabelle (ID, name, vorname) VALUES (NULL, 'Wurst', 'Hans')";
mysql_query($sql);
$sql = "UPDATE testtabelle set name='Mustermann', vorname='Max' WHERE ID=3";
mysql_query($sql);
3.
evtl. die von SQL gelieferten Daten ausgeben
$zeile = mysql_fetch_array($result); // liefert ein assoziatives Array von einem Datensatz;
beginnt mit der ersten Zeile und rutscht bei jedem weiterem Aufruf eine Zeile weiter.
mysql_num_rows($result) gibt die Anzahl der Datensätze aus der SQL-Abfrage an
echo $zeile['name’]; // gibt den Eintrag des Feldes „name“ des aktuellen Datensatzes aus
Informatik
MySQL-Datenbanken mit php bearbeiten
2 von 4
Geniale Schleife zum Auslesen von Datenbanktabellen:
$sql="Select * from testtabelle";
$result=mysql_query($sql);
while($zeile = mysql_fetch_array($result)) {
//hier kann das assoziative Array $zeile verarbeitet werden
// z.B. echo $zeile['name']."<br />";
};
Die Schleife wird sooft durchlaufen, wie noch ein weiterer Datensatz in der AbfrageVariable $result gefunden wird. So erhält man also alle Datensätze der SELECT-Abfrage.
Sinnvolle Konvention zum Eintragen, Löschen und Bearbeiten von Daten
Um (unbeabsichtigte) Wiederholungen von Änderungen am Datenbestand durch
mehrfaches Aktualisieren oder Rückwärtsgehen im Browser zu vermeiden, sollte in phpDateien mit Datenbankmanipulationen möglichst keine HTML-Ausgabe erfolgen.
Stattdessen sollte nach erfolgten Datenbankänderungen auf eine Seite mit HTML-Ausgabe
weitergeleitet werden. Z.B. mit
header("Location: beispiel_ausgabe.html"); //weiterleitung auf beispiel_ausgabe.html
Evtl. Fehlermeldungen übergibt man am besten mit einer S_SESSION-Variable an die
nächste HTML-Seite.
Datensätze verändern
Wenn man Datensätze verändern will, sollten die bereits vorhandenen DB-Werte in den
Input-Elementen drinstehen. So sieht man die alten Werte und die neuen geänderten
Werte können in die Datenbank übernommen werden.
Dazu kann man das gleiche Formular benutzen wie bei erstmaligen Einfügen von
Datensätzen.
In einem zusätzlich versteckten input kann man die Datensatz-Nummer (des
Primärschlüssels) übergeben und so dem auswertenden Formular übermitteln, ob ein neuer
Datensatz eingefügt, oder ein alter geändert werden soll.
Beispiel in der Formulardatei:
<?php
$sql="select * from kumpels where ID=".$_GET['userID'];
$result=mysql_query($sql);
$kump=mysql_fetch_array($result);
?>
<form name="form1" method="post" action="kumpel_edit_db.php">
<input type="text" name="vorname_f" value="<?php echo $kump['vorname']; ?>" />
<input type="text" name="name_f" value="<?php echo $kump['name']; ?>" />
…
<input type="hidden" name="id" value="<?php echo $kump['ID']; ?>" />
<input type="submit" value="speichern" />
Beim erstmaligen Eintragen steht
</form>
Beispiel in der Auswertungsdatei (kumpel_edit_db.php):
hier kein Wert.
Deswegen wird beim Auswerten in
den "else"-Zweig gesprungen
if($_POST['id']>0){
//Ändern von Daten
$sql="update kumpels set vorname='".$_POST['vorname_f']."',
name='".$_POST['name_f']."' where ID=".$_POST['id'];
} else { //Eintragen von neuen Daten
$sql="Insert into kumpels (ID, vorname, name) VALUES
(NULL, '".$_POST['vorname_f']."', '".$_POST['name_f'].")";
}
Bei neuen Datensätzen muss im Primärschlüssel mit autoincrement NULL
mysql_query($sql);
eingetragen werden, damit die nächste Nummer automatisch eingetragen wird
…
header("Location: kumpels_uebersicht.php");
Informatik
MySQL-Datenbanken mit php bearbeiten
3 von 4
Aufgaben:
1. Überprüfe, ob alle Aufgaben vom Blatt „MySQL-Datenbanken“ erledigt wurde. Es muss eine
Datenbank mit den 4 Tabellen (kumpels, wohnorte, vereine, verein_member) mit den
entsprechenden Schlüsselfeldern vorhanden sein
2. Schreibe eine Datei wohnort_ausgabe.php, in der alle Einträge eines Datensatzes deiner
SQL-Tabelle wohnorte in einer Zeile und die verschiedenen Datensätze untereinander
ausgegeben werden.
3. Schöner wird’s mit einer Tabelle. In deren ersten Zeile stehen als Überschriften die
Feldernamen der Datenbanktabelle. In den weiteren Zeilen sollen die zugehörigen Einträge
des aktuellen Datensatzes stehen. (Beginne jeweils nur mit einem Datensatz und teste
bevor du eine Schleife durch alle Datensätze einbaust!)
4. Erstelle nun ein HTML-Formular namens wohnorte_insert.html zum Eintragen neuer
Wohnorte. Für jedes Feld der Tabelle wohnorte (außer dem Primärschlüssel ID) soll also ein
Eingabefeld erstellt werden.
5. Dieses Formular soll in einer wohnorte_add_db.php ausgewertet werden. Dabei sollen auch
gleich die übergebenen Daten als neuer Datensatz in die Tabelle wohnorte eingetragen
werden. Vermeide dabei irgendwelche HTML-Ausgaben und leite mit dem header-Befehl auf
die oben beschriebene wohnort_ausgabe.php weiter. So kann gleich überprüft werden, ob
das Eintragen funktioniert hat.
6. Nun sollen Daten, die bereits in der
Erinnerung: $_GET-Parameter
Datenbanktabelle sind noch nachträglich
Man kann auch ohne Formular nur mit einem Link
bearbeitet
werden.
Ändere
dazu
den
Daten an ein anderes php-Skript übermitteln.
Dateinamen deiner Eingabeformulardatei von
Beispiel-URL: test.php?id=3&user=horst&typ=fm
In der Datei test.php können nun mit $_GET['id'],
wohnorte_insert.html" in wohnorte_edit.php
$_GET['user'] und $_GET['typ'] die übergebenen
und rufe sie mit einem $_GET-Parameter, z.B.
Werte (3, 'horst', 'fm') ausgelesen werden.
als wohnorte_edit.php?ortID=2 im Browser auf
(Bei der aufrufenden URL muss dabei nach dem
(vorausgesetzt es gibt in der Tabelle einen
Dateinamen erst das '?' stehen. Vor jedem weiteren
Datensatz mit der ID=2, sonst eben eine
Parameter muss ein '&' gesetzt werden)
andere ortID wählen). Füge vor dem HTMLFormular einen php-Block ein, in dem mit dem SELECT-Befehl der Datensatz mit
$_GET['ortID'] als ID geholt wird. Jetzt muss nur noch jeweils im value-Attribut der Inputs
ein php-Block rein, in dem der entsprechenden Wert aus der Datenbanktabelle
reingeschrieben wird. Damit im Auswertungsscript auch die Primärschlüssel-Nummer
vorliegt, muss zum Schluss noch ein verstecktes Input mit diesem Wert ins Formular
eingefügt werden.
7. Ändere nun auch beim Auswertungsscript (das es ja bereits vom Neueintragen gibt) den
Namen so, dass er klarmacht, dass hier Daten in die entsprechende Tabelle eingetragen
oder geändert werden. (dieser Name muss natürlich auch im action-Attribut des Formulars
in der Eingabeformulardatei geändert werden). Über den Wert des versteckten Inputs mit
der Primärschlüssel-Nummer kann hier verzweigt werden, ob Daten neu eingetragen oder
alte geändert werden sollen.
8. Wenn das Ändern (und Neueintragen) von Daten in der wohnorte-Tabelle funktioniert, soll
nun das Aufrufen des Änderungsformular mit Hilfe von Links in der wohnort_ausgabe.php
vereinfacht werden. Erweitere dazu die Tabelle in wohnort_ausgabe.php um eine weitere
Spalte, in der das Wort "bearbeiten" stehen soll. Dahinter steckt dann ein Link, der zum
Änderungsformular mit der Primärschlüssel-Nummer des jeweiligen Datensatzes im $_GETParamter führt (z.B. wohnorte_edit.php?ortID=7).
9. Erstelle nun noch ein php-Datei, in der ein Datensatz der wohnorte-tabelle gelöscht werden
kann. Auch hier soll der betreffende Datensatz mit der Primärschlüssel-Nummer identifiziert
werden, die wieder über einen $_GET-Parameter an das php-Skript übergeben wird.
Verlinke diese 'Lösch-URL' in der Tabelle in wohnort_ausgabe.php und/oder in der Datei
zum Bearbeiten eines Datensatzes der wohnorte-Tabelle.
10. Teste nun alle Funktionen deiner Skripte noch einmal ausführlich: Anlegen eines neuen
Wohnorts, Darstellen der ganzen Datenbanktabelle, Ändern und Löschen eines Datensatzes.
11.
Sicherheit:
Um Cross-Site-Scripting oder SQL-Injektions (wen's genauer interessiert -> einfach googeln) zu vermeiden,
fängt man am besten gleich am Beginn der Auswertungsskripte die Benutzereingaben mit den Funktionen
intval() (bei Integer) bzw. mysql_real_escape_string() und htmlentities() (bei Texten) ab.
Beispiele:
$v_id=intval($_GET['v_id']); $w_id= intval($_POST['v_id']);
$name= mysql_real_escape_string(htmlentities($_POST['name']));
Informatik
MySQL-Datenbanken mit php bearbeiten
4 von 4
Führe nun alle Punkte (2. –10.) mit der kumpels-Tabelle durch.
a) In der Datei mit der Überblickstabelle (nennen wir sie mal kumpels_overview.php) sollen
dabei aber natürlich statt der ID für den Wohnort, die Daten für den entsprechenden
Wohnort aus der wohnort-Tabelle geschrieben werden. Außerdem sollen am Ende jeder
Zeile je ein Link zum Bearbeiten der wohnort-Tabelle und einen zum Bearbeiten der
kumpels-Tabelle (nennen wir die Datei kumpel_edit.php) stehen.
b) In dem Formular zum Neuanlegen und Bearbeiten der Personen der Kumpelstabelle soll
der Wohnort mit Hilfe eines Select-Elements gewählt werden können. Dabei sollen die
options (<option value='...'>...</option>) aus der Wohnort-Tabelle augelesen werden.
Zwischen öffnendem und schließendem Tag muss dabei der Name des jeweiligen
Wohnorts stehen, beim Value die ID (Primärschlüssel) des aktuellen wohnortDatensatzes. So sieht der Benutzer die verschiedenen Ortsnamen in der Auswahlbox
(select), gleichzeitig erscheint im Auswertungsskript (nennen wir' s kumpel_save.php)
beim zugehörigen $_POST-Wert aber die ID, die im value-Attribut der gewählten option
stand. ($_POST übernimmt immer den Wert des values soweit vorhanden, sonst eben
den Wert zwischen öffnendem und schließendem Tag).
c) Ein weiteres Problem tritt beim Bearbeiten eines bereits vorhandenen kumpelsDatensatz auf: Da soll ja der momentan eingetragene Wohnort in der Auswahlbox
erscheinen. Das erreicht man, in dem in der entsprechenden Option zusätzlich
"selected='selected'" als Attribut eingetragen ist. Man muss also in der Schleife, in der
die Options aus der wohnort-Tabelle geschrieben werden, jedesmal überprüfen, ob der
die aktuelle ID mit der wohnortID des zu bearbeitenden kumpels-Datensatz
übereinstimmt. In diesem Fall muss dann ins öffnende option-Tag obiges selectedAttribut geschrieben werden.
12. Führe nun die Punkte 2. – 10. mit der vereine-Tabelle durch. Da hier keine fremden
Primärschlüssel sind, ist dies relativ einfach, eben so wie bei der wohnorte-Tabelle.
13. Jetzt die Königs-Aufgabe: Die Umsetzung der m:n-Beziehung der verein_member-Tabelle.
a) die Übersichtstabelle in der Datei kumpels_overview.php soll noch mal um eine Spalte
namens Vereine erweitert werden. Dort sollen die Namen aller Vereine, in denen die
Person der aktuellen Zeile Mitglied ist, hintereinander durch Kommas getrennt (notfalls
mehrzeilig) aufgeführt werden. Jeder Name soll dabei mit einen Link zu einer
Vereinsseite (verein_view.php?vereinID=...) hinterlegt werden.
b) Erstelle solche ein Vereinsseite, auf der nur jeweils ein Verein mit seinen einzelnen
Feldern (Gegründet, Mitgliederzahl,...) dargestellt wird und eine Mitgliederliste (natürlich
auf die kumpels-tabelle beschränkt) ausgegeben wird, die man aus der verein_memberTabelle gewinnt. Auf dieser Seite sollen auch Links zur Übersicht über alle Vereine sowie
zum Bearbeiten, Löschen und Neuanlegen von vereine-Datensätze sinnvoll plaziert
werden (siehe Aufgabe 12).
c) Jetzt soll die verein_member-Tabelle auch noch bearbeitet werden. Bei nicht allzu
großen Entitäten, wie in diesem Fall die Vereine, empfiehlt es sich m:n-Beziehungen mit
Checkboxen zu implementieren. Es soll also auf das Formular zum kumpels-Datensätze
bearbeiten (in kumpel_edit.php) noch ein Bereich, auf dem für jeden Verein aus der
vereine-Tabelle eine checkbox mit entsprechender Beschriftung kommt. Dabei sollte im
name-Attribut der checkbox die ID des Vereins enthalten sein. Beim Neuanlegen von
kumpels kann man nun einfach die Vereine ankreuzen, in denen die zu bearbeitende
Person eben drin ist. Schwieriger wird's beim Bearbeiten bereits existierender Datensätze. Hier muss nun bei jeder Checkbox aus der verein_member-Tabelle ausgelesen
werden, ob die Person Mitglied dieses Vereins ist und dann mit dem Attribut
"checked='checked'" die Checkbox angehakt werden. (dafür gibt es abfrageintensive,
aber auch ökonomischere Möglichkeiten)
d) In der Auswertungsdatei der kumpels-Bearbeitung (kumpel_save.php) löscht man am
besten erst mal alle alten Datensätze der verein_member-Tabelle mit der zu
bearbeitenden kumpels-ID. So wird gewährleistet, dass Häkchen, die beim Bearbeiten
entfernt wurden, auch in der Datenbank gelöscht werden. Im $_POST-Array werden nur
die angehakten Checkboxen übermittelt. Mit einer Schleife durch alle Vereine (ähnlich
wie in der kumpel_edit.php) kann so mithilfe der ID im Namen der Checkboxen
überprüft werden ob die entsprechende Checkbox angehakt war. In diesem Fall muss
dann eben wieder ein neuer Datensatz mit der ID des zu bearbeitenden kumpels und der
ID des Vereins in die verein_member-Tabelle eingefügt werden.
Herunterladen