Manu3l: Button soll sich selbst verlinken

Hallo,

ich möchte, dass sich ein Button selbst verlinkt (evtl. über variable?), aber hier erst einmal mein Ausgangslage:

Ich habe eine Seite1.php auf der ich versch. Buttons angelegt habe. "Neuen Poll erstellen", "Poll1", "Poll2"

Wenn der Besucher einen neuen Poll (Umfrage) erstellt funktioniert auch soweit alles. Er legt bei SQL eine neue Tabelle an, füllt diese mit den Umfragewerten aus usw. Somit erstellt der Besucher eine neue Umfrage über mehrere PHP-Seiten. Wenn er sich komplett durchgeklickt hat, wird er automatisch auf Seite1.php weitergeleitet.

Nun möchte ich aber, dass der Button "Poll1" die Daten der letzten angelegten Umfrage (z.B. Lieblingsfarbe) automatisch aufrufen kann und natürlich sollte auch die Beschriftung auf dem Button von "Poll1" durch "Lieblingsfarbe" ersetzt werden. (evtl. auch mittels edit-Button) Aber irgendwie habe ich keine Idee, wie ich dies anstellen sollte. Woher weiß die darauf folgende Seite welche Umfrage sie aus welcher Tabelle abrufen soll?

Wenn eine weitere Umfrage erstellt wird, soll diese auf dem Button "Poll2" angezeigt werden.

Stehe da irgendwie auf dem Schlauch. Habt ihr eine Idee?

Danke schon mal!

