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.