PHP Umfrageformular in PHP?

c.orpID

Lt. Junior Grade
Registriert
Sep. 2006
Beiträge
367
Heyho Community,

folgende Sachlage:
Ich soll ein Umfragenformular für meine Firma kreiren welches auf der Page von Kunden ausgefüllt werden kann. Ansich ist das kein problem dachte ich und hab die Aufgabe angenommen da ich mich mit HTML und CSS sehr gut auskenne (was mir bei einem Formular nur relativ wenig bringt :) ) und mit PHP auch relativ gut, wobei die Betonung in diesem Fall auf relativ liegt.

Nun habe ich als grobes Grundgerüst ein kleines Formular erstellt, das wie ein Bewertungssystem arbeitet. Nun wollte ich auf diesem weiter aufbauen da sich ein Bewertungssystem mit dem was mein Chef vorhat (imo) sehr ähnelt. Ansich auch kein Problem wenn alle Fragen auf der selben Seite stehen sollen.

Nun mein Problem(chen):
Durch meine (anscheind) zu geringe Erfahrung mit PHP, weis ich nicht wie ich das Formular so schreiben kann, das, wenn eine Antwort per radiobutton aktiviert wurde ich auf eine neue Seite gelangen kann OHNE die ausgewählte Option zu vewerfen... bestimmt total simpel aber ich komme einfach nicht darauf.

Mein nächstes Problem liegt bei der Abfrage der radiobuttons.
Sprich: Wurde bei einer Frage KEINE Option gewählt, kann der Kunde nicht auf die nächste Seite und bekommt eine Fehlermeldung. Ich habe eine wage vermutung wie das funktioniert, denke aber mal schwer ich brauche dafür JS?
Ich kenne dieses Schema soweit von Kontaktformularen in denen eben z.B. das Feld "E-Mail" auf Gültigkeit anhand eines "@" zeichens etc. geprüft wird.

Würde mich über schnelle und kompetende Hilfe (nein, keine Komplettlösung und/oder ein fertiges Formular! keine angst! :) ) freuen.

Mfg
 
Ich bin jetzt zwar kein Profi, aber ich würde das so lösen:

Zum ersten Problem:
Man könnte einerseits die Antwortmöglichkeiten "durch schleifen", also per <input typ="hidden" /> an jede Seite weiter übergeben.
Oder man speichert die Zwischenergebnisse in einer Tabelle in einer Datenbank(oder Datei), wo der entsprechende Eintrag anhand der SessionID identifiziert wird.

Zum zweiten Problem:
Von JavaScript würde ich abraten (weil ,was wenn es einer deaktiviert hat?)
Man kann die Radiobuttons vorselektieren. Diese Selektierung kann man, nicht einfach aufheben.
Oder wenn das nicht gewollt ist, dann muss das prüfende PHP-Script die bereits angegebenen Daten aufnehmen und sie dann wieder in das Formular einsetzen.

Gibt vllt. noch bessere Lösungen, aber vllt. hilft das ja weiter.
 
Also die erste Variante mit dem input gefällt mir schonmal ganz gut :)
Da dieses Formular auf unserem Server gehostet wird auf dem u.a. auch die Seite liegt und dieser über keine SQL Datenbank verfügt, da nicht benötigt, wäre zweiteres wohl zum scheitern verurteilt... ganz abgesehn davon das ich keine Ahnung davon habe wie ich mit Session ID's arbeiten muss/kann/soll.

Zu zweiterem:
Das mit dem vorselektieren habe ich auch schon in Erwägung gezogen, aber wie schnell klickt man ausversehn zweimal auf den "Weiter" Button und übersieht dann die "6." vor der Frage obwohl man gerade erst bei "4." war :)
Netter Ansatz jedoch würde ich mir hierfür eine bessere Lösung wünschen.
Das mit dem JavaScript hingegen leuchtet ein, daran habe ich nicht gedacht.

Mfg
 