Manuel

  1. Hallo Manu3l,

    Woher weiß die darauf folgende Seite welche Umfrage sie aus welcher Tabelle abrufen soll?

    Indem du alle Umfragen des Nutzers in der Datenbank abfragst und nach dem Datum ordnest?

    Bis demnächst
    Matthias

    --
    Pantoffeltierchen haben keine Hobbys.
    ¯\_(ツ)_/¯
    1. Das ist schon klar, aber woher weiß Button "Poll1" dass er die Tabelle Lieblingsfarbe aufrufen soll? Ich möchte nicht jedes mal, wenn ein Benutzer eine neue Umfrage anlegt, per Hand die Seite1.php Seite editieren müssen, nur damit der Button danach weiß, was er machen soll.

      Wenn ich als Admin die Umfrage erstelle, kann ich ja problemlos die Daten aus der Tabelle auslesen lassen, aber ich möchte eben, dass der normale Benutzer eine Umfrage erstellt und sie dann anderen zur Verfügung stellt.

      1. Hallo Manu3l,

        es scheint, als wäre dein Datenmodell schräg.

        Du solltest eigentlich zwei Tabellen haben:

        1. umfrage_index, mit Spalten für umfrage_id und titel

        2. umfrage_daten, mit einer Spalte umfrage_id als Fremdschlüssel, und den Spalten, die Du jetzt auch schon in deine Umfrage-Tabellen einsetzt.

        Die Übersichtsseite kann den umfrage_index auslesen und damit die Einstiegs-Links für die vorhandenen Umfragen erzeugen. Die ausgewählte ID wird als URL-Parameter übergeben.

        Zur Darstellung einer Umfrage verwendest Du diesen URL-Parameter, um die zugehörigen Zeilen der umfrage_daten Tabelle auszuwählen.

        Beim Anlegen einer neuen Umfrage erzeugst Du KEINE neue Table in deiner DB, sondern nur eine neue Zeile im umfrage_index und entsprechende neue Zeilen in umfrage_daten.

        Rolf

        --
        sumpsi - posui - clusi
        1. Hallo Rolf B,

          ja, das habe ich tatsächlich jetzt noch angepasst. Habe jetzt 3 Tabellen:

          • polls = Hier werden alle neuen Umfragen eingetragen
          • poll_entries = Hier werden alle "Parameter - Auswahlmöglichkeiten" eingetragen
          • poll_entry_votes = Hier werden die Benutzer abgespeichert wer und wann jemand abgestimmt hat

          Ich habe mit folgendem Script:

          // Auswahlmöglichkeiten der Umfrage laden
          $sql = "SELECT * FROM poll_entries WHERE poll_id=".$poll["id"];
          $result = $db->query($sql);
          $while ($entry = $result->fetch_array(MYSQLI_ASSOC)) 
          
          	{
          
          ?>		
          <form action="poll_absenden.php" method="post">
          <?php
          
          echo '<input type="radio" id="'.$entry['entry_id'].'" name="'.$entry['poll_id'].'" value="'.$entry['name'].'">'.$entry['name'].'<br>';
          
          	}
          	
          ?>
          <input type="submit" name="absenden" value="absenden">
          </form>
          

          folgende Ausgabe:

          Poll Ausgabe

          Nun möchte ich über den "absenden" Button, das Ergebnis in meine MYSQL-Datenbank eintragen lassen, bzw evtl vorher als echo ausgeben.

          Leider bekomme ich es nicht hin, dass meine Folgeseite "poll_absenden.php" erkennt, was ich ausgewählt habe. Ich habe es mit dem unterstehenden versucht, aber leider funktioniet das so nicht. Aber wenn ich mich auf "name" des radiobuttons beziehe, müsste es eigentlich so ähnlich heißen?!?

          if (isset($_POST['absenden']))
          	{
          	if (isset ($_POST['.$entry['poll_id'].']))
          		{
          		if ($_POST['.$entry['poll_id'].'])
          			{
          			echo $POST_.$entry['name'].;
          			}
          		}
          	}
          

          Kann mir da jemand weiterhelfen? Ich weiß, ist relativ viel zu lesen, aber anders kann ich es glaube ich nicht vollständig genug erklären...

          Danke!

          Manuel

          1. Lieber Manu3l,

            if (isset($_POST['absenden']))
            	{
            	if (isset ($_POST['.$entry['poll_id'].']))
            		{
            		if ($_POST['.$entry['poll_id'].'])
            			{
            			echo $POST_.$entry['name'].;
            			}
            		}
            	}
            

            da stehen jetzt ein paar geschossene Böcke drin. Was genau ist z.B. $_POST['.$entry['poll_id'].']? Schau Dir doch einmal an was print_r($_POST) in einem solchen Fall ausspuckt. Dort siehst Du, wie die Array-Schlüssel wirklich lauten. Dann kannst Du auf ihr Vorhandensein prüfen (isset) und ihren Wert verarbeiten.

            Merke Dir, was Du da wirklich tust: Du hantierst mit Arrays und ihren Schlüsseln. Ein Array kannst Du anhand des Variablennamens "anfassen", also z.B. $_POST, aber auch jeden beliebigen anderen Variablennamen. Das $_POST-Array ist ein besonderes.

            Wenn Du auf diverse Einträge in einem Array zugreifen willst, dann über ihren Schlüssel. In PHP darf der (fast) beliebig lauten. Dazu notierst Du nach dem Variablennamen diese beiden eckigen Klammern: $_POST['a'] oder $_POST[192] - wobei aus PHP-Sicht der Array-Schlüssel immer ein String sein muss (Zahlen sind OK, da man sie als String notieren kann).

            Willst Du nun einen Array-Schlüssel anhand einer anderen Variable haben (z.B. $key), dann geht das so: $_POST[$key]. Manchmal muss man verschachteln, weil man aus einem anderen Array einen Wert benötigt, der jetzt als Schlüssel fungieren soll: $_POST[$my_array[$key]]

            Was also genau meinst Du mit echo $POST_.$entry['name'].;?

            Liebe Grüße

            Felix Riesterer

            1. Stimmt... mit print_r($_POST) kann ich mir die Daten ausgeben. Da hätte ich schon gemerkt, dass ich den namen des absenden Buttons bekomme, also "absenden" anstatt einer Auswahlmöglichkeit.

              Mit echo $POST_.$entry['name']. wollte ich mir z.B. Pizza ausgeben lassen. Hier fehlen eckige Klammern)

              Leider tue ich mich mit Arrays sehr schwer. Bin immer am verzweifeln, auf welchem Weg ich denn nun die gewünschte Angabe ausgegeben bekomme.

              Wenn ich mir selbst das Array anlege, z.B. mit:

              $essen[] = "Pizza"; 
              $essen[] = "Spaghetti"; 
              $essen[] = "Ravioli"; 
              $essen[] = "Steak";   
              
              
              print_r ( $essen );
              
              // oder
              
              print_r [Pizza]
              

              ist alles relativ klar. Aber dadurch, dass meine Umfrage durch den Benutzer angelegt werden, wird alles relativ schwierig und unübersichtlich.

              1. Lieber Manu3l,

                ist alles relativ klar. Aber dadurch, dass meine Umfrage durch den Benutzer angelegt werden, wird alles relativ schwierig und unübersichtlich.

                okay, Du benötigst also noch etwas Übung in verschachtelten Arrays wie z.B:

                $entry = array(
                  'poll_id' => 'abcde',
                  'essen' => array(
                    'Pizza',
                    'Ravioli',
                    'Saumagen',
                    'Döner'
                  ),
                  'options' => array(
                    'public' => 1,
                    'open' => 0,
                    'e-mail-notifications' => 1
                  )
                );
                

                Liebe Grüße

                Felix Riesterer

          2. 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
            1. Lieber Rolf,

              nur als Ergänzung:

              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.

              man kann das auch in die URL schreiben, sodass die Seite in ihrer URL die poll_id enthält:

              1. example.org/polls/index.php?poll_id=abcde
              2. example.org/polls/index.php/abcde
              3. mit URL-Rewriting (Servereinstellung) sogar example.org/polls/abcde

              Bei 1. steht die poll_id im $_GET-Array unter $_GET['poll_id'] zur Verfügung. Man kann also mit den für Arrays üblichen Methoden prüfen, ob dieser Schlüssel existiert und ob der darunter enthaltene Wert eine gültige ID ist.

              Bei 2. muss man sich die poll_id mit Stringfunkionen aus $_SERVER['REQUEST_URI'] herauslösen. Das ist vielleicht nicht trivial, aber genau so möglich.

              Für 3. benötigt man fortgeschrittenere Einstellungsmöglichkeiten, die "intern" die URL so behandeln, dass das eigentliche PHP-Script aufgerufen wird, anstatt dass der Server nach einer Datei mit dem Namen der poll_id sucht.

              Liebe Grüße

              Felix Riesterer

            2. Hallo Rolf,

              erst einmal Danke für die ausführliche Antwort! Wegen deiner Antwort hab ich es hinbekommen!

              Zu 1: Ja das $-Zeichen ist hier falsch. Keine Ahnung wie das beim kopieren hier in meinen Post kam. Im Script ist es nicht, hab extra gerade noch einmal nachgeschaut.

              Zu 2: SELECT entry_id, poll_id, name FROM ... werd ich anpassen

              Da evtl noch jemand dieses Problem hat, anbei noch mein Code auf der "Auswahlseite":

              // Auswahlmoeglichkeiten der Umfrage laden
              	$sql = "SELECT entry_id, poll_id, name FROM poll_entries WHERE poll_id=".$poll["id"];
              	$result = $db->query($sql);
              
              ?>	
              	<form action="poll_absenden.php" method="post">
              <?php
              	while ($entry = $result->fetch_array(MYSQLI_ASSOC)) 
              		{	
              ?>  
              		<label>
              			<input type="radio" name="vote" value="<?= $entry['entry_id']; ?>"> <?= htmlspecialchars($entry['name']); ?>
              		</label><br>
              <?php
              		}
              ?>
              	<input type="text" name="user" /> Gib hier deinen namen ein<br />
              	<input type="submit" name="absenden" value="absenden">
              	<input type="hidden" name="poll_id" value="<?= $poll['id'] ?>">
              	</form>
              

              und noch auf der nächsten Seite:

              // Login ueber login_db.php
              	include ("login_db.php");
              
              	
              	//Variablen
              	$poll_id = filter_input(INPUT_POST, 'poll_id');
              	$poll_vote = filter_input(INPUT_POST, 'vote');
              	$user = $_POST["user"];
              
              
              	// Anlegen der Abstimmung mit Namen
              	$eintrag = "INSERT INTO `poll_entry_votes` (`vote_id`, `entry_id`, `user`, `time`) VALUES (NULL, '$poll_vote', '$user', CURRENT_TIMESTAMP)";
              	$eintragen = mysqli_query($db, $eintrag);  
              
              
              	// Verbindung zum Datenbankserver beenden
              	$db->close();
              
              
              	echo "Danke $user. <br /> 
              	Deine Antwort wurde gespeichert!";
              
  2. Lieber Manu3l,

    ich habe mir ein Umfragenscript gebastelt, das ich Dir gerne zugänglich machen kann. Es ist noch nicht 100%ig fertig, aber für den Alltagsgebrauch vollständig einsatzbereit. Am Wochenende kann ich es Dir zukommen lassen - wenn Du mir eine Mail schickst.

    Wenn mein Script fertig ist, werde ich es als freie Software veröffentlichen.

    Liebe Grüße

    Felix Riesterer

    1. Mail ist raus 😉

      Dennoch würde es mich interessieren, wie das mit dem Button funktionieren soll 😀

      Manuel

      1. Lieber Manu3l,

        Mail ist raus 😉

        OK, Samstag solltest Du eine ZIP-Datei mit meinem Script haben. Dann kannst du sehen, wie ich das gemacht habe.

        Dennoch würde es mich interessieren, wie das mit dem Button funktionieren soll 😀

        Meiner Meinung nach ist Dein Denkmodell an dieser Stelle völlig ungeeignet. Aber bevor ich hier am Tablet noch lange herumtippe, sende ich Dir lieber meine Lösung als Beispiel zur Inspiration.

        Liebe Grüße

        Felix Riesterer