Rolf B: Button soll sich selbst verlinken

Beitrag lesen

Hallo Manu3l,

es gibt eine Menge zu sagen...

Nr 1:
Das Dollar vor $while war sicher ein Tippfehler, oder? Wenn nicht - was ist das? Alle Fehler unterdrücken geht mit @, und es wäre ohnehin sinnvoll, gezielt abzufragen ob $result FALSE ist (in dem Fall ist der query-Aufruf schiefgegangen).

Nr 2:
SELECT * schreibt man in phpmyadmin, aber nicht in einem Programm. In Programmen listet man die Spalten, die man haben will, explizit auf. Das hilft anderen beim Lesen deines Codes. Also: SELECT entry_id, poll_id, name FROM .... Wobei Du die poll_id gar nicht lesen musst. Die steht schon in $poll['id'] drin, und damit kannst Du auch deine Radiobuttons aufbauen.

Nr 3:
Du hast einen Fehler in deiner Schachtelung. Das <form> Tag steht in der while-Schleife, und das heißt, dass dein HTML nachher eine Menge <form> Tags hat, aber nur ein </form> dazu. Das ist falsch, das <form> muss vor das while. Das Input-Element kannst Du dann durch Rückkehr in den HTML-Modus erzeugen, und du solltest Radiobutton und Text durch ein <label> Element zusammenbinden, damit ein Screenreader das korrekt darstellt. Die ID am Radiobutton kannst Du auch weglassen, es sei denn, du willst mit einer Hash-URL darauf positionieren oder mit JavaScript darauf zugreifen. Durch das <label> kannst Du auch auf <br> verzichten, du musst nur im CSS dafür sorgen, dass ein label die display:block Eigenschaft bekommt. Was man in solchen Mischungen von PHP und HTML auch verwenden sollte, ist die "alternative Syntax" für die PHP Block-Konstrukte. Hier: while (blabla): und am Ende ein endwhile; Das sieht man besser als ein heimliches }.

Die Frage ist dann noch, ob man als value des Radiobuttons den Namen nehmen soll, oder vielleicht besser die entry_id? Mit der ID dürfte die spätere Zuordnung in poll_entry_votes einfacher sein.

Die weitere Frage ist, ob man unbedingt $poll['id'] als name verwenden soll. Hast Du mehrere Umfragen auf einer Seite? Wenn ja, ok, dann muss das so sein. Wenn nicht, damm sollten die Radiobuttons einfach name="vote" bekommen.

<form action="poll_absenden.php" method="post">
<?php
while ($entry = $result->fetch_array(MYSQLI_ASSOC)) :
?>  <label>
       <input type="radio" name="<?= $poll['id'] ?>" value="<?= $entry['name']?>"> <?= htmlspecialchars($entry['name']) ?>.'</label>';

	endwhile;
?>
<input type="submit" name="absenden" value="absenden">
</form>

<?= ... ?> ist der Schnellausstieg nach PHP und ist gleichbedeutend mit <?php echo ...; ?>.

Nr 4:
Nachdem Du dein Formular zum Browser gesendet hast, endet dein PHP Script. Wenn die Antwort kommt, weißt Du nicht mehr, welcher Poll das war. Das musst Du Dir merken. Entweder am Server, dazu dient $_SESSION (und du solltest Dir dann vorher anschauen wie Sessions in PHP funktionieren). Oder im Browser, dafür verwendet man <input type="hidden" name="poll_id" value="<?= $poll['id'] ?>">, das dem form hinzugefügt wird. Wenn der POST zurückkommt, kannst DU den Wert verwenden, um das Vote zu speichern. Kleiner Nachteil der type=hidden Speicherung ist, dass der User im Browser herummanipulieren und Dir eine andere ID unterschieben kann, als Du geschickt hast. Wenn Du das verhindern willst, musst Du Sessions verwenden oder die Daten, die im Form gespeichert sind, verschlüsseln.

Das Auslesen des Vote ist am einfachsten, wenn die Radiobuttons name="vote" haben. Wenn auf einer Seite mehrere Votes gleichzeitig sind, dann musst Du Dir auch mehrere poll_id merken - darauf gehe ich aber nur ein wenn Du das brauchst.

Das Auslesen einer $_POST-Variablen ist mit isset() mühsam, es gibt eine Funktion in PHP die das für Dich macht: filter_input. Schau Dir die verfügbaren Filter an (als 3. Parameter), da gibt's eine Menge. Lässt man den 3. Parameter weg, ist das wie FILTER_UNSAFE_RAW, der Wert wird also 1:1 durchgelassen.

Also, der Empfang des POST müsste so aussehen:

   if (isset($_POST['absenden']) {
      $poll_id = filter_input(INPUT_POST, 'poll_id');
      $poll_vote = filter_input(INPUT_POST, 'vote');

      if ($poll_id != NULL && $poll_vote != NULL) {
         // - Prüfe ob es die poll_id und den unter poll_vote 
         //   angegebenen Eintrag wirklich gibt
         // - Speichern
      }
   }

Nr 5: Du hast das hier probiert: $_POST['.$entry['poll_id'].']. Das ist kein PHP. Man baut Statements nicht wie einen String zusammen. Was Du möchtest, sieht so aus: $_POST[$entry['poll_id']]. Aber mit dem, was ich Dir sonst geschrieben habe, brauchst Du das vermutlich gar nicht.

Rolf

--
sumpsi - posui - clusi