php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 2 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 03-03-2008, 18:14
fnerstheimer
 Newbie
Links : Onlinestatus : fnerstheimer ist offline
Registriert seit: Mar 2008
Beiträge: 6
fnerstheimer ist zur Zeit noch ein unbeschriebenes Blatt
Standard Übergeben von Formulardaten

hallo,

zur Zeit programmiere ich an einem Projekt mit vielen Formularen. Die Formulare werden so realisiert, dass die Seite sich beim Drücken des Submit-Buttons selber wieder aufruft, und in Abhängigkeit des Button-Wertes verschiedene Funktionen ausführt.

Mein Problem ist nun, dass ich häufiger die Formulardaten in der Variablen _POST über mehrere Schritte erhalten muss. Wenn z.B. der Nutzer den Button Speichern betätigt, erscheint zuerst eine Warnmeldung (wirklich speichern ?), und anschließend soll entweder der neue oder der alte Formularinhalt (vor der Änderung) wieder angezeigt werden.

Zur Zeit löse ich das Problem, indem ich z.B. in den Warnmeldemasken den ganzen Formularinhalt als hidden-Felder ablege. Dies ist jedoch extrem mühselig zu programmieren, und bei größeren Formularen extrem serviceunfreundlich.

Besser wäre es, das gesamte _POST-Array in ein anderes Array zu laden und dieses komplett als hidden-Feld zu übergeben. Hier bin ich jedoch schon vor einigen Monaten gescheitert.

Hat jemand eine Idee, wie man Formularinhalte eleganter von Schritt zu Schritt übergeben kann, statt sie jedesmal einzeln als Formularfeld (sichtbar oder unsichtbar) zwischenzuspeichern ?

danke und Gruß

Frank
Mit Zitat antworten
  #2 (permalink)  
Alt 03-03-2008, 18:43
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: Übergeben von Formulardaten

Zitat:
Original geschrieben von fnerstheimer
[B]hallo,
Besser wäre es, das gesamte _POST-Array in ein anderes Array zu laden und dieses komplett als hidden-Feld zu übergeben. Hier bin ich jedoch schon vor einigen Monaten gescheitert.
mit serialize() wäre das sogar machbar, aber nicht empfehlenswert.

die erst wahl bei der lösung des problems sind session
Mit Zitat antworten
  #3 (permalink)  
Alt 03-03-2008, 22:04
fnerstheimer
 Newbie
Links : Onlinestatus : fnerstheimer ist offline
Registriert seit: Mar 2008
Beiträge: 6
fnerstheimer ist zur Zeit noch ein unbeschriebenes Blatt
Standard ich habs (mit session, vielen Dank)

hier ein kurzes Beispielprogramm, dass ein Formular öffnet, beim Druck auf den Button einen Warntext ausgibt, anschließend wieder ins Formular zurückspringt, und dabei die eingegeben Daten wieder herstellt.

Diese Funktion lässt sich beliebig variieren, so können z.B. verschiedene Zustände für einen Rollback gespeichert werden.

Die Session-ID bleibt so lange erhalten, bis der Benutzer das Browserfenster schliesst. Wechseln zu einer anderen Webseite löscht die ID nicht. Mit dem Befehl session_destroy() kann man die Session manuell beenden. Dies ist jedoch nicht nötig, wenn man nicht mehr benötigte Session-Variablen immer sofort löscht.

PHP-Code:
<?
//Start der Session (muss am Beginn jeder Seite angegeben werden)
$result session_start();

//Abfrage, ob Session gestartet, und Ausgabe der Session-ID
if($result)
{
  echo
"<p>Die Session wurde erfolgreich gestartet</p>";
  
$bla session_id();
  echo
"<p>Session-ID: ",$bla,"</p>";
}
else
{
  echo
"<p>Die Session konnte nicht gestartet werden.</p>";
}


