Anzeige
Tutorialbeschreibung

Formular über mehrere Seiten mit Session

Formular über mehrere Seiten mit Session

Aufgrund der Nachfrage nach einem Formular mit mehreren Seiten, in welches Daten eingegeben werden können, hier nun ein Tutorial dazu.

Wichtig bei diesem Tutorial:
Es ist ein sehr einfaches Tutorial ohne Sicherheitsaspekte und weiterführende Fehlerverarbeitung!

Weitere Informationen zum Thema Session findet ihr hier: http://de.php.net/manual/de/book.session.php

Bitte beachtet, wie der Umgang mit Cookies in der Einstellung von PHP auf dem von euch verwendeten Server geklärt ist!


Schritt 1:

Dateiname: start.php

 

<?php
/*
 * Session starten
 * - Wo wird die Session-Datei gespeichert
 * - Wie lautet der Session-Name
 * - Session starten
 */
session_save_path('_sess');
session_id();
session_start();

$error = 0;

if(isset($_POST['submit1'])) {
    
    if(!empty($_POST['s1']) && !empty($_POST['c1'])) {
        /*
         * Daten aus Post in Session eintragen
         */        
        foreach($_POST as $k => $v) {
            /*
             * Die Daten werden in einem Array mit dem Namen
             * page_start gespeichert
             */
            $_SESSION['page_start'][$k] = $v;
        }
        
        /*
         * Daten aus der ersten Seite (start.php) wurden in der Session
         * gespeichert. Somit weiter zur 2. Seite
         */
        header('Location: next.php', true);
        exit();

    } else {
        $error = 1;
    }
}

/*
 * Variablen für input zuweisen.
 */ 
$valueS1 = isset($_SESSION['page_start']['s1']) ? $_SESSION['page_start']['s1'] : '';
$checked = isset($_SESSION['page_start']['c1']) ? 'checked="checked"' : '';

/*
 * html-Ausgabe
 */
?>
<? echo '<?xml version="1.0" encoding="utf-8"'; ?>
<!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=utf-8" />
        <title>Formular auf mehreren Seiten</title>
    </head>
    <body>
        <h1>Seite #1</h1>
        <?php if($error) { ?>
        <div style="color: red; padding: 5px; border: 1px solid red;font-weight: bold;">
            Bitte alle Felder ausfüllen
        </div>
        <?php } ?>
        <div>Alle Felder sind Pflicht<br /><br /></div>
        <form method="post" action="start.php">
            <div>
                Input-Feld 1 <input type="text" name="s1" value="<?php echo $valueS1; ?>" />
                <br />Check-Box <input type="checkbox" name="c1" value="1"<?php echo $checked; ?> />
                <p>
                    <input type="submit" name="submit1" value="weiter" />
                </p>
            </div>
        </form>
    </body>
</html>


 

Schritt 2:

Dateiname: next.php

 

<?php
/*
 * Session starten
 * - Wo wird die Session-Datei gespeichert
 * - Wie lautet der Session-Name
 * - Session starten
 */
session_save_path('_sess'); // aus Sicherheitsgründen sollte man ein eigens angelegtes Verzeichnis wählen
session_id();
session_start();

$error = '';

if(isset($_POST['submit2'])) {
    
    if(!empty($_POST['s2'])) {
        /*
         * Daten aus Post in Session eintragen
         */        
        foreach($_POST as $k => $v) {
            $_SESSION['page_next'][$k] = $v;
        }
        
        /*
         * Daten aus der ersten Seite (start.php) wurden in der Session
         * gespeichert. Somit weiter zur 2. Seite
         */
        header('Location: end.php', true);
        exit();

    } else {
        $error = 1;
    }
}

/*
 * Variablen für input zuweisen.
 */ 
$valueS2 = isset($_SESSION['page_start']['s2']) ? $_SESSION['page_start']['s2'] : '';

/*
 * html-Ausgabe
 */
?>
<? echo '<?xml version="1.0" encoding="utf-8"'; ?>
<!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=utf-8" />
        <title>Formular auf mehrere Seiten</title>
    </head>
    <body>
        <h1>Seite #2</h1>
        <?php if($error) { ?>
        <div style="color: red; padding: 5px; border: 1px solid red;font-weight: bold;">
            Bitte alle Felder auf Seite 2 ausfüllen
        </div>
        <?php } ?>
        <div>Alle Felder sind Pflicht<br /><br /></div>
        <form method="post" action="next.php">
            <div>
                Input-Feld 2 <input type="text" name="s2" value="<?php echo $valueS2; ?>" />
                <p>
                    <a href="start.php">zurück zu Seite 1</a> 
                    <input type="submit" name="submit2" value="weiter...." />
                </p>
            </div>
        </form>
    </body>
</html>



S1Bilder




Schritt 3:

Dateiname: end.php

 

<?php
/*
* Session starten

 * - Wo wird die Session-Datei gespeichert
 * - Wie lautet der Session-Name
 * - Session starten
 */
session_save_path('_sess'); // aus Sicherheitsgründen sollte man ein eigens angelegtes Verzeichnis wählen
session_id();
session_start();

$error = '';

if(isset($_POST['submit3'])) {
    
    if(!empty($_POST['s3'])) {
        /*
         * Daten aus Post in Session eintragen
         */        
        foreach($_POST as $k => $v) {
            $_SESSION['page_end'][$k] = $v;
        }
        
        /*
         * Daten aus der ersten Seite (start.php) wurden in der Session
         * gespeichert. Somit weiter zur 2. Seite
         */
        header('Location: thanks.php', true);
        exit();

    } else {
        $error = 1;
    }
}

/*
 * Variablen für input zuweisen.
 */ 