Code:
<?php
	session_start();
	$fHandle = fopen(session_id().".txt", "w");
	if($fHandle) {
		fwrite($fHandle, "test");
		fclose($fHandle);
	}
	$fHandle = fopen(session_id().".txt", "r");
	if($fHandle) {
		while(!feof($fHandle)) {
			$msg = fgets($fHandle, 128);
			print $msg."<br>";
		}
		fclose($fHandle);
	}
?>
kleines Beispiel.
 
Ah ok... danke.
sieht ja leichter aus, als ich vermutet habe :)
So sollte das aufjedenfall hinhauen.

Da am Ende des Formulars die Ergebnisse per Mail versendet werden sollen kann ich als src einfach das *.txt file der session angeben, geh ich da recht in der annahme?
 
Wie ist das gemeint als src?
Das in der Mail ein Link auf die Datei weist?
Sollte funktionieren.

Aber es kann ja auch einfach das Ergebnis gleich mit einem passenden Layout in der Mail verschickt werden (Dann kann die Datei auf den Server auch gleich wieder gelöscht werden).
 
Hab mich ein wenig umständlich ausgedrückt. (Wenn man den Chef im nacken hat... naja ;) )

Ich meinte, wie du bereits geschrieben hast, das der Inhalt in eine Mail eingefügt wird (formatiert) und an die angegebene Adresse geschickt wird.
Das die session direkt danach gelöscht wird währe ein Luxus den ich mir wünschen würde, jedoch nicht zwingend Notwendig ist.
 
Also entweder meine Kenntnisse in PHP reichen nicht aus das mal "schnell" zu kapieren oder ich bin schlicht und einfach zu dämlich.
Lustigerweise wüsste ich jetzt wie ich mir einen Login schreibe... was nur leider nicht mein Problem war :)

Jetzt hole ich mal weiter aus, ich habe nun also meine "umfrage.php" in welcher ich die session starte.

Code:
<?php session_start (); ?>
<html>
<head>

Nun folgt der übliche HTML code bis es dann hier weiter geht:

Code:
      <center>
        Blabla? 
        <form action="checksum.php" method="POST">
          Ja 
          <input type="radio" name="q1" value="1" />
          Nein 
          <input type="radio" name="q1" value="0" />
        </form>
        <p>&nbsp; <a href="umfrage2.php?<?php echo strip_tags (SID)?>"> weiter </a>

dies währe nun die erste Frage des Formulars, wobei die antworten wiederum in der checksum.php hinterlegt sin, welches dann so aussieht:

Code:
<?php
$checksum = $_POST["q1"];

if($checksum<1) {
echo "Mag kein Blabla";
elseif($checksum==1) {
echo "Mag blabla";
} else {
echo "Fehler";
}
?>

Jetzt soll die Antwort von "q1" in die SID übernommen werden.
Und DA hängt es bei mir.
Vor allem, wo muss besagt variable dann stehn? in der Umfrage.php oder in der checksum.php?

Ich geh das alles glaube ich viel zu kompliziert an... einfach denken war jedoch nochnie meine Stärke ;)

Könnte mir da jemand auf die Sprünge helfen?
 
Kurze frage: ist die Umfrage eine eigenständige Seite, oder wird sie in z.B. die Startseite z.B. in eine Sidebar integriert ?

Desweiteren:
Werden alle Fragen auf einer Seite gestellt, oder werden die Fragen nach und nach, also zuerst Frage 1 -> dann neuladen -> Frage 2 -> (...) gestellt ?
 
Die Umfrage wird eine eigenständige Seite sein, ja.

Und ja (leider) soll jede Frage auf einer extra Seite stehn was die Sache (für mich) nur umso schwerer macht.

Die Antworten sollen u.a. am Ende der Umfrage direkt an eine fest hinterlegt E-Mail Adresse verschickt werden.
 
PHP:
//Variable mit Hilfe der SID speichern:
$variable = $_POST['variable'];
session_register("variable");

//Und dann kann in allen weiteren Scripts auf die Variable so zugegriffen werden:
$variable = $_SESSION['variable'];

