• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Versuche, Formular mit Datenbank zu verknüpfen

Dany Sahne

Neues Mitglied
Moin Moin,

ich habe hier ein php-Skript, welches eine Auswertung eines Formulars vornimmt (Danke dabei an Programmier-Felix). Nach der Auswertung wird das Ergebnis mittel eines Formmailers an meine E-Mail-Adresse geschickt. Soweit, sogut.

PHP:
<form action="absenden.php" method="POST">
<input name="spielstrafe" value="weiterspielen" type="radio"> weiterspielen
<input name="spielstrafe" value="abstoß" type="radio"> Abstoß
<input name="spielstrafe" value="anstoß" type="radio"> Anstoß
<input name="spielstrafe" value="eckstoß" type="radio"> Eckstoß
<input name="spielstrafe" value="einwurf" type="radio"> Einwurf
<input name="spielstrafe" value="direkter_freistoß" type="radio"> direkter Freistoß
<input name="spielstrafe" value="indirekter_freistoß" type="radio"> indirekter Freistoß
<input name="spielstrafe" value="schiedsrichterball" type="radio"> Schiedsrichterball
<input name="spielstrafe" value="strafstoß" type="radio"> Strafstoß
<input name="spielstrafe" value="wiederholung" type="radio"> Wiederholung
<input name="spielstrafe" value="halbzeit" type="radio"> Halbzeit
<input name="spielstrafe" value="spielende" type="radio"> Spielende
<input name="ort" value="weiterspielen" type="radio"> weiterspielen
<input name="ort" value="mittelpunkt" type="radio"> Mittelpunkt
<input name="ort" value="torraum" type="radio"> Torraum
<input name="ort" value="torraumlinie" type="radio"> Torraumlinie
<input name="ort" value="strafraumlinie" type="radio"> Strafraumlinie
<input name="ort" value="eckstoßteilkreis" type="radio"> Eckstoßteilkreis
<input name="ort" value="seitenlinie" type="radio"> Seitenlinie
<input name="ort" value="11_meter_punkt" type="radio"> 11-Meter Punkt
<input name="ort" value="hoehe_11_meter_punkt" type="radio"> Höhe 11-Meter Punkt
<input name="ort" value="gleicher_ort" type="radio"> Gleicher Ort
<input name="ort" value="(tat-)_ort_des_vergehen" type="radio"> (Tat-) Ort des Vergehen
<input name="ort" value="wo_werfer_stand" type="radio"> Wo Werfer stand
<input name="ort" value="wo_getroffen_wurde/werden_sollte" type="radio"> wo getroffen wurde / werden sollte
<input name="ort" value="Wo_ball_bei_pfiff" type="radio"> Wo Ball bei Pfiff
<input name="ort" value="spielende" type="radio"> Spielende
<input name="persoenlicheStrafe" value="keine_persoenliche_strafe" type="radio"> keine persönliche Strafe
<input name="persoenlicheStrafe" value="gelb" type="radio"> Gelb
<input name="persoenlicheStrafe" value="gelb/rot" type="radio"> Gelb/Rot
<input name="persoenlicheStrafe" value="gelb_und_gelb/rot" type="radio"> Gelb und Gelb/Rot
<input name="persoenlicheStrafe" value="rot" type="radio"> Rot
<input name="persoenlicheStrafe" value="nur_meldung_moeglich" type="radio"> Nur Meldung möglich
<input name="persoenlicheStrafe" value="spielabbruch" type="radio"> Spielabbruch
<input type="submit" name="absenden" value="Absenden">
</form>
<?php
if (isset($_POST['absenden']))
{
 $spielstrafe = $_POST['spielstrafe'];
 $ort = $_POST['ort'];
 $persoenlicheStrafe = $_POST['persoenlicheStrafe'];
 $spielstrafenpunkte = 0;
 $ortspunkte =0;
 $persoenlicheStrafepunkte =0;
 if ($spielstrafe == "weiterspielen")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "abstoß")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "anstoß")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "eckstoß")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "einwurf")
 {
  $spielstrafenpunkte = 5;
 }
 if ($spielstrafe == "direkter_freistoß")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "indirekter_freistoß")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "schiedsrichterball")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "strafstoß")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "wiederholung")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "halbzeit")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "spielende")
 {
  $spielstrafenpunkte = 0;
 }
 if ($ort == "weiterspielen")
 {
  $ortspunkte = 0;
 }
 if ($ort == "mittelpunkt")
 {
  $ortspunkte = 0;
 }
 if ($ort == "torraum")
 {
  $ortspunkte = 0;
 }
 if ($ort == "torraumlinie")
 {
  $ortspunkte = 0;
 }
 if ($ort == "strafraumlinie")
 {
  $ortspunkte = 0;
 }
 if ($ort == "eckstoßteilkreis")
 {
  $ortspunkte = 0;
 }
 if ($ort == "seitenlinie")
 {
  $ortspunkte = 3;
 }
 if ($ort == "11_meter_punkt")
 {
  $ortspunkte = 0;
 }
 if ($ort == "hoehe_11_meter_punkt")
 {
  $ortspunkte = 0;
 }
 if ($ort == "gleicher_ort")
 {
  $ortspunkte = 0;
 }
 if ($ort == "(tat-)_ort_des_vergehen")
 {
  $ortspunkte = 0;
 }
 if ($ort == "wo_werfer_stand")
 {
  $ortspunkte = 0;
 }
 if ($ort == "wo_getroffen_wurde/werden_sollte")
 {
  $ortspunkte = 0;
 }
 if ($ort == "Wo_ball_bei_pfiff")
 {
  $ortspunkte = 0;
 }
 if ($ort == "spielende")
 {
  $ortspunkte = 0;
 }
 if ($persoenlicheStrafe == "keine_persoenliche_strafe")
 {
  $persoenlicheStrafepunkte = 1;
 }
 if ($persoenlicheStrafe == "gelb")
 {
  $persoenlicheStrafepunkte = 0;
 }
 if ($persoenlicheStrafe == "gelb/rot")
 {
  $persoenlicheStrafepunkte = 0;
 }
 if ($persoenlicheStrafe == "gelb_und_gelb/rot")
 {
  $persoenlicheStrafepunkte = 0;
 }
 if ($persoenlicheStrafe == "rot")
 {
  $persoenlicheStrafepunkte = 0;
 }
 if ($persoenlicheStrafe == "nur_meldung_moeglich")
 {
  $persoenlicheStrafepunkte = 0;
 }
 if ($persoenlicheStrafe == "spielabbruch")
 {
  $persoenlicheStrafepunkte = 0;
 }
 $total = $spielstrafenpunkte + $ortspunkte + $persoenlicheStrafepunkte;
 if ($total = 9)
 {
  echo"Du hast alles richtig beantwortet!<p>";
  echo"Deine Punktzahl: " . $total;
 } else {
  echo"Du hast etwas falsch beantwortet!<p>";
  echo"Deine Punkte: " . $total;
 }
}
 
