Vote verrechnet sich! Warum?

Eiszwerg

Erfahrenes Mitglied
Ich habe ein mir seinerzeit einen Vote gebastelt.
Mittlerweile muss ich feststellen, dass dieser sich gerne mal verrechnet.
Die Tabelle mit den Ergebnissen ist folgendermaßen aufgebaut:
id 1
frage Duschen oder Baden?
antworten Baden rocks! | Duschen ist geil!
klicks 2|3
gesamt 5

Nun kommt es leider, und den Grund dafür suche ich, dass bei klicks 2|3|1|1| drin steht und bei gesamt das Ergebnis 7.
Kann mir jemand verraten wo ich falsch denke bzw. wo der Hund begraben liegt?

Formular zum Vote:
Code:
 while ($Ausgabe = mysql_fetch_array ($result))          //Auslesen der o.g. Daten                   
  {
    echo"<table>";
    echo "<tr><td><b>$Ausgabe[frage]</b></td></tr>";          //Frage des Votes ausgeben
    $antwort=explode("|",$Ausgabe[antworten]);          //Die Antworten zerlegen
    $z=0;
    foreach ($antwort as $antwort){
      if ($z=="0"){
      echo"<tr><td><input type=\"radio\" value=\"$z\" name=\"wert\" checked>$antwort</td></tr>";         
      }else echo"<tr><td><input type=\"radio\" value=\"$z\" name=\"wert\">$antwort</td></tr>";          //Radio-Buttons mit der entsprechenden Antwort und dem Wert Z erstellen, wobei der erste Radio (z=0) gecheckt wird
      $z++;
    }
  }

Auswerten des Formulars:
Code:
$result = mysql_db_query ($db, $dbanfrage);          //Query an DB
$inhalt = mysql_fetch_array ($result);          //Daten aus Query
$vote[votes] = explode("|", $inhalt[klicks]);          //die o.g. Spalte Klicks zerlegen
$vote[votes][$wert]++;          //den gecheckten Wert um 1 erhöhen 
$vote[votes] = implode("|", $vote[votes]);          //alle Werte wieder zusammenführen 
$inhalt[gesamt]++;           //Gesamtwert um 1 erhöhen
$rein=mysql_query("UPDATE $table1 SET klicks = '$vote[votes]', gesamt = '$inhalt[gesamt]' WHERE aktiv='1'");           //Werte zurückschreiben
 
Zuletzt bearbeitet:
Hab nun eingeforderte Kommentare addiert.
Vielleicht kann mir ja jetzt jemand nen Tipp geben oder mich auf einen Denkfehler hinweisen.
Danke!
 
Eiszwerg hat gesagt.:
Nun kommt es leider, und den Grund dafür suche ich, dass bei klicks 2|3|1|1| drin steht und bei gesamt das Ergebnis 7.
Kann mir jemand verraten wo ich falsch denke bzw. wo der Hund begraben liegt?
Abgesehen von einem überflüssigen „|“ am Ende von klicks kann ich hier keinen Fehler erkennen. Was genau stimmt denn deiner Meinung nach an den Daten nicht?
 
Wenn ich 2 Antworten habe, dann dürften doch auch nur 2 Werte bei "klicks" stehen und nicht noch zusätzlich die |1|1| ...
Wie von Dir erwähnt, ist der letzte | ebenso eigenartig.

Meine Überlegung ging schon dahin, dass evtl. 2 User gleichzeitig abstimmen, allerdings kann ich mir nicht vorstellen, dass diese exakte Synchronität in annehmbaren Chancen auszudrücken ist.
 
Ach so, das Beispiel bezog sich auf den angegebenen Datensatz. Das ging irgendwie aus dem Ursprungsbeitrag nicht klar hervor.

Ich kann jetzt auf Anhieb leider keinen Fehler in deinem Quellcode entdecken (abgesehen davon, dass ich einiges anders machen würde). Du könntest aber zu Debug-Zwecken den Inhalt des Arrays $vote['votes'] (Schlüssel und Werte) nach der Inkrementierung in eine Datei speichern lassen. Dadurch könnte man dem Fehler auf die Schliche kommen.
 
Also ich habe nun mal ein wenig rumprobiert und bin zu dem Ergebnis gekommen, dass man das Ergebnis beeinflussen kann, wenn man die entsprechende Datei mit dem unteren Quellcode aufruft und gleichzeitig an die URL zB ?wert=2 anhängt.

Muss ich davon ausgehen, dass ich Opfer einer Sabotage bin :eek:

Naja, werde mir da was überlegen, um den Fehler auszugrenzen und beobachten, ob sich das Mysterium fortsetzt.

Danke an die Beteiligten!!
 
Ja, das kann gut sein. Ich sehe grade, dass du wohl mit aktiviertem register_globals arbeitest. Stattdessen solltest du auf die superglobalen Arrays $_POST und $_GET zurückgreifen. Außerdem wäre eine Überprüfung sämtlicher Benutzerangaben (Formulardaten) angebracht. In diesem Fall würde es sich anbieten, bei jeder Stimmabgabe den entsprechenden Formularwert via [phpf]intval[/phpf] in eine Ganzzahl zu konvertieren und eine Bereichsprüfung (liegt der Wert zwischen eins und der Anzahl der Antwortmöglichkeiten?) durchzuführen. Das sollte dein Script schon mal um einiges robuster machen.
 
intval() ist mir bisher unbekannt.
Werde mich damit mal auseinandersetzen...
Vielen Dank :)

Ja, ich hab register_globals auf On :-/
Komme einfach nicht dazu die scripte umzuschreiben... :(
 
Zurück