beim php Script ist HTML-code mit dabei muss der rein`?
Micha
Vorwort
Da immer wieder Fragen auftauchen wie man Formulardaten in eine Datenbank schreiben und später wieder auslesen kann habe ich mich dazu entschlossen dieses kleine Anfängertutorial zu schreiben. Damit ein Benutzer mit einer Seite interagieren kann ist es nötig das eine Eingabemöglichkeit geschaffen wird: ein Formular. So ziemlich jede Webseite hat heutzutage mindestens ein Formular; sei es ein Gästebuch, Newsletter, Kontaktformular oder etwas anderes. Das beste Formular nutzt aber nichts, wenn man die eingegebenen Daten nicht verarbeiten kann und genau hier hilft uns eine Scriptsprache wie z.B. PHP. Wenn die Daten dauerhaft gespeichert werden müssen bietet sich eine Datenbank wie etwa MySQL an.
In diesem Tutorial schauen wir uns zunächst einmal an mit welchen Formular-Elemente wir es zu tun bekommen können. Wie wir die Eingaben auswerten, verarbeiten, speichern und schließlich wieder ausgeben können. Das hier gezeigt soll nur als Grundlage dienen und ist keinesfalls als komplett anzusehen, von daher ist es auch nicht 1:1 in der Praxis anwendbar, weil ich aus Platzgründen sehr wichtige Dinge wie Validierung der Eingaben weggelassen habe!
Auf Submit geklickt und jetzt?
Schauen wir uns mal ein Formular an das die wichtigsten Elemente beinhaltet.
Wer hier schon Probleme hat zu verstehen was er vor sich sieht, der sollte an dieser Stelle abbrechen und erst einmal HTML Grundlagen pauken!HTML-Code:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Formular-Elemente</title> </head> <body> <hr /> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="formular" id="formular"> Textfeld: <input type="text" name="textfeld" id="textfeld" value="Das ist ein Textfeld" /><br /> Textarea: <textarea name="textarea" id="textarea" cols="30" rows="2">Das ist ein Textbereich</textarea><br /> Checkbox: <input type="checkbox" name="checkbox" id="checkbox" value="Das ist eine Checkbox" /><br /> Radiobutton: <input type="radio" name="radio" id="radiobutton" value="Das ist ein Radiobutton" /><br /> Radiobutton-Gruppe: <input type="radio" name="radiobuttongruppe" id="radiobuttongruppe_1" value="ja" /> Ja <input type="radio" name="radiobuttongruppe" id="radiobuttongruppe_2" value="nein" />Nein<br /> Selectbox: <select name="selectbox" id="selectbox"><option>Das ist der Wert einer Selectbox</option></select><br /> SubmitButton: <input type="submit" name="submitbutton" id="submitbutton" value="Senden" /> </form> </body> </html>
Die für uns wichtigen Informationen stecken im name-Attribut. Hierfür sollten unbedingt aussagekräftige Ausdrücke benutzt werden, ohne Leerzeichen, Umlaute oder anführende Zahlen.
Dieses name-Attribut stellt nämlich nach abschicken des Formulars ein Array-Schlüssel dar mit dem wir in PHP weiterarbeiten werden.
Nachdem man "Submit" gedrückt hat, kommt bei PHP ein Superglobales Array an das sich $_POST nennt - natürlich nur, wenn die method-Eigenschaft im Form-Tag auch "post" war. In diesem $_POST Array befinden sich nun verschiedene Schlüssel und zwar für jedes Form-Element einer, das den Namen des name-Attributs trägt. So wird aus dem Form-Elementnach abschicken des Formulars für PHP einCode:<input type="text" name="textfeld" id="textfeld" />Hier wird auch deutlich wieso ein name-Attribut wie etwa "2. Vorname" fatal wäre, denn daraus würde in PHP ein $_POST['2. Vorname'] werden, wodurch Fehler vorprogrammiert sind!Code:$_POST['textfeld']
Am besten läßt man sich einmal anzeigen was nach abschicken eines Formulars bei PHP ankommt, dazu benutzen wir dieses Script (abspeichern als z.B. formelemente.php)
Wer dieses Formular so wie es ist abschickt wird etwas seltsames bemerken. Obwohl es sich hier um 7 Formular-Elemente handelt kommen bei PHP nur 4 (inklusive Submitbutton) an. Hoppla, ist das Formular fehlerhaft? Keineswegs! Manche Elemente haben die Eigenart nicht übermittelt zu werden, wenn sie nicht ausgefüllt wurden. Das mag sich im ersten Moment schlecht anhören, kann man aber super für sich benutzen. Wie das geht zeige ich weiter unten, wenn wir uns daran machen in die DB zu schreiben.HTML-Code:<?php if (isset( $_POST['submitbutton'] )) { echo "<pre>" .print_r( $_POST, true ). "</pre>"; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Formular-Elemente</title> </head> <body> <hr /> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="formular" id="formular"> Textfeld: <input type="text" name="textfeld" id="textfeld" value="Das ist ein Textfeld" /><br /> Textarea: <textarea name="textarea" id="textarea" cols="30" rows="2">Das ist ein Textbereich</textarea><br /> Checkbox: <input type="checkbox" name="checkbox" id="checkbox" value="Das ist eine Checkbox" /><br /> Radiobutton: <input type="radio" name="radio" id="radiobutton" value="Das ist ein Radiobutton" /><br /> Radiobutton-Gruppe: <input type="radio" name="radiobuttongruppe" id="radiobuttongruppe_1" value="ja" /> Ja <input type="radio" name="radiobuttongruppe" id="radiobuttongruppe_2" value="nein" />Nein<br /> Selectbox: <select name="selectbox" id="selectbox"><option>Das ist der Wert einer Selectbox</option></select><br /> SubmitButton: <input type="submit" name="submitbutton" id="submitbutton" value="Senden" /> </form> </body> </html>
Inhalte werden durch das value-Attribut vorgegeben, bzw bekommt man durch die Benutzereingaben. Elemente wie Checkbox oder Radiobutton übermitteln ein "on" wenn sie angeklickt wurden und kein value-Attribut gesetzt wurde. Das ist wichtig zu wissen damit wir auswerten können welches Element in welchem Zustand übermittelt wurde.
Ein weiteres sehr wichtiges Formular-Element ist das hidden-Field (verstecktes Feld). Es verhält sich exakt wie ein Textfeld, ausser das es einen Wert vorgegeben bekommt und nicht sichtbar auf der Seite ist. Das braucht man z.B. um ID's oder andere Werte unsichtbar zu übergeben.
Einfach ein wenig mit dem Script von oben testen, mehrfach absenden und dabei die Werte des Formulars ändern, dabei darauf achten was PHP ausgibt.
So, wenn die Zusammenhänge zwischen name-Attribut und PHP so weit verstanden wurde geht's weiter mit...
Formulareingaben in eine MySQL DB schreiben
Um Daten in eine Datenbank zu schreiben brauchen wir natürlich erst einmal was..? Genau, eine Datenbank! Wie man sowas anlegt sollte jeder wissen der mit PHP etwas zu tun hat. In dieser DB brauchen wir eine Tabelle in die wir unsere Daten schreiben. Dazu einfach diesen Code
in phpMyAdmin (in der DB) ausführen.Code:CREATE TABLE `traumprojekt` ( `id` INT( 7 ) NOT NULL AUTO_INCREMENT , `vorname` VARCHAR( 50 ) NOT NULL , `geschlecht` VARCHAR( 20 ) NOT NULL , `alter` TINYINT( 3 ) UNSIGNED NOT NULL , `fuehrerschein` tinyint(1) NOT NULL , PRIMARY KEY (`id`) ) ENGINE = MYISAM
Wie man sieht ist das nur eine sehr kleine Tabelle, weil die ja auch nur zu Testzwecken gebraucht wird. Passend zur DB brauchen wir natürlich auch ein normales HTML-Formular, das wie folgt aussieht:
Diese Datei speichern wir als mysql_schreiben.php ab. Bisher ist alles schön überschaubar und hoffentlich auch verständlich. Bevor wir zum PHP-Teil kommen sollte jeder mal 1 Minute auf den Formular-Quelltext schauen und versuchen festzustellen welche Variablen wir beim abschicken in PHP erwarten dürfen.HTML-Code:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Formularinhalt in eine Datenbank schreiben</title> </head> <body> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="formular" id="formular"> Vorname: <input type="text" name="vorname" id="vorname" /><br /> Geschlecht: <input type="radio" name="geschlecht" id="geschlecht_1" value="männlich" checked="checked" />Männchen <input type="radio" name="geschlecht" id="geschlecht_2" value="weiblich" />Weibchen<br /> Alter: <select name="alter" id="alter"><?php for ($i=1; $i<121; $i++) { echo "<option>{$i}</option>"; } ?></select><br /> Führerschein: <input type="checkbox" name="fuehrerschein" id="fuehrerschein" /><br /> <input type="submit" name="eintragen" id="eintragen" value="Abschicken" /> </body> </html>
Hier nun der PHP-Teil
Um überhaupt zu wissen ob PHP aktiv werden muß fragen wir erst mal ab ob ein Formular abgeschickt wurde. Das geschieht mit der ZeilePHP-Code:<?php
$db_host = "localhost";
$db_user = "root";
$db_pass = "";
$db_name = "traumprojekt";
if (isset( $_POST['eintragen'] ))
{
// Maskierende Slashes aus POST entfernen
$_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;
// Inhalte der Felder aus POST holen
$vorname = $_POST['vorname'];
$geschlecht = $_POST['geschlecht'];
$alter = (int) $_POST['alter'];
$fuehrerschein = isset( $_POST['fuehrerschein'] ) ? 1 : 0;
/* ************************************************************************************************ */
/* *** Hier sollten und MUESSEN die Benutzereingaben geprueft werden um Schadcode abzufangen!!! *** */
/* ************************************************************************************************ */
// Sind alle Eingaben durch die Validierung gekommen werden sie in die DB geschrieben
// Verbindung oeffnen und Datenbank ausweahlen
$conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
if ($conID)
{
mysql_select_db( $db_name, $conID );
}
// Anfrage zusammenstellen der an die DB geschickt werden soll
$sql = "INSERT INTO `traumprojekt`
(`vorname`, `geschlecht`, `alter`, `fuehrerschein`)
VALUES(
'" .mysql_real_escape_string( $vorname ). "',
'" .mysql_real_escape_string( $geschlecht ). "',
" .$alter. ",
" .$fuehrerschein. "
)";
// Schickt die Anfrage an die DB und schreibt die Daten in die Tabelle
mysql_query( $sql );
// Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
if (mysql_affected_rows() == 1)
{
echo "<h3>Der Datensatz wurde hinzugefügt!</h3>";
// Hier kann weiterer Code stehen der ausgefuehrt werden soll
// wenn ein Eintrag erfolgreich war. z.B. Email an den Admin schicken
// der ueber den neuen Eintrag informiert
}
else
{
echo "<h3>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</h3>";
// Hier koennen Massnahmen ergriffen werden die ueber den Misserfolg informieren
// wie z.B. den Benutzer darueber zu informieren, dem Admin eine Mail schicken
// damit er sich um den Fehler kuemmern kann, etc pp
}
}
?>Hier wird mithilfe von isset() nur geschaut, ob überhaupt eine Variable gesetzt wurde. Das ist dann der Fall wenn der Abschicken-Knopf gedrückt wurde. Als nächstes werden maskierende Slashes aus dem $_POST Array entfernt. Je nach Konfiguration des Servers kann es sein das gefährliche Zeichen wie etwa ' oder " durch ein Backslash maskiert werden um sie unschädlich zu machen. So wird aus ' dann \' und aus " wird \"PHP-Code:if (isset( $_POST['eintragen'] ))
Danach laden wir die Inhalte aus dem $_POST Array um in normale Variablen um damit weiterzuarbeiten. 2 Besonderheiten fallen hier schon auf, zum einen...Das (int) stellt sicher das für das Alter nur ein numerischer Wert in die DB gelangt und zum anderen...PHP-Code:$alter = (int) $_POST['alter'];
Hier findet das statt was ich oben angedeutet habe. Um zu wissen ob jemand einen Führerschein hat haben wir eine Checkbox gewählt. Ist ein Häkchen drin (für Ja) ist ein Wert gesetzt, nämlich "on", legen wir in unserer Variable eine 1 ab. Existiert die Variable $_POST['fuehrerschein'] aber gar nicht wissen wir, daß sie im Formular gar nicht angeklickt wurde. In dem Fall bekommt unsere Variable die 0 zugewiesen.PHP-Code:$fuehrerschein = isset( $_POST['fuehrerschein'] ) ? 1 : 0;
Normalerweise würde hier jetzt eine gründliche, mit Betonung auf gründlich!, Überprüfung der Benutzereingaben stattfinden um Injections und Schadcode abzufangen. Aus Platzgründen spare ich mir das hier aber. Wer wissen möchte wie man Eingaben prüft soll einfach mal einige Tutorial zu anderen Themen durchgehen, weil es dort oft demonstriert wird.
Weiter geht es mit dem Verbindungsaufbau zur DB und dem zusammenstellen der Anfrage bei der in die DB geschrieben wird.
Wie wir hier sehen, werden die Text Eingaben nicht einfach so in die DB geschrieben, sondern sie werden escaped. Das ist ultrawichtig um etwaige Angriffe auf die DB abzufangen!! (Stichwort: SQL-Injection)PHP-Code:// Anfrage zusammenstellen der an die DB geschickt werden soll
$sql = "INSERT INTO `traumprojekt`
(`vorname`, `geschlecht`, `alter`, `fuehrerschein`)
VALUES(
'" .mysql_real_escape_string( $vorname ). "',
'" .mysql_real_escape_string( $geschlecht ). "',
" .$alter. ",
" .$fuehrerschein. "
)";
Die Werte für $alter und $fuehrerschein sind numerisch und können keinen Schaden anrichten, von daher brauchen sie auch nicht escaped zu werden.
Ich kann nicht genug betonen wie wichtig es ist Eingaben mit mysql_real_escape_string() unschädlich zu machen. Im Anschluß an das Tutorial verlinke ich auf alle verwendeten PHP Funktionen. Jeder sollte sich die Zeit nehmen diese ausführlich zu lesen und zu verstehen.
Ist die Anfrage vorbereitet wird sie mit mysql_query() an die DB gesendet. Ob das Eintragen wirklich funktioniert hat stellen wir fest mit...
Die Funktion mysql_affected_rows() liefert eine Zahl zurück wieviele Datensätze von der letzten Aktion (Insert, Delete oder Update) betroffen waren. So kann man sicherstellen das auch tatsächlich etwas in der DB steht und dementsprechend darauf reagieren.PHP-Code:if (mysql_affected_rows() == 1)
Der vollständigkeit halber noch einmal der komplette Code der mysql_schreiben.php
PHP-Code:<?php
$db_host = "localhost";
$db_user = "root";
$db_pass = "";
$db_name = "traumprojekt";
if (isset( $_POST['eintragen'] ))
{
// Maskierende Slashes aus POST entfernen
$_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;
// Inhalte der Felder aus POST holen
$vorname = $_POST['vorname'];
$geschlecht = $_POST['geschlecht'];
$alter = (int) $_POST['alter'];
$fuehrerschein = isset( $_POST['fuehrerschein'] ) ? 1 : 0;
/* ************************************************************************************************ */
/* *** Hier sollten und MUESSEN die Benutzereingaben geprueft werden um Schadcode abzufangen!!! *** */
/* ************************************************************************************************ */
// Sind alle Eingaben durch die Validierung gekommen werden sie in die DB geschrieben
// Verbindung oeffnen und Datenbank ausweahlen
$conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
if ($conID)
{
mysql_select_db( $db_name, $conID );
}
// Anfrage zusammenstellen der an die DB geschickt werden soll
$sql = "INSERT INTO `traumprojekt`
(`vorname`, `geschlecht`, `alter`, `fuehrerschein`)
VALUES(
'" .mysql_real_escape_string( $vorname ). "',
'" .mysql_real_escape_string( $geschlecht ). "',
" .$alter. ",
" .$fuehrerschein. "
)";
// Schickt die Anfrage an die DB und schreibt die Daten in die Tabelle
mysql_query( $sql );
// Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
if (mysql_affected_rows() == 1)
{
echo "<h3>Der Datensatz wurde hinzugefügt!</h3>";
// Hier kann weiterer Code stehen der ausgefuehrt werden soll
// wenn ein Eintrag erfolgreich war. z.B. Email an den Admin schicken
// der ueber den neuen Eintrag informiert
}
else
{
echo "<h3>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</h3>";
// Hier koennen Massnahmen ergriffen werden die ueber den Misserfolg informieren
// wie z.B. den Benutzer darueber zu informieren, dem Admin eine Mail schicken
// damit er sich um den Fehler kuemmern kann, etc pp
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formularinhalt in eine Datenbank schreiben</title>
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="formular" id="formular">
Vorname: <input type="text" name="vorname" id="vorname" /><br />
Geschlecht: <input type="radio" name="geschlecht" id="geschlecht_1" value="männlich" checked="checked" />Männchen <input type="radio" name="geschlecht" id="geschlecht_2" value="weiblich" />Weibchen<br />
Alter: <select name="alter" id="alter"><?php for ($i=1; $i<121; $i++) { echo "<option>{$i}</option>"; } ?></select><br />
Führerschein: <input type="checkbox" name="fuehrerschein" id="fuehrerschein" /><br />
<input type="submit" name="eintragen" id="eintragen" value="Abschicken" />
</body>
</html>
Das war's! So einfach schreibt man Daten aus einem Formular in eine Datenbank. Am besten fügt Ihr mal einige Datensätze hinzu, damit wir im nächsten Schritt auch was zum auslesen haben.
Daten aus MySQL auslesen und ausgeben
Damit das schreiben in eine DB auch Sinn macht brauchen wir natürlich auch einen Weg die Daten wieder auszugeben. Das ist ungleich einfacher als das hineinschreiben, weil die Eingaben nicht mehr geprüft und aufbereitet werden müssen. Zunächst mal der Code, dann die Erklärung...
Zuerst wieder das obligatorische verbinden zum Datenbankserver und das auswählen der DB. Dann wird die Anfrage zusammengestellt...PHP-Code:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Datensätze aus einer Datenbank auslesen und ausgeben</title>
</head>
<body>
<?php
$db_host = "localhost";
$db_user = "root";
$db_pass = "";
$db_name = "traumprojekt";
// Verbindung oeffnen und Datenbank ausweahlen
$conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
if ($conID)
{
mysql_select_db( $db_name, $conID );
}
// Anfrage zusammenstellen um die Datensaetze auszulesen
$sql = "SELECT `vorname`, `geschlecht`, `alter`, IF(`fuehrerschein`=0, 'Nein', 'Ja') as fuehrerschein FROM `traumprojekt`";
// Anfrage an die DB schicken und die Rueckmeldung in eine Variable ablegen
$abfrageergebnis = mysql_query( $sql, $conID );
// Ermitteln wie viele Datensaetzen gefunden wurden
$anzahl = mysql_num_rows( $abfrageergebnis );
echo "<p>Es wurden <strong>" .$anzahl. "</strong> Datensätze gefunden!</p>";
// Tabelle erstellen fuer die Ausgabe
echo '<table border="1">';
echo "<tr><th>Vorname</th><th>Geschlecht</th><th>Alter</th><th>Führerschein</th></tr>";
// Ab hier werden die Datensaetze zeilenweise ausgeben (auch fetchen genannt)
while ($datensatz = mysql_fetch_array( $abfrageergebnis ))
{
// Jeder Datensatz entspricht einer Tabellenzeile
echo "<tr>";
echo "<td>" .htmlspecialchars( $datensatz['vorname'] ). "</td>";
echo "<td>" .htmlspecialchars( $datensatz['geschlecht'] ). "</td>";
echo "<td>" .$datensatz['alter']. "</td>";
echo "<td>" .$datensatz['fuehrerschein']. "</td>";
echo "</tr>";
}
// Tabelle schliessen
echo "</table>";
?>
</body>
</html>Für MySQL-Neulinge wird dieses IF vielleicht etwas verwirrend sein. Das muß es aber nicht, weil es ganz einfach zu verstehen ist. Wir erinnern uns an oben, das wir für "Führerschein vorhanden" eine 0 bzw 1 eingetragen haben. Da das aber weniger gut lesbar ist wandeln wir das in etwas um das man auch verstehen kann, nämlich Ja oder Nein. Die ZeilePHP-Code:$sql = "SELECT `vorname`, `geschlecht`, `alter`, IF(`fuehrerschein`=0, 'Nein', 'Ja') as fuehrerschein FROM `traumprojekt`";
macht also nichts anderes, als abzufragen ob im Feld "fuehrerschein" eine 1 oder eine 0 steht und liefert uns ein Ja oder Nein. Den Wert können wir in der Variable "fuehrerschein" (MySQL Alias as fuehrerschein) abrufen.Code:IF(`fuehrerschein`=0, 'Nein', 'Ja') as fuehrerschein
Dieser Weg ist schneller und performanter, weil direkt beim lesen aus der MySQL das 0/1 umgewandelt wird und es so nicht von PHP gemacht werden muß.
Die Anfrage wird an die DB geschickt und das Ergebnis halten wir in der Variable $abfrageergebnis fest. Mit der Zeileermitteln wir wie viele Zeilen wir aus der DB gelesen haben und geben das in der darauf folgenden Zeile per echo aus. Jetzt erzeugen wir einen Tabellenkopf und lassen uns fein säuberlich alle Datensätze tabellarisch ausgeben. Das geschieht mit...PHP-Code:$anzahl = mysql_num_rows( $abfrageergebnis );
Die Feldnamen aus der DB entsprechen den Array-Schlüssel beim auslesen. (vergleiche mit der Abfrage oben, die identische Feldnamen selektiert hat)PHP-Code:while ($datensatz = mysql_fetch_array( $abfrageergebnis ))
{
// Jeder Datensatz entspricht einer Tabellenzeile
echo "<tr>";
echo "<td>" .htmlspecialchars( $datensatz['vorname'] ). "</td>";
echo "<td>" .htmlspecialchars( $datensatz['geschlecht'] ). "</td>";
echo "<td>" .$datensatz['alter']. "</td>";
echo "<td>" .$datensatz['fuehrerschein']. "</td>";
echo "</tr>";
}
Hier geschieht noch einmal etwas sehr wichtiges! Daten die von Benutzereingaben abstammen und vom Typ String sind (wie z.B. Name und Geschlecht) müssen unschädlich gemacht werden, damit da keine unerwünschten Inhalte, wie etwa HTML-Code oder Javascript, ausgegeben werden. Dafür ist die Funktion htmlspecialchars() gedacht, die bestimmte Zeichen in HTML-Entities umwandelt und dadurch entschärft.
Zu guter Letzt schließen wir die Tabelle und speichern das ganze Script als mysql_lesen.php
Führen wir das Script nun aus sollten wir alle zuvor eingegebenen Datensätze sehen.
Fazit
Mit wenig Aufwand kann man primitive Datenbank-Anwendungen schreiben. An aller erster Stelle sollte dabei das Thema Sicherheit stehen! Nützliche Informationen und Tipps findet man im Sticky Thread in der Traum Dynamik. Es empfiehlt sich den Umgang mit Formularen auf einem lokalen Testserver zu üben, da jeder der sich auch nur halbwegs PHP Programmierer schimpfen darf den Umgang damit im Schlaf beherrschen muß.
Ein Thema, obwohl auch zu Formularen zugehörig, wurde nicht beachtet: Datei Uploads.
Das ist ein eigenes Kapitel für sich und wird vielleicht mal Gegenstand für ein zukünftiges, eigenes Tutorial.
Links
Zum Abschluß gibt es noch Links zu den verwendeten PHP Funktionen. Es ist nicht nur eine Empfehlung, sondern Programmierer Pflicht, zu wissen wie die einzelnen Funktionen arbeiten und wie man sie am effektivsten einsetzt!
- array_map
- die
- get_magic_quotes_gpc
- htmlspecialchars
- isset
- mysql_affected_rows
- mysql_connect
- mysql_fetch_array
- mysql_num_rows
- mysql_query
- mysql_real_escape_string
- mysql_select_db
Im Anhang sind noch einmal alle Dateien dieses Tutorials vorhanden.
Geändert von phpBuddy (26.11.2007 um 23:00 Uhr)
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
beim php Script ist HTML-code mit dabei muss der rein`?
Micha
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Hallo Rizzo,
dein Tutorial fand ich sehr aufschlussreich und habe mich mal daran versucht, jedoch kommt bei mir eine Fehlermeldung, mit der ich nicht wirklich etwas anfangen kann.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 8
Zum Testen hab ich dann nochmal deinen Originalquelltext genommen und bekomme die gleiche Meldung.
Hallo Hugy,
in welcher Datei trat der Fehler auf und was hast Du damit gerade gemacht? Hast Du eine DB angelegt mit der das Script auch arbeiten kann?
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Also, der Fehler tritt in der Datei auf, in welcher das Formular steht (bei dir im Tutorial heißt die mysql_schreiben.php). Habe sozusagen das Ganze nach deinem Leitfaden probiert. Als Datenbank hatte ich eine eigene genommen, auf was müßte ich denn da achten?
edit:
Hab mein Projekt auf einer lokalen Testumgebung mit xampp laufen.
Meine DB hab ich mit Zeichensatz: utf8_unicode_ci und Kollation unverändert erstellt.
Geändert von Hugy (23.12.2007 um 13:19 Uhr)
Hmm, kann ich nicht nachvollziehen. Das Script habe ich so 1:1 übernommen auf meinem Xampp und online getestet und es läuft ohne Fehlermeldungen. Du siehst ja auch, daß das Script schon einige Mal runtergeladen wurde. Würde es generell nicht laufen, hätte bestimmt schon jemand darauf hingewiesen.
Zu beachten gibt es eigentlich nicht viel, solange die Zugangsdaten zur DB korrekt sind. Der Zeichensatz und die Kollation sind eigentlich nebensächlich, solange die verwendete MySQL Version 4.1 oder höher ist.
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Hallo Rizzo,
der Fehler war letztendlich doch bei mir, ich weiß zwar nicht, wieso es anfangs nicht mit dem Original klappen wollte, aber egal. Ich hatte in meinem Quelltext aus irgendeinem Grund ein Komma zu viel. Tut mir leid, dass ich soviel Mühe gemacht habe. Und danke für die Hilfestellungen.
hi Rizzo,
hoffe ich krame jetzt keine alten kamellen hervor :-P
ich habe mich soweit an deine vorgaben gehalten(zumindest im php teil^^) doch bekomme ich immer noch die fehlermeldung: Der Datensatz konnte nicht hinzugefügt werden !
Wäre nett wenn da noch mal wer über den Quelltext gucken würde und mir den Fehler zeigt.
Hier die Datei mit meinem Formular: (myprofile.php)
und hier die datei zum senden der daten an die DB: (test.php)PHP-Code:<?php
print '<html><head><title>-My Profile-</title></head><body style="background-color:#000033;">
<!--header-->
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2"><img src="./bilder/links.gif"></td>
</tr>
<!--header ende-->
<!--start navi-->
<tr>
<td width="464px" bgcolor="black" align="left">
<a href="index.php">Home</a> | <a href="application.php">Application</a></td>
<td width="465px" bgcolor="black" align="right">
Members Only: <a href="introduction.php">PvP Introduction</a> | <a href="news.php">News</a> |
<a href="profiles.php">Profiles</a> | <a href="myprofile.php">My Profile</a></td>
</tr></table><!--ende navi-->';
//body start
print '<div style="text-align:center;">
<table border="0">
<tr><td style="text-align:center;" bgcolor="#000033">
<h1><u>Welcome to service Pilot</u></h1>
<font style="color:#FF0000;">
You have been authorized to access this Page. NOTE: The Content of this Page is confidential !!</font></td></tr>
</table></div>
<!-- Profil Formular -->
<br><br><form action="test.php" method="POST">
<table border="0"><tr><td>This Form is under construction! Dont use it till this message has been removed!</td></tr>
<tr>
<td style="text-align:right;">Name: </td>
<td colspan="5"><input name="name" type="text" size="30" value="Name" readonly></td>
</tr><tr>
<td style="text-align:right;">RL Name: </td>
<td colspan="5"><input name="RLname" type="text" size="30"></td>
</tr><tr>
<td rowspan="2" style="text-align:right;">Country: </td>
<td><input type="radio" name="country" value="USA"><img src="./bilder/flags/usa.jpg"></td>
<td><input type="radio" name="country" value="Germany"><img src="./bilder/flags/ger.jpg"></td>
<td><input type="radio" name="country" value="UK"><img src="./bilder/flags/uk.jpg"></td>
<td><input type="radio" name="country" value="France"><img src="./bilder/flags/f.jpg"></td>
</tr><tr>
<td><input type="radio" name="country" value="Denmark"><img src="./bilder/flags/dk.jpg"></td>
<td><input type="radio" name="country" value="Sweden"><img src="./bilder/flags/s.jpg"></td>
<td><input type="radio" name="country" value="Holland"><img src="./bilder/flags/nl.jpg"></td>
<td><input type="radio" name="country" value="Belgium"><img src="./bilder/flags/b.jpg"></td>
</tr><tr>
<td colspan="6"><center><input type="submit" name="submit" value="Send!"></center>
</td></tr></table></form>';
print '</body></html>';
?>
PHP-Code:<?php
print '<html><head><title>-Profile Submit-</title></head><body style="background-color:#000033;">';
$db_host = "";
$db_user = "";
$db_pass = "";
$dbname = "";
if (isset( $_POST['submit'] ))
{
// Maskierende Slashes aus POST entfernen
$_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;
// Inhalte der Felder aus POST holen
$name = $_POST['name'];
$RLname = $_POST['RLname'];
$country = $_POST['country'];
/* ************************************************************************************************ */
/* *** Hier sollten und MUESSEN die Benutzereingaben geprueft werden um Schadcode abzufangen!!! *** */
/* ************************************************************************************************ */
// Sind alle Eingaben durch die Validierung gekommen werden sie in die DB geschrieben
// Verbindung oeffnen und Datenbank ausweahlen
$db = mysql_connect( $db_host, $db_user, $db_pass ) or die(mysql_error());
if ($db)
{
mysql_select_db( $db_name, $db );
}
// Anfrage zusammenstellen der an die DB geschickt werden soll
$sql = "INSERT INTO `profiles`
(`name`, `RLname`, `country`)
VALUES(
'" .mysql_real_escape_string( $name ). "',
'" .mysql_real_escape_string( $RLname ). "',
'" .mysql_real_escape_string( $country ). "'
)";
// Schickt die Anfrage an die DB und schreibt die Daten in die Tabelle
mysql_query( $sql );
// Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
if (mysql_affected_rows() == 1)
{
echo "<h3>Erfolg!</h3>";
// Hier kann weiterer Code stehen der ausgefuehrt werden soll
// wenn ein Eintrag erfolgreich war. z.B. Email an den Admin schicken
// der ueber den neuen Eintrag informiert
}
else
{
echo "<h3>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</h3>";
// Hier koennen Massnahmen ergriffen werden die ueber den Misserfolg informieren
// wie z.B. den Benutzer darueber zu informieren, dem Admin eine Mail schicken
// damit er sich um den Fehler kuemmern kann, etc pp
}
}
print '</body></html>';
?>
Schonmal Danke für die Hilfe
Geändert von Enra (16.08.2008 um 08:52 Uhr)
Hallo Enra,
Du solltest erst mal den Code des ersten Script bereinigen, weil da diverse falsch gesetzt Quotes zu diversen Parse Error führen. So macht es nämlich wenig Spaß zu helfen.
Generell solltest Du erst mal ein nacktes Script erstellen das lediglich das Formular enthält und mit diesem testen, ob die Daten korrekt in die DB geschrieben werden. Erst dann macht man sich daran und verbaut es in das eigentlich Script. Treten dann Fehler auf weiß man, dass es zumindest mal nicht am Formular selbst liegt.
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
ja ok werde ich machen.....
sry hab ich vergessen.
die seiten werden alle über einen speziellen browser geöfnet dadurch kommt das zustande :-) ich melde mich wenn ich alles geändert hab
ok jetzt ist hoffentlich alles richtig
Hallo Enra,
und was passt da jetzt nicht? Gibt's Fehlermeldungen? Wurde die DB korrekt angelegt und die Zugangsdaten richtig angegeben? Im oberen Teil wird $dbname angegeben, weiter unten wird dann aber versucht die Datenbank über $db_name einzubinden. $dbname != $db_name
Das erste Listing ist doch einfach normales HTML, wieso also alles durch den Parser jagen und mit print ausgeben?
Im 2. Listing braucht man auch keinen Head und Body einfügen, weil es ein einfaches PHP Script ist. Es ist hier nicht schädlich, kann es aber bei anderen Scripts sein, wenn man mit header-Anweisungen arbeitet. Deswegen am besten HTML immer erst nach dem PHP Block.
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Moin Rizzo,
also das Formular ist deshalb im PHP teil mit drin, da ich dort noch mit speziellen befehlen für den browser arbeite in dem das später aufgerufen werden soll.
Das Problem ist halt nur, dass egal mit welchen Browser ich das Formular ausfülle, nix in die Datenbank reingeschrieben wird und ich immer nur die von uns definierte Fehlermeldung erhalte: Der Datensatz konnte nicht hinzugefügt werden!
Ich kann auch definitiv sagen das alle Zugangsdaten richtig angegeben sind.
Das ist es was mich auch etwas irritiert. Da alles seine richtigkeit zu haben scheint.
das hier ist meine tabelle in der DB:
Datenbank DB441027
Tabellenstruktur für Tabelle profiles
Feld Typ Null Standard
ID int(11) Ja NULL
name varchar(60) Ja NULL
RLname varchar(60) Ja NULL
country varchar(60) Ja NULL
Daten für Tabelle profiles
-----
Das Feld ID hat außerdem den Primärschlüssel und auto_increment
Geändert von Enra (17.08.2008 um 13:56 Uhr)
ich habe jetzt noch mal etwas anderes ausprobiert und bekomme jetzt mal eine mehr oder weniger brauchbare fehlermeldung
invalid literal for int() with base 16: ''
kann ich aber nichts mit anfangen
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)