?>

Nun aber zu meiner Frage:

Ich möchte die Gesamtpunktzahl (total) in eine Datenbank mit einfließen lassen. Die Datenbank soll den Benutzernamen beinhalten, die Punktzahl und den aktuellen Rang. Heißt, nach Abgabe der Antwort wird die Punktzahl beim dazugehörigen Benutzernamen eingefügt. Der Rang soll sich automatisch anpassen (je nach höhe der Gesamtpunktzahl). Außerdem soll jeder Benutzer nur einmal antworten können.

Es wird mehrere Fragen geben, deshalb sollen sich die Gesamtpunkte aus allen beantworteten Fragen errechnen.

Wie setze ich soetwas in einer Datenbank um?

Vielen Dank

Dany Sahne
 
Danke dabei an Programmier-Felix
Dann sage mal deinem Programmierer, dass dieser if-Marathon grausam ist. Das geht deutlich eleganter:
Langfassung:
PHP:
switch ($spielstrafe)
{
   case "weiterspielen":
   case "abstoß":
   case "anstoß":
   case "eckstoß":
   case "direkter_freistoß":
   case "indirekter_freistoß":
   case "schiedsrichterball":
   case "strafstoß":
   case "wiederholung":
   case "halbzeit":
   case "spielende":
        $spielstrafenpunkte = 0;
        break;
   case "einwurf":
        $spielstrafenpunkte = 5;
        break;
}