//Die registrierten Variablen können so lange aufgerufen werden bis vollgende Funktionen aufgerufen werden:
session_unset();
session_destroy();
Für ein Login-Script kann man also eine Variable 'isloggedin' setzen(z.B. wenn eine Passwortüberprüfung erfolgreich war) und diese dem Wert true oder Ähnliches geben.
Dann kann man in jedem anderen Script vorher prüfen, ob diese Variable auf true steht.
Beim Logout entsprechend die Session mit den beiden obenstehenden "zerstören".
 
Zuletzt bearbeitet:
Ok mal kurz zusammenfassen, ich kann jetzt leider nicht mit quelltext arbeiten da ich zuhause bin und die files auf der arbeit.

Ich füge im 1. file (sprich der umfrage.php) den session start genau so ein, wie ich ihn bereits oben beschrieben habe?
Und dann füge ich einfach nur die von dir genannten codes in alle andren seiten ein? (z.B. umfrage2.php, umfrage3.php usw.)

und am schluss, nachdem die mail per PHP versendet wurde, wird die session mit
Code:
session_unset();
session_destroy();
zerstört, das war mir bereits klar :)

Mein Problem ist eigentlich wirklich nur der teil zwischen session start und dem ende.

Ahja... weil du gerade von Logins redest, einen Login benötige ich nicht, ich möchte nur per radio markierte FEST eingestellte antworten per SID weiterleiten. Veilleicht versteh ich dich auch gerade nur falsch :)
 
Nein es muss nicht zwingend selbst geschrieben sein, sollte sich von layout her aber Einwandfrei in unser vorhandenes Design der Firmenhomepage einfügen.
Werde mir die Software mal ansehen, über weitere Tipps würde ich mich dennoch freuen :)
 
Jetzt soll die Antwort von "q1" in die SID übernommen werden.
Und DA hängt es bei mir.
Da scheint ja jetzt das Problem zu sein.
Ich nehme vollgendes mal als Beispiel:
<form action="checksum.php" method="POST">
<input type="radio" name="q1" value="1" />Ja
<input type="radio" name="q1" value="0" />Nein
</form>
Jetzt denke ich mal, soll es so sein, dass der Server die Variable an die SID bindet, sodass nach einem Seitenwechsel die Variable immernoch zur Verfügung steht, oder?
So kann man die Variable im oben zitierten Code mit der SID "verbinden":
PHP:
$q1 = $_POST['q1']; 
//Da oben die beiden input-Elemente den selben Namen haben und nur eines von diesen markiert werden kann,
//wird automatisch das Value des markierten Radiobuttons übergeben.
session_register("q1");
//Hier wird dem Server gesagt, er soll die Variable q1 speichern.
Wenn man nun die nächste Seite aufruft hat man auf die Variable wie folgt wieder Zugriff:
PHP:
$q1 = $_SESSION['q1'];
Das $_SESSION['q1'] entspricht in etwa wie dem $_POST['q1'], nur dass der Server die Daten aus einer Sessiondatei herausliest und nicht(wie bei Post) die Daten vom Browser geschickt bekommt.
Das session_register("q1") muss man nur dort aufrufen, wo als erstes die Variable per Post an den Server übergeben wurde.
Es gibt an, dass der Server sich die Variable q1 merken soll und an die SID binden.
Kommt nun die nächste Anfrage mit der entsprechenden SID, so kann man wieder auf die Variable zugreifen.


Edit: Oder liegt das Problem immer noch daran, dass geprüft werden soll, ob eine Auswahl markiert wurde??

In dem Fall würde es sich lohnen alle Fragen unter einer umfrage.php zu laden und dann die Zielorte der Formulare an die selbe Datei zu senden.
Ungefähr so(Die Datei nenn ich mal umfrage.php):
PHP:
<?php
session_start();

require('formulare.php');          //formulare.php einbinden (siehe unten)

if(isset($_GET['page']))            //Testen ob Variable existiert.
$page= $_GET['page'];           //Variable laden, wenn existiert.
else $page = 1;                       //Wenn nicht, dann auf 1 setzen.

if($page == 1)                        //Seite 1 laden:
{
  echo formular1();
}

