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

Werte von allen dynamischen Buttons übergeben

joergi

Mitglied
Hi,

ich bin am verzweifeln und komme seit Tagen einfach nicht weiter. Ich versuche krampfhaft, die Werte mehrerer Buttons auf einer Seite zu übergeben. Aber es funktioniert nicht. Entweder es wird nur der Wert des angeklickten Buttons übergeben

PHP:
<form name="test" action="test.php" method="post">

<?php

$a=0;
while ($a<5)
{
if($_REQUEST['Taste']=="Taste ".$a)
{
echo "<br><br><button type='submit' name='Taste' Value='Taste ".$a."'>Taste ".$a." an</button>";
}
else
{
echo "<br><br><button type='submit' name='Taste' Value='Taste ".$a."'>Taste ".$a." aus</button>";
}


$a++;
}
?>
</form>




oder die entsprechenden Tasten lassen sich nicht zurücksetzen.

PHP:
<form name="test" action="test.php" method="post">

<?php
session_start();
$neu=$_SESSION['test'];
$a=0;
while ($a<5)
{
if($_REQUEST['Taste']=="Taste ".$a || $neu[$a]=="Taste ".$a)
{
echo "<br><br><button type='submit' name='Taste' Value='Taste ".$a."'>Taste ".$a." an</button>";
$_SESSION['test'][$a]="Taste ".$a;
}
else
{
echo "<br><br><button type='submit' name='Taste' Value='Taste ".$a."'>Taste ".$a." aus</button>";
$_SESSION['test'][$a]="";
}
$a++;
}
echo "<pre>";
print_r($_SESSION['test']);
?>

</form>




Könnt Ihr mir mit einem Beispiel helfen? Ich wäre Euch sehr dankbar dafür :-)
 
Hallo @joergi!

Mir ist noch nicht ganz klar, was Du mit diesem Code erreichen willst. Poste doch auch mal das HTML des Formulars und beschreibe, was der Hintergrund bei dieser Sache ist.
Mehrere Submit-Buttons sind zwar möglich aber machen es in meinen Augen etwas undurchsichtig.
 
Zuletzt bearbeitet:
Hi,

danke für Deine Antwort. Ich möchte eine dynamische Tabelle erzeugen. In der ersten Spalte befindet sich jeweils ein Button. In der zweiten Spalte ein Text. Klickt nun ein User z.B. auf die Taste in der zweiten Zeile, wird der Text daneben ausgeblendet (visibility: hidden). Klickt er noch einmal diese Taste, wirde der Text wieder sichtbar (visibility: visible;). Das ganze soll aber nicht per Javascript erfolgen. Daher muss jeder Button ein submit Button sein. Das Ziel ist folgender: Nach dem anklicken, wird das Ergebnis (d.h. welche Tasten die jeweilig nebenstehende Spalte visible bzw. hidden geschaltet haben) direkt in eine Session Variable als Array geschrieben und in einem anderen Programm weiterverarbeitet.
 
Naja, aus Sicherheitsgründen möchte ich, dass jede Änderung direkt in eine Session geschrieben wird. Soweit ich weiß, ist das aber mit Javascript nicht möglich. Meine Befürchtung ist nämlich, dass ein User die jeweiligen Tasten anklickt und die entsprechenden Zeilen auch sichtbar/unsichtbar schaltet. Wenn er aber die Seite schließt (es handelt sich hier um ein weiteres Fenster, dass geöffnet wird), würden die Änderungen nicht übernommen werden. Es sei denn, er klickt vor Verlassen der Seite auf einen Submit Button, der dann die Daten an die Session übergibt. Aber wenn er das vergisst ....
 