switch ($ort)
{
   case "weiterspielen":
   case "mittelpunkt":
   case "torraum":
   case "torraumlinie":
   case "strafraumlinie":
   case "eckstoßteilkreis":
   case "11_meter_punkt":
   case "hoehe_11_meter_punkt":
   case "gleicher_ort":
   case "(tat-)_ort_des_vergehen":
   case "wo_werfer_stand":
   case "wo_getroffen_wurde/werden_sollte":
   case "Wo_ball_bei_pfiff":
   case "spielende":
        $ortspunkte = 0;
        break;
   case "seitenlinie":
        $ortspunkte = 3;
        break;
 }
 
switch ($persoenlicheStrafe)
{
   case "gelb":
   case "gelb/rot":
   case "gelb_und_gelb/rot":
   case "rot":
   case "nur_meldung_moeglich":
   case "spielabbruch":
   case "keine_persoenliche_strafe":
        $persoenlicheStrafepunkte = 1;
        break;
}
Kurzfassung
PHP:
$spielstrafenpunkte = ($spielstrafe == "einwurf") ? 5 : 0;
$ortspunkte = ($ort == "seitenlinie") ? 3 : 0;
$persoenlicheStrafepunkte = ($persoenlicheStrafe == "keine_persoenliche_strafe") ? 1 : 0;
Zum Thema: wo hast die Probleme? Bisher sehe ich nichts, was mit einer Datenbank zu tun hat. Was hast du bisher versucht?
Den Rang in die DB einzutragen, halte ich für Blödsinn. Du müsstest bei jedem Eintrag alle Positionen reorganisieren.
Und wo kommt der Benutzername her?
 
Zuletzt bearbeitet von einem Moderator:
Erst einmal vielen Dank für deine Antwort.

Nur zum Verständnis: Ich kann also diesen Code
PHP:
if ($spielstrafe == "weiterspielen")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "abstoß")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "anstoß")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "eckstoß")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "einwurf")
 {
  $spielstrafenpunkte = 5;
 }
 if ($spielstrafe == "direkter_freistoß")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "indirekter_freistoß")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "schiedsrichterball")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "strafstoß")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "wiederholung")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "halbzeit")
 {
  $spielstrafenpunkte = 0;
 }
 if ($spielstrafe == "spielende")
 {
  $spielstrafenpunkte = 0;
 }
 if ($ort == "weiterspielen")
 {
  $ortspunkte = 0;
 }
 if ($ort == "mittelpunkt")
 {
  $ortspunkte = 0;
 }
 if ($ort == "torraum")
 {
  $ortspunkte = 0;
 }
 if ($ort == "torraumlinie")
 {
  $ortspunkte = 0;
 }
 if ($ort == "strafraumlinie")
 {
  $ortspunkte = 0;
 }
 if ($ort == "eckstoßteilkreis")
 {
  $ortspunkte = 0;
 }
 if ($ort == "seitenlinie")
 {
  $ortspunkte = 3;
 }
 if ($ort == "11_meter_punkt")
 {
  $ortspunkte = 0;
 }
 if ($ort == "hoehe_11_meter_punkt")
 {
  $ortspunkte = 0;
 }
 if ($ort == "gleicher_ort")
 {
  $ortspunkte = 0;
 }
 if ($ort == "(tat-)_ort_des_vergehen")
 {
  $ortspunkte = 0;
 }
 if ($ort == "wo_werfer_stand")
 {
  $ortspunkte = 0;
 }
 if ($ort == "wo_getroffen_wurde/werden_sollte")
 {
  $ortspunkte = 0;
 }
 if ($ort == "Wo_ball_bei_pfiff")
 {
  $ortspunkte = 0;
 }
 if ($ort == "spielende")
 {
  $ortspunkte = 0;
 }
 if ($persoenlicheStrafe == "keine_persoenliche_strafe")
 {
  $persoenlicheStrafepunkte = 1;
 }
 if ($persoenlicheStrafe == "gelb")
 {
  $persoenlicheStrafepunkte = 0;
 }
 if ($persoenlicheStrafe == "gelb/rot")
 {
  $persoenlicheStrafepunkte = 0;
 }
 if ($persoenlicheStrafe == "gelb_und_gelb/rot")
 {
  $persoenlicheStrafepunkte = 0;
 }
 if ($persoenlicheStrafe == "rot")
 {
  $persoenlicheStrafepunkte = 0;
 }
 if ($persoenlicheStrafe == "nur_meldung_moeglich")
 {
  $persoenlicheStrafepunkte = 0;
 }
 if ($persoenlicheStrafe == "spielabbruch")
 {
  $persoenlicheStrafepunkte = 0;
 }