if($page == 2)                        //Seite 2 laden:
{
   if(isset($_POST['q1']))         //Testen ob bei Frage 1 etw. ausgewählt wurde
   {
     $q1 = $_POST['q1'];
     session_register("q1");    //Wenn ja registrieren
     echo formular2();             //und nächstes Formular ausgeben
   } 
   else
   {
     echo 'Nicht ausgefüllt!';    //Angeben dass etwas fehlt
     echo formular1();            //Altes Formular laden
   }
}

if($page == 3)                        //Seite 3 laden:
{
   if(isset($_POST['q2']))
   {
     $q2 = $_POST['q2'];
     session_register("q2");
     echo formular3();
   }
   else
   {
     echo 'Nicht ausgefüllt!';
     echo formular2();
   }
}

if($page == 4)                      //Seite 4 laden(Endseite):
{
  if(isset($_POST['q3']))
  {
    $q1 = $_SESSION['q1'];
    $q2 = $_SESSION['q2'];
    $q3 = $_POST['q3'];

    echo "$q1, $q2, $q3";  //Hier dann als Mail verschicken.

    session_unset();
    session_destroy();
  }
  else
  {
    echo 'Nicht ausgefüllt!';
    echo formular3();
  }
}
?>

Datei formulare.php:
PHP:
<?php
function formular1();
{
   return '<form action="umfrage.php?page=2" method="POST">
  <input type="radio" name="q1" value="1" />Ja 
  <input type="radio" name="q1" value="0" />Nein 
</form>';
}

function formular2();
{
   return '<form action="umfrage.php?page=3" method="POST">
  <input type="radio" name="q2" value="1" />Ja 
  <input type="radio" name="q2" value="0" />Nein 
</form>';
}

function formular3();
{
   return '<form action="umfrage.php?page=4" method="POST">
  <input type="radio" name="q3" value="1" />Ja 
  <input type="radio" name="q3" value="0" />Nein 
</form>';
}
?>

Ich hoffe, dass das etwas helfen kann. Es ist jetzt natürlich immer nur für eine Frage pro Seite ausgelegt.
Wenn mehrere Fragen auf eine Seite sollen, dann kann das ganze mit and in der isset-Abfrage ergänzt werden.
Bei mehreren Fragen pro Seite sollte dann natürlich auch bereits getätigte Antworten wieder angezeigt werden.
Da muss dann einfach die Formular-Funktion erweitert werden etwa so:
PHP:
function formular3($q3 = '', $q3b = ''); //Die Parameter sind optional und standardmäßig leer(Für jede Frage ein Parameter).
{
   $otion1 = '';
   $otion2 = '';
   if(q3 == 1) $otion1 = 'selected="selected"';
   if(q3 == 0) $otion2 = 'selected="selected"';

   $otion1b = '';
   $otion2b = '';
   if(q3b == 1) $otion1b = 'selected="selected"';
   if(q3b == 0) $otion2b = 'selected="selected"';

   return '<form action="umfrage.php?page=4" method="POST">
  <input type="radio" name="q3" value="1" '.$option1.' />Ja 
  <input type="radio" name="q3" value="0" '.$option2.' />Nein 

  <input type="radio" name="q3b" value="1" '.$option1b.' />Ja 
  <input type="radio" name="q3b" value="0" '.$option2b.' />Nein 
 
</form>';
}
Ok, das ist jetzt länger geworden, als gedacht... Ich hoffe es hilft irgendwie weiter.
Es ist jetzt zwar nicht ideal. Aber ich hoffe, dass das Prinzip und die Idee irgendwie klar geworden ist.
 
Zuletzt bearbeitet:
Sooo, neue Woche neues Glück :)

Also dein erster Tipp hat mir schonmal weitergeholfen, werde es morgen mal versuchen ob es so hinhaut.
Falls nicht melde ich mich einfach nochmal.

Nur eins verstehe ich nochnicht ganz obwohl ich mir auch schon zig Websites darüber durchgelesen habe.

Ich habe nun also alle daten in der SID stehen, so weit so gut.
Und ich glaube jetzt habe ich einen verständnissfehler.