//Formular Warnmeldung – Zustand nach Druecken des Buttons ‚warnung’
if($button == 'warnung')
{
  echo
"  <form action='index.php' method='post'>                ";
  echo
"    <p>Dies ist eine Warnung !</p>                       ";
  echo
"    <input type='hidden' name='s' value='$s'>";
  echo
"    <input type='submit' name='button' value= 'ok'>      ";
  echo
"  </form>                                                ";
  
  
// hier wird das Array _POST[] als Session-Variable gespeichert,
  // und bleibt für den nächsten Schritt erhalten
  
session_register(_POST);
}

//Formular Startansicht und Zustand nach Drücken des Buttons ‘ok’
else
{
  echo
"  <form action='index.php' method='post'>                                         ";
  echo
"    <p>Text 1:<input type='text' size='20' name='text_1' value='$_POST[text_1]'></p>";
  echo
"    <p>Text 2:<input type='text' size='20' name='text_2' value='$_POST[text_2]'></p>";
  echo
"    <p>Text 3:<input type='text' size='20' name='text_3' value='$_POST[text_3]'></p>";
  echo
"    <p>Text 4:<input type='text' size='20' name='text_4' value='$_POST[text_4]'></p>";
  
  
// hier wird das Array _POST[] als Session-Variable gelöscht, NACHDEM die Formularfelder
  // wieder hergestellt worden sind. Das Loeschen der Session-Variablen ist notwendig, damit 
  // Aenderungen in den Formularfeldern uebernommen werden koennen. 
  
session_unregister(_POST);
  echo
"    <input type='submit' value= 'ok'>                                   ";
  echo
"    <input type='submit' name='button' value= 'warnung'>                ";
  echo
"  </form>                                                               ";
}
?>
Das Schöne an dieser Lösung ist, dass man immer nur das Array '_POST[]' speichern muss, egal, wie kompliziert das Formular ist.

Danke an 3DMax für die Anregung.

Gruß Frank

