PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Voting Tool mit Check boxen


mrpinkswife
18.01.2007, 01:18:09
Hallo,

ich habe folgendes Problem:
Es geht um ein Voting Tool, der User hat die Möglichkeiten über Checkboxen mehere Antworten auszuwählen.
(mir ist klar, dass es bei den Auswahlmöglichkeiten bad, normal, good und geht Mehrfachmeldungen Schwachsinn sind. Das sind noch Platzhalter für ausfürliche Möglichkeiten)

Der Code ist auf drei Files verteilt.
Ein File für die Eingabe:

<form action="vote.php" method="post">
<table>
<tr>
<td> <input type="checkbox" name="vote" value="0" > </td>
<td> Bad </td>
</tr>
<tr>
<td> <input type="checkbox" name="vote" value="1"> </td>
<td> Normal </td>
</tr>
<tr>
<td> <input type="checkbox" name="vote" value="2"> </td>
<td> Good </td>
</tr>
<tr>
<td> <input type="checkbox" name="vote" value="3"> </td>
<td> Geht so </td>
</tr>
<tr>
<td colspan="2"> <input type="submit" value="Submit"> </td>
</tr>
</table>
</form>






eins zum Einlesen und Einschreiben in eine Textfile:


<?
$vote = $HTTP_POST_VARS['vote'];

$filename = "txt/vote.txt";

$content = file($filename);

$array = explode("||", $content[0]);

$bad = $array[0];
$normal = $array[1];
$good = $array[2];
$geht = $array[3];

if($vote == 0) $bad = $bad + 1;
if($vote == 1) $normal = $normal + 1;
if($vote == 2) $good = $good + 1;
if($vote == 3) $geht = $geht + 1;

$insertvote = $bad."||".$normal."||".$good."||".$geht;

$fp = fopen($filename,"w");
fputs($fp,$insertvote);
fclose($fp);

header("Location: stats.php");

?>






und eins für die Ausgabe, um die Daten in verschiedenen Statistiken auszugeben:


...$filename = "txt/vote.txt";

//get content of textfile
$content = file($filename);

$array = explode("||", $content[0]);

$bad = $array[0];
$normal = $array[1];
$good = $array[2];
$geht = $array[3];

?>
Votes:
<br>
<table>
<tr>
<td width="60">Normal</td>
<td><? echo($normal); ?></td>
</tr>
<tr>
<td>Bad</td>
<td width="60"><? echo($bad); ?></td>
</tr>
<tr>
<td>Good</td>
<td width="60"><? echo($good); ?></td>
</tr>
<tr>
<td>Geht</td>
<td width="60"><? echo($geht); ?></td>
</tr>
</table>
...



Das Script funktioniert auch soweit wunderbar, solange man nur eine Checkbox ankreuzt. Sobald mehrere Checkboxen ausgewählt werden, wird nur die letzte Checkbox ausgewertet. Würde mich wirklich freuen, wenn mir geholfen werden könnte. Bin schon stundenlang auf der Suche nach einer doch einfachen Lösung.


Vielen Dank im voraus

Franzx
18.01.2007, 08:17:57
Moin, moin,

folgender Bereich
<form action="vote.php" method="post">
<table>
<tr>
<td> <input type="checkbox" name="vote" value="0" > </td>
<td> Bad </td>
</tr>
<tr>
<td> <input type="checkbox" name="vote" value="1">
....
</form>
ist "eigentlich" ein Dropdown Formfeld. Jedes INPUT-Feld hat die gleiche Bezeichnung. Also ein Dropdownfeld hat eine Bezeichnung mit mehreren Wahlmöglichkeiten, liefert aber nur ein Ergebnis.

Ich würde es, wenn schon so, wie folgt machen:
<form action="vote.php" method="post">
<table>
<tr>
<td> <input type="checkbox" name="vote1" value="1" > </td>
<td> Bad </td>
</tr>
<tr>
<td> <input type="checkbox" name="vote2" value="1">
....
</form>


if($vote1 == 1) $bad = $bad + 1;
if($vote2 == 1) $normal = $normal + 1;
if($vote3 == 1) $good = $good + 1;
if($vote4 == 1) $geht = $geht + 1;


cu,
Franzx
Nicht getestet aber sollte gehen.

