Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 15 von 44

Thema: [Tutorial] Formulare verarbeiten mit PHP/MySQL (Teil 1 - Grundlagen)

  1. #1
    TP-Specialist Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678

    [Tutorial] Formulare verarbeiten mit PHP/MySQL (Teil 1 - Grundlagen)

    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.
    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>
    Wer hier schon Probleme hat zu verstehen was er vor sich sieht, der sollte an dieser Stelle abbrechen und erst einmal HTML Grundlagen pauken!
    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-Element
    Code:
    <input type="text" name="textfeld" id="textfeld" />
    nach abschicken des Formulars für PHP ein
    Code:
    $_POST['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!

    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)
    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>
    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.

    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
    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
    in phpMyAdmin (in der DB) ausführen.
    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:
    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>
    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.

    Hier nun der PHP-Teil
    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'] ) ? 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
        
    }
    }
    ?>
    Um überhaupt zu wissen ob PHP aktiv werden muß fragen wir erst mal ab ob ein Formular abgeschickt wurde. Das geschieht mit der Zeile
    PHP-Code:
    if (isset( $_POST['eintragen'] )) 
    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 \"
    Danach laden wir die Inhalte aus dem $_POST Array um in normale Variablen um damit weiterzuarbeiten. 2 Besonderheiten fallen hier schon auf, zum einen...
    PHP-Code:
    $alter = (int) $_POST['alter']; 
    Das (int) stellt sicher das für das Alter nur ein numerischer Wert in die DB gelangt und zum anderen...
    PHP-Code:
    $fuehrerschein = isset( $_POST['fuehrerschein'] ) ? 0
    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.

    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.
    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"
                    )"

    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)
    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...
    PHP-Code:
    if (mysql_affected_rows() == 1
    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.

    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'] ) ? 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...
    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>
    Zuerst wieder das obligatorische verbinden zum Datenbankserver und das auswählen der DB. Dann wird die Anfrage zusammengestellt...
    PHP-Code:
    $sql "SELECT `vorname`, `geschlecht`, `alter`, IF(`fuehrerschein`=0, 'Nein', 'Ja') as fuehrerschein FROM `traumprojekt`"
    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 Zeile
    Code:
    IF(`fuehrerschein`=0, 'Nein', 'Ja') as fuehrerschein
    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.
    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 Zeile
    PHP-Code:
    $anzahl mysql_num_rows$abfrageergebnis ); 
    ermitteln 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:
    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>";

    Die Feldnamen aus der DB entsprechen den Array-Schlüssel beim auslesen. (vergleiche mit der Abfrage oben, die identische Feldnamen selektiert hat)
    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!

    Im Anhang sind noch einmal alle Dateien dieses Tutorials vorhanden.
    Angehängte Dateien Angehängte Dateien
    Geändert von phpBuddy (26.11.2007 um 23:00 Uhr)

  2. #2
    TP-Senior
    Registriert seit
    Jan 2007
    Ort
    Roßlau
    Beiträge
    240
    beim php Script ist HTML-code mit dabei muss der rein`?
    Micha

  3. #3
    TP-Specialist Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    Zitat Zitat von Micha Koko Beitrag anzeigen
    beim php Script ist HTML-code mit dabei muss der rein`?
    Micha
    Wenn er da steht, wird es sicher seinen Sinn haben.

  4. #4
    TP-Newbie
    Registriert seit
    Dec 2007
    Beiträge
    3
    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.

  5. #5
    TP-Specialist Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    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?

  6. #6
    TP-Newbie
    Registriert seit
    Dec 2007
    Beiträge
    3
    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)

  7. #7
    TP-Specialist Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    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.

  8. #8
    TP-Newbie
    Registriert seit
    Dec 2007
    Beiträge
    3
    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.

  9. #9
    TP-Junior
    Registriert seit
    Aug 2008
    Beiträge
    8
    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)

    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>';
    ?>
    und hier die datei zum senden der daten an die DB: (test.php)


    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)

  10. #10
    TP-Specialist Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    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.

  11. #11
    TP-Junior
    Registriert seit
    Aug 2008
    Beiträge
    8
    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

  12. #12
    TP-Junior
    Registriert seit
    Aug 2008
    Beiträge
    8
    ok jetzt ist hoffentlich alles richtig

  13. #13
    TP-Specialist Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    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.

  14. #14
    TP-Junior
    Registriert seit
    Aug 2008
    Beiträge
    8
    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)

  15. #15
    TP-Junior
    Registriert seit
    Aug 2008
    Beiträge
    8
    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

Seite 1 von 3 123 LetzteLetzte

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Stichworte


Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51