$valueS3 = isset($_SESSION['page_start']['s3']) ? $_SESSION['page_start']['s3'] : '';

/*
 * html-Ausgabe
 */
?>
<? echo '<?xml version="1.0" encoding="utf-8"'; ?>
<!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=utf-8" />
        <title>Formular auf mehreren Seiten</title>
    </head>
    <body>
        <h1>Seite #3</h1>
        
        <?php if($error) { ?>
        <div style="color: red; padding: 5px; border: 1px solid red;font-weight: bold;">
            Bitte alle Felder auf Seite 3 ausfüllen
        </div>
        <?php } ?>
        
        <div>Alle Felder sind Pflicht<br /><br /></div>
        
        <form method="post" action="end.php">
            <div>
                Input-Feld 3 <input type="text" name="s3" value="<?php echo $valueS3; ?>" />
                <p>
                    <a href="next.php">zurück zu Seite 2</a>
                    <input type="submit" name="submit3" value="Dateneingabe abschließen" />
                </p>
            </div>
        </form>
    </body>
</html>

 

Schritt 4:

Dateiname: thanks.php

 

<?php
/*
 * Wie bei der ersten und allen vorherigen Seiten:
 */
session_save_path('_sess');
session_id();
session_start();

/*
 * Hier könnte nun die vollständige Datenspeicherung erfolgen
 * wie z.B. Speichern der Daten in einer Datenbank.
 * 
 * Danach das Löschen der Session selbst; hier werden die Daten
 * noch zuvor an eine Variable übergeben für die Ausgabe in der
 * Seite thanks.php
 */
$viewDatasFromSession = $_SESSION;

/*
 * Entweder die Session-Daten löschen, um die Session-Id weiter
 * zu nutzen:
 */
unset($_SESSION['page_start']);
/*
 * oder die Session-Datei und somit auch die Session-Id löschen:
 */
session_destroy();

/*
 * html-Ausgabe
 */
?>
<? echo '<?xml version="1.0" encoding="utf-8"'; ?>
<!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=utf-8" />
        <title>Formular auf mehreren Seiten</title>
    </head>
    <body>
        <h1>Danke für Ihre Zeit</h1>
        
        <div>Es wurden alle Daten übernommen und gespeichert. Ggf. erhalten Sie auch eine E-Mail ;)</div>
        <div>Ihre Daten aus dem Formular, bestehend aus 3 Seiten:</div>
        <?php 
        echo '<pre>';
        print_r($viewDatasFromSession);
        echo '</pre>';
        ?>
        
    </body>
</html>


Das war es schon. Das Gleiche ist mit allen anderen input-Feldern natürlich auch möglich.

Viel Spaß dabei.

Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von Lordi
  • 02.05.2011 - 11:53

Dieses Tut ist soweit ganz gut

Portrait von Khazar
  • 25.06.2010 - 13:42

Wirklich sehr nützlich!

Portrait von saila
  • 19.02.2010 - 18:27

Hi,

deine Fehlermeldung besagt, dass du vor session_start() bereits eine HTML-Ausgabe hast. Sprich dein Script ist nicht korrekt aufgebaut, da du HTML vor session_start bereits per echo oder print sendest.

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 31.01.2010 - 07:38

vielen Dank.
hat mir viel geholfen

Portrait von maeck
  • 16.01.2010 - 11:22

Vielen Dank für das Tutorial!

Macht es eigentlich einen Unterschied, ob ich ein "Formular über mehrer Seiten" in einer einzigen PHP-Datei programmiere, oder wirklich über mehrere PHP-Dateien?

Ich mache gerade ein Anmeldeformular, bei dem auf der "ersten Seite" nur die Kontaktdaten eingegeben werden und wenn man auf "weiter" klickt, bleibt man im gleichen Script. Es werden erst die Eingaben geprüft und wenn die korrekt sind, springt das Script weiter nach unten und man kann dann die Veranstaltung auswählen und noch ein paar andere Dinge.

Gibts da einen best-practice? Wirklich über mehrere Seiten, oder gehts auch in einem Script?

Danke und Gruß, maeck

Portrait von saila
  • 16.01.2010 - 11:40

Hi,

ob du die Session in einer oder auf mehrere Dateien verteilst, ist in deinen Scripten deine persönliche Freiheit.

Wichtig dabei ist lediglich, dass du bei http://php.net die entsprechenden Grundlagen für Session-Handling beachtest. Sprich wie ist die Servereinstellung bzgl. der URL (wird also die Session automatisch an ULR's angehängt oder nicht) und die Sicherheit beachtest.

Portrait von oliverhellmig
  • 11.01.2010 - 18:20

des kommt bei mir ins wiki - super geschrieben - danke

Portrait von saila
  • 16.01.2010 - 11:41

Hi,

bitte den Betreiber von PSD zuvor fragen, ob dies erlaubt ist ;)

Portrait von nukem21
  • 11.01.2010 - 09:04

danke, ist sehr hilfreich

Portrait von landrobber
  • 10.01.2010 - 08:56

danke schön - sehr hilfreich, gut beschrieben!

Portrait von klabauta
  • 09.01.2010 - 16:28

Super. Vielen Dank für deine Arbeit.

Portrait von Guleum
  • 09.01.2010 - 13:03

Super beschrieben und ziemlich verständlich.

Portrait von johanna52
  • 09.01.2010 - 11:09

Klasse tutorial - danke

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 19.02.2010 - 09:47

Folgende Fehlermeldung:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /homepages/14/d29907289/htdocs/joomla/psd/start.php:2) in /homepages/14/d29907289/htdocs/joomla/psd/start.php on line 11

Ich habe einen Odner mit dem Namen _sess im selben Verzeichniss angelegt.

Vielen Dank für Hilfe

x
×
×