Frage zu sess->register oder wie merke ich mir Werte

Gesperrt
tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Frage zu sess->register oder wie merke ich mir Werte

Beitrag von tinof » Do 25. Sep 2008, 17:12

Hallo,

ich habe ein Modul, das anhand einer DB - Abfrage eine Liste ausgibt, bei sehr vielen Datensätzen wird die Ausgabe auf mehrere Seiten aufgeteilt.
Es folgt immer dem Schema
1. Aufruf mit Selektionsparametern, diese dann merken ($sess->register())
2. - n. Aufruf dann unter Verwendung der gespeicherten Variablen.

Dazu verwende ich folgenden code

Code: Alles auswählen

function Listenausgabe(){

        global $page, $hkcfg, $anzahl, $sess ;
        global $land, $plz;

        $db = new db_contenido;

        $action = $_POST['formaction'];

        if ($action == "such!") {
                // neuer Aufruf
                $plz = mysql_escape_string($_POST['plz']);
                $land = mysql_escape_string($_POST['land']);

                // merken fuer naechste Seite bei Paging
                if (!$sess->is_registered('plz')) $sess->register('plz');
                if (!$sess->is_registered('land')) $sess->register('land');
        };

        // Selektion
        $swhere ="";
        $such="";

        if ($land != "") {
                if ($swhere == "") {
                        $swhere = " LAND = '" . $land  . "'";
                } else {
                        $swhere = $swhere . " AND LAND = '" . $land  . "'";
                }
                $such = $such . hkmi18n("hk_suche_land") . $land;
        }

        if ($plz != "") {
                if ($swhere == "") {
                        $swhere = " PLZ LIKE '" . $plz . "'";
                } else {
                        $swhere = $swhere . " AND PLZ LIKE '" . $plz . "%'";
                }
                $such = $such . hkmi18n("hk_suche_plz") . $plz;
        }

.. usw. Query mit Limit  und Ausgabe
Ich habe nun das Problem, dass das bei einem Kunden wunderbar funktioniert, bei einem anderen (anderer Provider) jedoch nicht.
Dort sind beim wiederholten Aufruf die Variablen $plz und $land wieder leer, dass $sess->register('plz') hat scheinbar nicht funktioniert.

Ist mein Ansatz falsch oder welche PHP - Einstellung muß noch verändert werden ?

Wie 'merkt' man sich Daten innerhalb einer Session ?

Wann wird eine neue Session gestartet (das Layout auf der fehlerhaften Seite ist nicht von mir, möglicherweise passiert da etwas, was die Session zurücksetzt) ?

Danke für Eure Hinweise !

Tino
Für die Freizeit : www.hobbybrauer.de

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Frage zu sess->register oder wie merke ich mir Werte

Beitrag von xmurrix » Do 25. Sep 2008, 18:04

Hallo,
tinof hat geschrieben:...Ist mein Ansatz falsch oder welche PHP - Einstellung muß noch verändert werden ? ...
Auf den ersten Blick, konnte ich kein Problem im Modulcode erkennen.
Ansonsten ist mir keine PHP-Einstellung bekannt, die ein solches Verhalten verursacht.
tinof hat geschrieben:...Wie 'merkt' man sich Daten innerhalb einer Session ?...
Mit $sess->register('varname') werden Variablen im globalen Namensraum registriert. Endgültig landen sie aber nur dann in der Session, wenn auch die Funktion page_close(); ausgeführt wird. Dies geschieht am Ende der front_content.php. Wenn aber irgendwo im Layout oder in einem der Module ein die() oder exit() die Ausführung vorzeitig beendet, kann page_close() nicht ausgeführt werden, und es steht nichts in der Session drin.

Ein anderer banaler Grund wäre, dass der Browser die Session-Cookies nicht akzeptiert und daher bei jedem Request eine neue Session gestartet wird.

Gruß
xmurrix

tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Beitrag von tinof » Fr 26. Sep 2008, 06:50

Danke xmurrix für die schnelle Antwort !

Ich habe nun mal ein Layout erstellt, das nur mein Modul enthält und nichts weiter, um Probleme in anderen Modulen auszuschließen.
Das Ergebnis ist leider das gleiche.

Die Site läuft mit ModRewrite, wenn ich das in den Mandanteneinstellungen ausschalte (reicht da "use=0" ??) habe ich zwar die vollständigen URLs, jedoch ändert sich nichts am Verhalten.

Gibt es alternative Möglichkeiten, die Eingaben zu speichern ? Ich denke schon darüber nach, die Variablen mit jedem Paging - Aufruf wieder in ein unsichtbares Formularfeld auszugeben, damit ich sie dann wieder zurückbekomme. Aber das kann's doch irgendwie nicht sein, oder ?

Cookies habe ich erlaubt, bei der anderen Web - Präsenz klappt es ja auch.

Allerdings, das ist vielleicht noch ein Hinweis: In der Präsenz, in der es geht läuft 4.6. , dort wo es nicht geht 4.8
Wurde da etwas im Session - Management geändert ?

Danke
Tino
Für die Freizeit : www.hobbybrauer.de

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Beitrag von xmurrix » Fr 26. Sep 2008, 11:13

Kann es sein dass es sich bei der Bedingung um einen Vertipper handelt?

Code: Alles auswählen

// "such!" oder nur "such" ?
if ($action == "such!") {
Falls ja, wird der Codeblock darin, in der auch das Speichern der Werte in der Session stattfindet, nie ausgeführt.

Dann ist mir aufgefallen, dass die Werte nur einmal in der Session landen, bei einer neuen Suche, werden die Werte nicht übernommen.

Code: Alles auswählen

// speichert die werte nur einmal in der session
if (!$sess->is_registered('plz')) $sess->register('plz'); 
if (!$sess->is_registered('land')) $sess->register('land'); 

// neue werte immer in der session speichern (überschreiben)
$sess->register('plz'); 
$sess->register('land'); 
Gruß
xmurrix

P.S.: Wenn es mit der Session generell ein Problem geben sollte, kannst du es daran erkennen, dass die Tabelle con_phplib_active_sessions bei jedem Request einen neuen Datensatz bekommt, anstatt einen Datensatz pro Besucher.

tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Beitrag von tinof » Fr 26. Sep 2008, 12:30

Danke nochmal,

ja, "such!" ist schon richtig (und funktioniert auch auf 2 anderen Präsenzen). Ok, das ist schon etwas 'verspielt', aber programmieren soll ja auch Spass machen :-)

Das mit dem if (!$sess->is_registered() ) ist interessant. Aber wenn ich das jetzt richtig verstehe, dann müßten in meinem code immer wieder die Werte der ersten Abfrage auftauchen, oder ?
Ich dachte immer, mit $sess->register() registriere ich die Variable und der (wechselnde) Inhalt einer so registrierten Variablen wird immer von Aufruf zu Aufruf weitergegeben. So wie du schreibst, wird wohl doch nur der aktuelle Inhalt selbst registriert.
Aber egal, beim folgenden Aufruf ist $plz immer leer - weder der Wert des ersten Aufrufs noch eines folgenden Aufrufs, nein, immer leer; quasi 'vergessen'.

Sorry, aber ich bin nicht so der PHP - Experte.

Mit RegisterGlobals hat mein Problem nichts zu tun ?

Danke Tino
Für die Freizeit : www.hobbybrauer.de

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Beitrag von xmurrix » Fr 26. Sep 2008, 15:10

tinof hat geschrieben:...Aber wenn ich das jetzt richtig verstehe, dann müßten in meinem code immer wieder die Werte der ersten Abfrage auftauchen, oder ?...
Ja, wenn das Formular abgeschickt wird, landen die Werte aus 'plz' und 'land' nur dann in der Session, wenn sie vorher nicht darin enthalten waren, also nur die ersten Werte. Falls beim ersten Post leere Werte ankommen, kommen diese in die Session und bleiben auch dort. Das könnte auch ein Grund für dein Problem sein.
tinof hat geschrieben:...Mit RegisterGlobals hat mein Problem nichts zu tun ?
Nein, damit hat es nichts zu tun. Contenido hat seine eigene Funktionalität, die sich darum kümmert, egal ob register_globals aktiv ist oder nicht.

Alternativ könntest du auch die Werte auch in $_SESSION oder $_COOKIE speichern, wobei die Cookie-Variante nur dann funzt, wenn auch vorher kein HTML-Code an den Client geschickt wurde. Allerdings ist das keine Lösung, damit wird das Problem nur umgangen.

Hast du schon überprüft, ob in der Tabelle bei jedem Request ein neuer Eintrag stattfindet?

Bei mit funktioniert folgender Modulcode problemlos:

Code: Alles auswählen

<?php

global $plz, $land;

$oDebug = DebuggerFactory::getDebugger('visible_adv');

$action = (isset($_POST['formaction'])) ? $_POST['formaction'] : '';

if ($action == "such!") { 
    // neuer Aufruf 
    $plz = mysql_escape_string($_POST['plz']); 
    $land = mysql_escape_string($_POST['land']); 

    // merken fuer naechste Seite bei Paging 
    $sess->register('plz');
    $sess->register('land');

    $oDebug->add($plz, 'registered $plz');
    $oDebug->add($land, 'registered $land');
} else {
    $oDebug->add($plz, '$plz in session');
    $oDebug->add($land, '$land in session');
}

$oDebug->showAll();

?>

<form action="front_content.php?idart=?<?php echo $idart ?>" method="post">
    <input type="hidden" name="formaction" value="such!" />
    PLZ: <input type="text" name="plz" value="<?php echo $plz ?>" /><br />
    LAND: <input type="text" name="land" value="<?php echo $land ?>" /><br />
    <input type="submit" value="Send" />
</form>
<a href="front_content.php?idart=?<?php echo $idart ?>">Reload page</a>
Gruß
xmurrix

tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Beitrag von tinof » Mo 29. Sep 2008, 07:28

Vielen, vielen Dank @xmurrix, für deine Mühe !!


Dein Beispielcode funktionierte auch bei mir, und darauf aufbauend habe ich nun einfach

Code: Alles auswählen

if (!$sess->is_registered('plz')) $sess->register('plz');
geändert in ein 'hartes'

Code: Alles auswählen

$sess->register('plz');

Jetzt funktioniert alles!
Einfache aber effektive Lösung.
Das ich zwischenzeitlich das ganze Modul so umgebaut hatte, dass die Selektion immer wieder mit über die URLs beim Paging weitergegeben wurde verrate ich jetzt aber niemandem mehr :oops:

Also, vielen Dank, viele Grüße!

Tino
Für die Freizeit : www.hobbybrauer.de

Gesperrt