KTB
18.01.2007, 08:37:13
Mach aus dem vote ein Array, also vote[]
Dann kannst du die Werte auslesen und somit zuordnen.

panametrics
18.01.2007, 12:45:21
<form action="vote.php" method="post">
<table>
<tr>
<td> <input type="checkbox" name="vote[]" value="0" > </td>
<td> Bad </td>
</tr>
<tr>
<td> <input type="checkbox" name="vote[]" value="1"> </td>
<td> Normal </td>
</tr>
<tr>
<td> <input type="checkbox" name="vote[]" value="2"> </td>
<td> Good </td>
</tr>
<tr>
<td> <input type="checkbox" name="vote[]" value="3"> </td>
<td> Geht so </td>
</tr>
<tr>
<td colspan="2"> <input type="submit" value="Submit"> </td>
</tr>
</table>
</form>


Ändere deine Attrib name auf name="vote[]", um ein Array daraus zu machen.

Beim einlesen könntest Du dann so vorgehen: (mal eben schnell zusammengetippt!, bitte abändern!!!)

foreach($vote as $k => $option)
{
if( $option == "1" )
{
# Erhöhe Option 1 um Wert 1 ....
$bad = $bad++;
}
if( $option == "2" )
{
# Erhöhe Option 2 um Wert 1....
$good = $good++;
}
# usw...
}

meikel (†)
18.01.2007, 13:09:05
if($vote == 0) $bad = $bad + 1;
if($vote == 1) $normal = $normal + 1;
if($vote == 2) $good = $good + 1;
if($vote == 3) $geht = $geht + 1

SWITCH-CASE kommt wohl erst in der nächsten Klasse dran? <grrr>

$bad = $bad++;
Das ist Quark. $bad++;

foreach($vote as $k => $option)
{
# usw...
}
Wie wärs damit
foreach($_POST['vote'] as $k => $option)

$_POST ist bei einem POST Request von der ersten bis zur letzten Scriptzeile gültig. Man kann sich also sinnfreie Zuweisungen wie $vote = $_POST['vote'] sparen.
Da aber $_POST['vote'] nur dann existiert, wenn minstens eine Checkbox angeklickt wurde, muß das vorher geprüft werden. Sonst meckert foreach, weil das Array fehlt.

if (! isset($_POST['vote']))
$_POST['vote'] = array();
foreach($_POST['vote'] as $k => $option)
{
switch($option)
{
case 1:
$bad++; break;
case 2:
$good++; break;
}
}
Damit PHP nicht meckert, müssen $bad und $good VORHER initialisiert werden. ZB.:
$bad = 0;

panametrics
18.01.2007, 13:22:47
@meikel,
ich initialisiere meist am Anfang der Seite gleich alles was ich brauch, mit bsp.
$vote = $_GET['vote'];

deswegen hab ich es hier vergessen anzumerken ;-)
Auch ich hab register_global = off, da ich es persönlich sicherer finde!

Und hmm, switch, ja, das ist erst in der nächsten Klasse dran, bin doch noch Baumschüler ;-)

Tom

meikel (†)
18.01.2007, 14:02:16
@meikel,
ich initialisiere meist am Anfang der Seite gleich alles was ich brauch, mit bsp.
$vote = $_GET['vote'];
Wieso GET? Is das kein POST Formular?

Und hmm, switch, ja, das ist erst in der nächsten Klasse dran, bin doch noch Baumschüler ;-)
http://de3.php.net/switch

panametrics
18.01.2007, 14:53:16
mit dem $_GET war nur ein Beispiel...
und der Baumschüler: Scherz... ;-)

Danke dir!
Tom

mrpinkswife
18.01.2007, 19:40:48
Danke erstmal für die vielen Antworten,

habe es sogleich versucht, allerdings hat es immernoch nicht funktioniert.
Mir gefällt die Idee mit dem Array besser, aber ich weiß nicht, in wie weit ich nun die folgenden Zeilen verändern muss.

$bad = $array[0];
$normal = $array[1];
$good = $array[2];
$geht = $array[3];


soll es jetzt so heißen?:

$bad = 0;
$normal = 0;
$good = 0;
$geht = 0;


Bin ein wenig überfordert.
Würde mich deshalb über eine Antwort freuen...