durch diesen
PHP:
$spielstrafenpunkte = ($spielstrafe == "einwurf") ? 5 : 0;
$ortspunkte = ($ort == "seitenlinie") ? 3 : 0;
$persoenlicheStrafepunkte = ($persoenlicheStrafe == "keine_persoenliche_strafe") ? 1 : 0;
ausdrücken? Wenn ich jetzt für mehrere Antworten die Punktzahl verteilen will, müssen die Antworten dann mit Komma oder mit Simikolon abgetrennt werden? Durch den Informatik-Unterricht an der Schule bin ich mir da nicht ganz sicher... :|

Die Benutzernamen kommen aus der Joomla Anmeldung. Die Fragen sind nur für Benutzer sichtbar, d.h. die jeweiligen Benutzernamen sollen eingetragen werden.
Da es ein Tippspiel ist, wäre eine "richtige" Rangliste mit der jeweiligen Platzierung schon wichtig. Ich stelle mir das ungefähr so vor, nur ohne den Punkt Extras.

Wie kann man in den Code mit einfließen lassen, dass die Frage nur einmal beantwortet werden kann?
 
Wenn du z.B. für alle unterschiedlichen Spielstrafen unterschiedliche Punkte verteilen willst, solltest du switch/case nehmen. Im Moment werden nur 2 unterschiedliche Punktzahlen verteilt, dafür reicht dann die Kurzfassung.

Zur Rangliste: Willst du für einen User die Platzierung anzeigen oder dem User eine Liste aller Platzierungen anzeigen? Beides lässt sich mit der entsprechenden DB-Abfrage regeln.

Da du einen festen Usernamen hast, kannst du in einer Tabelle festhalten, welche Fragen der User schon beantwortet hat und somit eine Wiederholung ausschließen.
 
Ok, dann reiht ja die Kurzfassung, da die Punktzahlen immer bei zwei bleiben. Lediglich die Anzahl der korrekten Antworten kann noch zunehmen. Diese werden dann durch ein Simikolon voneinander getrennt, richtig?

Ich möchte den Usern eine Tabelle mit alle eingetragenen Teilnehmern mit deren Punktzahl anzeigen.

Leider kenne ich mich mit MySQL oder anderen Datenbanken wenig aus, einfach deshalb, weil ich noch nie damit gearbeitet habe.
Es muss ja eigentlich eine neue Tabelle in der Datenbank erstellt werden, in der das Joomla System liegt. Diese muss id, benutzername, punktzahl und rang als spalten enthalten. Dann muss über die php Datei die Punktzahl zu jeweiligen User addiert werden. Damit eine erneute Antwort ausgeschlossen ist, muss ich eine neue Tabelle anlegen, in welcher die Benutzer mit den jeweilig bereits beantworteten Fragen hinterlegt ist.

Wie lege ich die ganzen Sachen an???

Vielen Dank
 