Ich füge dann am ende der Umfrage den code ein, das eine Mail verschickt werden soll, kann ich dann einfach als inhalt
PHP:
echo "$q1, $q2, $q3";
schreiben und er übernimmt mir das? Und vor allem: wo genau soll das dann hin? Alles vor den HTML header?

Wenn die Frage geklärt ist sollte ich es denke ich hinbekommen :)
 
Nein.
Der Befehl echo gibt die Daten nur auf der Webseite aus.
Wenn davon eine Mail verschickt werden soll, dann muss man die Funktion mail() aufrufen.
PHP:
$email = "eMail-Adresse des Absenders";
$sender = "Name des Absenders";
$text = "Umfrageergebnisse
Antwort1: $q1
Antwort2: $q2
Antwort3: $q3";

  $message = "$text";
  $to      = "email@example.com";
  $subject = "Umfrage-Ergebnisse";
  $xtra    = "From: $email ($sender)\r\n";
  $xtra   .= "Content-Type: text/text\r\nContent-Transfer-Encoding: 8bit\r\n";
  $xtra   .= "X-Mailer: PHP ". phpversion();
  //Die Variable $xtra am Besten einfach so lassen.
  mail($to, $subject, $message, $xtra);
Mit dem echo wollte ich einfach sagen, dass man das ganze dann einfach irgendwie weiterverarbeiten kann.
Natürlich sollte man das ganze noch ein bisschen übersichtlicher gestalten (Damit nicht einfach drei Werte in der eMail stehen).
Wenn die eMail HTML-Elemente enthalten soll, dann muss bei der Variable $xtra, dort wo Content-Type steht, das text/text in text/html abgeändert werden.
 
Zuletzt bearbeitet:
Hey danke! :)
funktioniert soweit nun einwandfrei.

Wenn du mir jetzt noch bei einem schönheitsfehler unter die Arme greifen kannst küss ich dir die Füße :)

Ich habe nun also diese Zeilen code:

HTML:
<td width="60%" align="center" valign="center" height="100%" bgcolor="#FFFFFF"> 
      <p>Frage? Antwort!</p>
      <form action="u2.php" method="POST">
        1 
        <input type="radio" name="q1" value="1" />
        2 
        <input type="radio" name="q1" value="2" />
        3 
        <input type="radio" name="q1" value="3" />
        4 
        <input type="radio" name="q1" value="4" />
        5 
        <input type="radio" name="q1" value="5" />
        6 
        <input type="radio" name="q1" value="6" />
      </form>

und möchte das die radios schön in einer Reihe stehen mit dem selben abstand zueinander und sich somit über die tabellenzelle verteilen.
HTML:
text-align:justify
funktioniert leider nicht

Ich dachte auch daran das mit
HTML:
<div id="radio">
und danach per CSS einfach
Code:
#links { width: 594px; }
#links a { float: left;width: 16%;display: block; }

Scheint aber auch nicht zu funktionieren, vielleicht hab ich auch nur wiedermal einen Denkfehler?

**edit**
Habs gerade noch mit <td width="16%"> etc. versucht aber dann zerlegts mir die komplette Seite
Verträgt sich das nicht <form> ?

**edit²**
Ich denke es währe noch wichtig zu sagen das die Seite nach dem Liquid Design prinzip aufgebaut ist, auf tabellenbasis.
Der aufmerksame leser dürfte das aber schon alleine dadurch gemerkt haben das alle angaben in % sind :)
 
Zuletzt bearbeitet:
Das versteh ich grad irgendwie nicht...
Wie ist das gemeint?
Von links nach rechts oder von oben nach unten oder wie?

Das <td width="16%"> nicht funktioniert, liegt wahrscheinlich daran,
dass dann die Zellenbreite auf 16% der Tabellenbreite verkleinert wird.
Da bleibt dann nicht mehr viel übrig. Jenachdem, wie groß die Tabelle ist.

Edit: Und die CSS-Angaben passen irgendwie nicht zusammen.
In dem Form gibts keine Links...
 
Zuletzt bearbeitet:
Zurück
Oben