Geändert von fnerstheimer (03-03-2008 um 22:10 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 05-03-2008, 01:46
_mil28
 Registrierter Benutzer
Links : Onlinestatus : _mil28 ist offline
Registriert seit: Jan 2006
Beiträge: 89
_mil28 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Warum nicht einfach das ganze Forumlar als Array in einer Session ablegen. Die Array Keys nennst du so wie die Forumlarfelder, dann kannst du unkompliziert wieder drauf zugreifen:

So in etwa:

PHP-Code:

function formToArray($form_post) {

    
$keys array_keys($form_post);

    foreach(
$keys as $item) {
        
        
$fields[$item] = $form_post[$item];
        
    }
    
    return 
$fields;

}

$_SESSION['form'] = formToArray($_POST); 

Geändert von _mil28 (05-03-2008 um 01:48 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 05-03-2008, 10:46
fnerstheimer
 Newbie
Links : Onlinestatus : fnerstheimer ist offline
Registriert seit: Mar 2008
Beiträge: 6
fnerstheimer ist zur Zeit noch ein unbeschriebenes Blatt
Standard danke für den Hinweis

es war mein erster Versuch, und ich war froh, dass es so gut geklappt hat.

Das mit dem Formulararray ist immer dann sinnvoll, wenn ein Formularstatus über mehrere Schritte erhalten bleiben muss. Wenn es nur darum geht, einen Formularinhalt über einen Schritt zu "schleppen", ist die dirkete Verwendung von _POST[] einfacher.

Ich habe das Beispiel gepostet, weil ich beim Googlen festgestellt habe, dass viele Leute genau das Problem haben. Sogar in Fachbüchern gibt es nur wenig darüber.

Gruß Frank
Mit Zitat antworten
  #6 (permalink)  
Alt 05-03-2008, 13:21
Shurakai
 Master
Links : Onlinestatus : Shurakai ist offline
Registriert seit: May 2004
Ort: Bergisch Gladbach
Beiträge: 3.084
Shurakai ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@mil28: Du würdest jedesmal dein Array überschreiben, anstatt es zu erweitern. Auch bereits vorhandenen Feldern trägst du nicht Rechnung

@fnerstheimer: Bitte keine Daten, die du intern geprüft hast, nochmal zurückschicken! "Never Trust Incoming Data!" muss dein Leitsatz sein. Bitte verwende dafür Sessions. 3DMax hat dir dafür bereits einen Link gepostet. Das ist die Beste und einfachste Lösung!
Mit Zitat antworten
  #7 (permalink)  
Alt 05-03-2008, 15:37
fnerstheimer
 Newbie
Links : Onlinestatus : fnerstheimer ist offline
Registriert seit: Mar 2008
Beiträge: 6
fnerstheimer ist zur Zeit noch ein unbeschriebenes Blatt
Standard jetzt muss ich mich doch mal ein wenig ärgern

so nett ich Deine Hilfsbereitschaft auch finde, mit Postings dieser Art kann ich nichts anfangen.

Das Problem mit dem Übertragen von Daten über mehrere Formularinstanzen hinweg kann man schon fast als Standardproblem bezeichnen. Beim Googlen findet man hunderte Fragen in diese Richtung, aber keine vernünftige Antwort.

Ich habe mich über den Link von 3DMax gefreut, und mein Beispiel danach aufgebaut. Wenn Du mein Listing noch einmal durchschaust, wirst Du feststellen, dass ich sehr wohl Sessions benutzt habe. Wenn ich wirklich etwas falsch gemacht habe, lass mich bitte nicht dumm sterben, auch wenn es drei oder vier Zeilen Schreibarbeit mehr kostet.

Die Regeln zum Posten habe ich ebenfalls gelesen, habe sie gerade jetzt nochmal gelesen, und kann immer noch nichts entdecken, was ich falsch gemacht haben soll. Klär mich doch bitte konkret auf.

Das mit Anführungsstrichen ja oder nein ist auch so eine Sache. Ich versuche eigentlich immer, meine Programme so korrekt wie möglich zu schreiben. Was jedoch soll man tun, wenn man innerhalb der echo-Anweisungen keine ineinander geschachtelten Anführungszeichen verwenden kann, ohne dass dies zu Parse-Fehlern führt ?

Bitte nicht böse sein, aber dieses kluge Gerede ohne Konstruktivität kann ich nicht haben. Ich bin eher der Mensch, der praktische Lösungen sucht (und sie gerne auch an andere weitergibt).

Gruß Frank

Geändert von fnerstheimer (05-03-2008 um 16:09 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 05-03-2008, 21:03
_mil28
 Registrierter Benutzer
Links : Onlinestatus : _mil28 ist offline
Registriert seit: Jan 2006
Beiträge: 89
_mil28 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

okay, hast recht dann vorher Abfrage rein, ob Session schon da ist:

PHP-Code:

function formToArray($form_post) {

    
$keys array_keys($form_post);

    if (isset(
$_SESSION['fields'])) {

         
$fields $_SESSION['fields'];

    }

    foreach(
$keys as $item) {
        
        
$fields[$item] = $form_post[$item];
        
    }
    
    return 
$fields;

}

$_SESSION['form'] = formToArray($_POST); 
Die Namen der Formularfelder müssen natürlich unique sein.
Mit Zitat antworten
  #9 (permalink)  
Alt 05-03-2008, 21:34
_mil28
 Registrierter Benutzer
Links : Onlinestatus : _mil28 ist offline
Registriert seit: Jan 2006
Beiträge: 89
_mil28 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ehrlich gesagt find ich die ganze Lösung hier nicht wirklich elegant. Mal so ein paar Dinge die mir auffallen:

Nehmen wir mal an du hast 5 Formularseiten, dann hast du

5x POST
5x php-seitig Validierung
5x haust du (auch noch mit echo) massig HTML-Code raus

Das ist zäh.

Mich fragt ja keiner aber ich würde das so machen.

1. Validieren mußt du ohnehin, das machst du mit JavaScript damit du keinen Refresh erleidest, wenn Fehler auftauchen, Fehlermeldungen blendest du ebenso per JS ein und aus
2. Ist die Valdierung erfolgreich schickst du per Ajax das Form los und speicherst $_POST in der Session
3. Als Callback machst du die Weiterleitung zum nächsten Formular ebenfalls in JavaScript

---
Bis hier hin hast du deinem User schon viel Zeit gespart, weil die Validierung via $_POST wegfällt. Ebenso hast du dein großes Back-Button Problem gelöst: in deiner Fassung kriegt der User nämlich immer einer lästige POST-Frage vom Browser, wenn er den Back-Button verwendet.
---

4. Beim finalen Post machst du PHP-seitig deine Sicherheitsvalidierung, sprich Anti-Injection-Kram, escapen, irgendwie so etwas und trägst deine gesamte Session in die Datenbank ein.

PHP-Code:

    
if(get_magic_quotes_gpc()) {
    
       
$result stripslashes($result);
    
    }
    
    if (!
is_numeric($result)) {
    
       
$result mysql_real_escape_string($result);
    
    } 
---
Jetzt hast du am Ende nur einmal PHP-seitig validiert, keine Probleme mehr mit dem Back-Button und vor allem hast du deine 1000 echos und den ganzen HTML-Code aus dem PHP-Teil. Insbesondere letzteres ist wichtig, weil du sonst den Cache von deinem Brwoser sabotierst.

nur ein Vorschlag ...

Geändert von _mil28 (05-03-2008 um 21:44 Uhr)
Mit Zitat antworten
  #10 (permalink)  
Alt 05-03-2008, 22:59
fnerstheimer
 Newbie
Links : Onlinestatus : fnerstheimer ist offline
Registriert seit: Mar 2008
Beiträge: 6
fnerstheimer ist zur Zeit noch ein unbeschriebenes Blatt
Standard mit JavaScript würde vieles einfacher gehen ...

nur leider ist JavaScript wg. dem Active Scripting im IE immer noch als Sicherheitsrisiko eingestuft. Man geht davon aus, dass etwa ein Drittel aller Internet-Nutzer das Active Scripting entweder deaktiviert haben oder durch irgendeinen Norton Schrott blockieren.

Das Problem mit dem active scripting hat vor einigen Jahren zum Tod von DHTML geführt, zur Erleichterung der geplagten Webseitenentwickler. Mit AJAX erleben wir jetzt DHTML 2.0, und der ganze Mist kocht wieder hoch.

Ich für meinen Teil benutze JavaScript nur für Funktionen, die für die Benutzbarkeit der Webseite keine Bedeutung haben. Für wichtige Dinge wie Fehlermeldungen bevorzuge ich Lösungen, die vielleicht unelegant sind, bei denen ich aber sicher bin, dass sie überall funktionieren.

Gruß Frank
Mit Zitat antworten
  #11 (permalink)  
Alt 06-03-2008, 00:27
Bladeflo89
 Newbie
Links : Onlinestatus : Bladeflo89 ist offline
Registriert seit: Mar 2008
Beiträge: 3
Bladeflo89 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

falls ichs richtig verstanden hab, gehen die Formulare über mehrere Schritte (Seiten), und der Benutzer soll die möglichkeit haben von letzten bis zum ersten zurückzugehen wenn ihm bspw. was einfällt und es ändern können ohne das die Daten verloren gehen?

dann würd ich sagen Speicherst du es in ner Session wobei du die Session in schritte unterteilst

PHP-Code:
$_SESSION['FORMNAME]['schritt_xy']['variable_xy]=Bla
und je nach Belieben das ganze halt mit ner schleife durchlaufen um Programmierzeit zu sparen

allerdings sollte man dabei dann stark darauf achten wofür die daten Später verwendet werden um ner SQL Injection oder ähnlich gearteten dingen Vorzubeugen
Mit Zitat antworten
  #12 (permalink)  
Alt 06-03-2008, 12:38
fnerstheimer
 Newbie
Links : Onlinestatus : fnerstheimer ist offline
Registriert seit: Mar 2008
Beiträge: 6
fnerstheimer ist zur Zeit noch ein unbeschriebenes Blatt
Thumbs up gute idee

das mit dem schrittweisen zurückgehen-Können ist allerdings schon der nächste Schritt. Im Moment geht es nur darum, den abgeschickten Formularinhalt zu erhalten, wenn z.B. eine Fehlermeldungsmaske dazwischenliegt.

Ich probiere Deinen Vorschlag mal aus.

danke und Gruß Frank
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:14 Uhr.