Ok, dann reiht ja die Kurzfassung, da die Punktzahlen immer bei zwei bleiben. Lediglich die Anzahl der korrekten Antworten kann noch zunehmen. Diese werden dann durch ein Simikolon voneinander getrennt, richtig?
Ich glaube, die Langfassung mit switch/case ist für dich die bessere Alternative
Diese muss id, benutzername, punktzahl und rang als spalten enthalten.
Nochmal: den Rang zu speichern ist Quatsch, der ergibt sich aus der Punktzahl!
Dann muss über die php Datei die Punktzahl zu jeweiligen User addiert werden. Damit eine erneute Antwort ausgeschlossen ist, muss ich eine neue Tabelle anlegen, in welcher die Benutzer mit den jeweilig bereits beantworteten Fragen hinterlegt ist.
Dafür brauchst du nur eine Tabelle, nicht für jeden User eine eigene!
Wie lege ich die ganzen Sachen an???
Mit phpMyAdmin solltest du das hinbekommen.
 
Moin Moin,

vielen Dank erstmal.

Leider gibt dein Formular aus irgend einem Grund immer die volle Punktzahl. Woran kann das liegen?

Zur Speicherung:
Ich habe nun mit den 2 folgenden Codes eine Datentabelle erstellt.

PHP:
<?

$dbname="huhu";

$dbhost="localhost";

$dbuser="huhu";

$dbpass="huhu";

mysql_connect($dbhost,$dbuser,$dbpass);

mysql_select_db($dbname);

?>
und
PHP:
<?

include ("db.php");

mysql_query("CREATE TABLE rangliste (

id int(255) NOT NULL auto_increment,

username varchar(100) NOT NULL,

punktzahl varchar(100) NOT NULL,

PRIMARY KEY (id) );");

mysql_close();

 

echo "Die Tabelle wurde angelegt";

?>

Dafür bekomme ich auch eine Erfolgsmeldung, die Tabelle ist also da.

Wie kann ich jetzt Daten in der Tabelle speichern, denn so
PHP:
         <!-insert.php->
       <html>
       <body>
       <?PHP
       if ($button==" OK ") {
        include("db.php");
        mysql_query("INSERT INTO
        cds(titel,interpret)VALUES('$titel','$interpret')");
        mysql_close();
        ?>
        Die Daten wurden eingetragen<br>
        <a href="insert.php">neuer Eintrag</a><br>
        <a href="fetcharr.php">zur Übersicht</a>
        <?PHP
       } else { ?>
        <form method="post" action="insert.php">
        <input type="text" name="interpret" value="interpret"><br>
        <input type="text" name="titel" value="titel"><br>
        <input type="submit" name="button" value=" OK ">
        </form>
        <?PHP
       } ?>
       </body>
       </html>
geht es nicht.

Kannst du mir einen Code zur Verfügung stellen, der die 2 Felder ausfüllt?

Eine Darstellung der Tabelle habe ich bereits hinbekommen.

Wäre wirklich super, wenn du das so machen könntest.

LG

Dany Sahne

P.S. Muss bei deinem langen Code nich vor
PHP:
case "keine_persoenliche_strafe":
noch
PHP:
$persoenlicheStrafepunkte = 0;
        break;
?
 
Puuuhhhh, lern' doch bitte mal die Grundlagen!! :(
PHP:
if ($button==" OK ")
Damit wirst du kein Glück haben, versuche es besser mal mit
PHP:
if (isset($_POST['button']))
Genauso musst du auch auf Titel und Interpret zugreifen. Weiterhin sollten die Daten durch mysql_real_escape_string gejagt werden.

Und bevor es jemand anderes schreibt, die MySQL-Schnittstelle ist veraltet, nutze die MySQLli- oder PDO-Schnittstelle
 
Auf jeden Fall zeigt er mir immer an, dass ich die volle Punktzahl erreicht habe. Sowohl bei meinem ursprünglichen, als auch bei deinen 2 Formularen. Woran kann das liegen?
 
Woran kann das liegen?
An einem Fehler im Script.

Richtig debuggen

1.Man bemerkt, dass ein Skript nicht das tut, was es soll.
2.Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(E_ALL);
3.Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
4.Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
5.An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysql_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
6.Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
7.Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
8.Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
9.Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
 
Zurück
Oben