Naja, aus Sicherheitsgründen möchte ich, dass jede Änderung direkt in eine Session geschrieben wird. Soweit ich weiß, ist das aber mit Javascript nicht möglich.
Doch, natürlich - Fetch API existiert, damit lassen sich problemlos Daten per Javascript an den Server senden ohne dass ein Formular abgeschickt werden muss.
Wenn er aber die Seite schließt (es handelt sich hier um ein weiteres Fenster, dass geöffnet wird), würden die Änderungen nicht übernommen werden. Es sei denn, er klickt vor Verlassen der Seite auf einen Submit Button, der dann die Daten an die Session übergibt. Aber wenn er das vergisst ....
Dir ist hoffentlich klar dass die Daten in der Session weg sind wenn alle Fenster der Seite geschlossen werden (bzw. die Session abgelaufen ist)? Auch eignet sich eine Session nicht um Daten an ein anderes Programm (siehe dein Posting #4) zu übergeben, dafür müssten die schon irgendwie dauerhaft am Server gespeichert werden (Datenbank oder Datei).
 
Ja, ich weiß, dass die Daten weg sind, wenn alle Fenster geschlossen sind. Aber in diesem Fall hat ja der User auch kein Interesse daran, die Seite weiter zu besuchen. Wenn er allerdings auf "schließen" klickt und das besagte Fenster geschlossen ist, kann die Session im darunterliegenden Fenster durch ein "weiter" Button (submit) ausgelesen werden. Naja, dass ist meine Idee! Mit der Fetch Api möchte ich lieber nicht arbeiten!
 
Naja, aus Sicherheitsgründen möchte ich, dass jede Änderung direkt in eine Session geschrieben wird. Soweit ich weiß, ist das aber mit Javascript nicht möglich.
Wie kommst Du darauf, dass das nicht möglich ist? Kein Problem, bei jedem Tastendruck die gesammelten Daten an den Server zu übertragen. Und warum möchtest Du nicht mit der fetch-API arbeiten?
 
PS: Ich habe das mal rasch getestet. Ergebnis: Sind mehrere Submit-Buttons vorhanden, wird nur der an den Server übertragen, mit dem das Formular abgeschickt wurde. Ein No-Go für eine Lösung ohne Javascript.
 
PS: Ich habe das mal rasch getestet. Ergebnis: Sind mehrere Submit-Buttons vorhanden, wird nur der an den Server übertragen, mit dem das Formular abgeschickt wurde. Ein No-Go für eine Lösung ohne Javascript.
Da braucht es keinen Test, bei HTML-Formularen wurde schon immer nur der Submit-Button an den Server geschickt über den das Formular abgeschickt wurde. Und ja, auch ohne Javascript ist das Problem lösbar, deswegen ja das Speichern der Daten in $_SESSION. Aber der OP will eigentlich nur eine Lösung für sein Problem vorgesetzt bekommen und hat deswegen den Thread bei php.de verlassen und hier einen neuen aufgemacht - dem aber natürlich die Informationen aus dem ersten Thread fehlen.
 
Hallo joergi,

wenn Du mit fetch aus JavaScript ein PHP-Script im gleichen Server-Web anPOSTest, dann kannst Du in diesem Script die Session manipulieren und darin Daten speichern. Oder, wie TK anmerkte, du schreibst es gleich in die Datenbank. Den Session-Cookie sollte der Browser beim Fetch automatisch mitgeben. D.h. wenn der Anwender das Popup-Fenster schließt, kann das Hauptfenster sich aktualisieren und aus der Session den geänderten Stand auslesen.

Das Schließen eines Popup-Fensters zu erkennen ist allerdings nicht trivial. Deswegen würde ich Dir erstmal empfehlen, beim manuellen Refresh zu bleiben.

Was man bei gleichem Origin (also Schema, Domain und Port-Angabe der URL) aber auch machen kann, ist, im Popup-Window die opener-Eigenschaft des window-Objekts zu nutzen. Damit kann man aus dem Popup-Window sogar Funktionen im Hauptfenster aufrufen. Mit etwas Mühe lässt sich ein Verfahren bauen, das bei Änderungen im Popup-Window automatisch das Elternfenster mit aktualisiert. Die bessere Alternative zu window.opener ist das postMessage-Protokoll, das ist aber etwas komplexer.

Dein PHP Script, mit dem Du das serverseitig lösen willst, hat den Fehler, dass Du das form-Element ausgibst und erst dann die Session startest. Das geht schief, die Session muss vor der ersten Ausgabe gestartet werden. Andernfalls hast Du gar keine Session. Zumindest war das bei mir so. Teste sowas immer mit aufgedrehten Error-Anzeigen.
Es ist ungeschickt, in den Buttons "Taste 3" zu speichern. Leg da nur die Tastennummer ab und verwende den Value dann, statt in einer Schleife alles rauszusuchen. Baue in einem ersten Schritt den neuen Tastenstatus auf und generiere dann ganz einfach die Buttons. So:

Wenn Du String-Interpolation ("Taste $a") oder ternären Operator (das ? :) nicht kennst, gucke es im PHP Handbuch nach. Die empty-Funktion ist extrem wichtig, weil sie die Fehlermeldung unterdrückt, wenn ein Arrayeintrag noch nicht existiert.

PHP:
<?php
session_start();
?>

<form name="test" action="test.php" method="post">

<?php
if (!isset($_SESSION['tasten']))
{
   $_SESSION['tasten'] = [];
}

if(isset($_REQUEST['Taste'])) {
   $a = intval($_REQUEST['Taste']);
   $_SESSION['tasten'][$a] = empty($_SESSION['tasten'][$a]) ? "an" : "";
}

for ($a=0; $a<5; $a++)
{
  $zustand = empty($_SESSION['tasten'][$a]) ? "aus" : "an";
  echo "<br><br><button type='submit' name='Taste' value='$a'>Taste $a ist $zustand</button>";
}
echo "<pre>";
print_r($_SESSION['tasten']);
?>

</form>

Rolf
 
Super, vielen Dank für die Hilfe. Der script ist genau das, was ich gesucht habe. Auch vielen Dank für die anderen Beiträge :-)
 
Zurück
Oben