str_replace Problem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • str_replace Problem

    Hallo Leute,

    habe das Forum / die Community hier grade zufällig bei meiner Suche gefunden und war mit den Antworten immer soweit zufrieden, daher dachte ich es wird mal Zeit für mich hier reinzuschauen. Daher an dieser Stelle ein freundliches Hallo :-).

    Zu meinem Problem. (das mich inzwischen verzweifeln lässt )
    Ich habe eine eigene Session Verwaltung. Diese beinhaltet eine Funktion, die eine Variable entweder hinzufügt oder - wenn bereits vorhanden - ersetzt. Das ganze läuft mittels str_replace() .

    Soweit funktioniert das auch wunderbar. Regelmäßig kommt es jedoch zu Fehlern beim schreiben... Bisher ohne exaktes (von mir identifizierbares) Muster für den Fehler.

    Was jedoch klar ist - es tritt quasi immer dann auf wenn ich die aktuelle Adresse als Session speichere. Also wenn z.B. die alte Variable durch die neue ersetzt werden soll:

    Code:
    old: #urlActiveEncode:from=http%3A%2F%2Fwameo-test-domain.dev%2Flist.php%3Fcatid%3D3#
    new: #urlActiveEncode:from=http%3A%2F%2Fwameo-test-domain.dev%2F#
    # ist dabei die Begrenzung
    : die Trennung zwischen Variable (var) und Wert (value)

    Rauskommen tut dabei dann z.B. sowas:
    Code:
    #urlActiveEncode:from=http%3A%2F%2Fdomain.dev%2F%3Fcc%3D1%26cc%3D1#cc=1&cc=1#cc=1#
    Wobei die cc=1 eigentlich noch in die Variable mit reingehören würden. Eigentlich natürlich nur einmal. Das ganze ist ein Output nach mehrfachem Neuladen ...


    Die Funktion dazu ist die folgende:
    PHP-Code:
    function sess_varUpdate($var,$value){
       global 
    $sess_var;
       
    $content file_get_contents("sessions/".$sess_var[sess_id].".info");

       
    $string_old "#".$var.":".$sess_var[$var]."#";
       
    $string_new "#".$var.":".$value."#";
       echo 
    "old: ".$string_old."<br>new: ".$string_new."<br>";
       
    $content str_replace($string_old,$string_new,$content);
       
    //echo "Inhalt - ".$content."<br><br>";
       
    $fp fopen("sessions/".$sess_var[sess_id].".info""r+");
       
    rewind($fp);
       
    fwrite($fp,$content);
       
    fclose($fp);
       
    $sess_var[$var] = $value;

    Hat irgend jemand eine Idee, warum der Probleme dabei hat den alten durch den neuen zu ersetzen - und das obwohl nach dem exakten alten String in der Datei gesucht wird?

    Ach ja. Das erste schreiben klappt auch immer problemlos. Sobald eine längere URL drinnen ist kommen die Probleme vor.


    Ich habe auch schon versucht das ganze so weit umzuschreiben, dass die Infos nicht mehr wie aktuell in Reihe (also: #var1:value1#var2:value2#) sondern Zeilenweise geschrieben werden und dann nur die Zeile ersetzt werden muss. Aber auch das hat nicht zum Erfolg geführt.

    Dabei kamen dann solche Dinge raus:
    Code:
    #urlActiveEncode:from=http%3A%2F%2Fwameo-test-domain.dev%2Fandrease.htm
    c%3D1
    D1
    #count[106]:1
    3D1
    D1
    #count[86]:1
    Alle Einträge die nicht mit einer Raute beginnen sind falsch und gehören eigentlich zum Eintrag urlAtiveEncode


    Wäre super wenn jemand eine Idee dazu hat...
    Habt Dank und einen schönen Abend :-).

    Viele Grüße,
    Jonas

  • #2
    Ich habe eine eigene Session Verwaltung.
    Ich kanns mir nicht verkneifen: Warum tust du sowas?
    Wir werden alle sterben

    Kommentar


    • #3
      Warum benutzt du nicht die in PHP eingebauten Session-Funktionen?

      Kommentar


      • #4
        Ich habe schon fest mit dieser Frage gerechnet :-).
        Die Antwort ist recht einfach: Um eine Domainübergreifende Session Verwaltung zu realisieren.

        Ne spontane Idee für das Problem hat aber nicht zufällig jemand ?

        Kommentar


        • #5
          wenn du die Variable entweder hinzufügst oder ersetzt ..


          dann würd ich das so realisieren

          $variable=blabla

          weil du die Variable in jedem Fall sowieso überschreibst ...

          str_replace ersetzt "nur" dann den gesamten String, wenn er zufällig der Suchparameter ist

          wenn du sowieso den gesamten String ersetzen willst, dann weise ihm einfach OHNE str_replace den neuen Wert zu und gut is

          ich krieg bei deinem Globals gerad ne Gänsehaut .... warum gibt deine Funktion den Wert nicht per return zurück?
          Zuletzt geändert von eagle275; 22.09.2010, 07:05.
          [font=Verdana]
          Wer LESEN kann, ist klar im Vorteil!
          [/font]

          Kommentar


          • #6
            Zitat von waldgeist Beitrag anzeigen
            Ich habe schon fest mit dieser Frage gerechnet :-).
            Die Antwort ist recht einfach: Um eine Domainübergreifende Session Verwaltung zu realisieren.

            Ne spontane Idee für das Problem hat aber nicht zufällig jemand ?
            Spontane Idee - lass' den Quatsch, dir selber irgendein Format zum Speichern der Daten zusammenzubasteln.

            serialize und sein Gegenstück existieren.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              session_set_save_handler() existiert auch.

              Kommentar


              • #8
                Zitat von onemorenerd Beitrag anzeigen
                session_set_save_handler() existiert auch.
                Ist nicht wirklich hilfreich....
                Die wenigsten bekommen bei einem eigenen Handler ein stabiles Sessionlocking hin.
                Auch bei:
                Um eine Domainübergreifende Session Verwaltung
                hilft kein eigener Handler....
                Denn das Problem sind die Cookies. Diese sind an die Domain gebunden.

                Also hilft keine eigener Handler.
                Auch hilft keine selbstgebaute Sessionverwaltung.
                Und wenn es auch noch unterschiedliche Domaininhaber sind, wird die Unix Rechteverwaltung da auch noch einen dicken Strich durch die Rechnung machen. Denn die Session Dateien sollten nicht von jedem x beliebigen User gelesen werden dürfen.

                Nix hilft da. (soweit ich das beurteilen kann)



                Domainübergreifende Session Verwaltung
                Was ist darunter zu verstehen?
                Wenn es sich um Subdomains handelt, ist das im Sessioncookie einstellbar.
                Wenn die Domains auf einem Server liegen könnte man versuchen die SID per Url zu übergeben. Aber das muss nicht gelingen(wg. Rechte, oder unterschiedlicher temp Verzeichnisse), und ist dazu noch relativ unsicher.
                Zuletzt geändert von combie; 22.09.2010, 11:05.
                Wir werden alle sterben

                Kommentar


                • #9
                  Zitat von combie Beitrag anzeigen
                  Ist nicht wirklich hilfreich....
                  Die wenigsten bekommen bei einem eigenen Handler ein stabiles Sessionlocking hin.
                  Möglich ist es und bei Bedarf kann ich es ihm zeigen.
                  Seine Methode enthält übrigens auch kein Locking. Zwischen file_get_contents und fwrite kann viel passieren.

                  Kommentar


                  • #10
                    Zwischen file_get_contents und fwrite kann viel passieren.
                    Ja, genau!
                    Darum habe ich das Locking ja auch erwähnt.

                    Aber egal ob eine völlig selbst geschriebene Session Verwaltung, oder nur ein eigener Handler. Ich sehe nicht wie das Problem zu lösen wäre, denn PHP ist ja weiterhin den selben Gesetzen und Regeln unterworfen.

                    Mich interessiert:
                    Wozu soll das überhaupt gut sein?

                    Weil bisher sehe ich nur, dass Sessions für irgendwas benutzt werden sollen, was sie nicht leisten können.
                    Wir werden alle sterben

                    Kommentar


                    • #11
                      Danke erstmal für die zahlreichen Antworten und die Diskussion.
                      Das ganze hat mich erst einmal ein bisschen weiter gebracht.

                      Ich werde mir mal serialize und unserialize genauer anschauen. Denke damit habe ich eine gute Möglichkeit die Informationen zu speichern.


                      Wozu das ganze. Wie gesagt. Ich habe ein Projekt bei dem es möglich sein muss auf die Daten von verschiedenen Domains zuzugreifen.
                      Die Cookie Problematik wurde bereits erläutert. Entsprechend muss ich die Session Daten irgend wo speichern.
                      Das ganze läuft auch - von den Problemen mal abgesehen. Wenn das ganze per serialize sinnvoll abgespeichert werden kann, dann sogar (bisher) einwandfrei.


                      Was genau ist das session locking? Ich nehme an das, was der Name sagt. Also der Schutz vor doppeltem beschreiben?
                      Diesen Schutz gibt es bei mir aktuell nicht. Wäre aber wohl drüber nachzudenken.


                      Was mich jetzt noch interessiert:
                      ich krieg bei deinem Globals gerad ne Gänsehaut ....
                      Wieso weshalb warum? Ich weiß - globals als mehr oder minder umstrittener Bereich. Aber das ganze etwas ausgeführt würde mich sehr freuen - lerne ja gerne dazu.


                      Das mit dem session_set_save_handler() hat mich leider auch nicht wirklich weiter gebracht. Finde die Dokumentation da äußerst dürftig. Was genau bringt mir das? In einer (MySQL-)Datenbank will ich es nicht speichern. Welche Möglichkeiten gibt es da? Und hat jemand einen guten Link zu einem ausführlichen Tutorial wo das ganze beschrieben wird (php.net mal ausgenommen)?

                      Kommentar


                      • #12
                        Zitat von waldgeist Beitrag anzeigen
                        Die Cookie Problematik wurde bereits erläutert. Entsprechend muss ich die Session Daten irgend wo speichern.
                        Wo wurde das erläutert? Bisher hat combie nur gesagt
                        Wenn es sich um Subdomains handelt, ist das im Sessioncookie einstellbar.
                        Wenn die Domains auf einem Server liegen könnte man versuchen die SID per Url zu übergeben. Aber das muss nicht gelingen(wg. Rechte, oder unterschiedlicher temp Verzeichnisse), und ist dazu noch relativ unsicher.
                        Was ist nun? Sind deine Domains alle Subdomains einer gemeinsamen Hauptdomain? Dann setze das Session-Cookie für *.hauptdomain.tld und verwende PHPs Session-Mechanismus wie jeder andere auch. *

                        Sind es keine Subdomains? Dann erkläre uns doch bitte, wie du die SID überträgst. Mich interessiert vor allem, wie du es schaffst, dass ich mich auf Domain A einlogge, ein neues Tab im Browser öffne, zu Domain B gehe und dort bereits eingeloggt bin (Loginstatus aus Session, Session von A übernommen).

                        Unabhängig davon: Wie und wo speicherst du dann die Session-Daten, NFS? Dann musst du nur session.save_path dorthin zeigen lassen. *

                        *) Willst du Locking? Dann benutze zusätzlich session_set_save_handler().

                        Kommentar


                        • #13
                          ich krieg bei deinem Globals gerad ne Gänsehaut ....
                          Wieso weshalb warum?
                          Die Verwendung globaler Variablen ermöglicht das auftreten von unerwünschten Seiteneffekten.
                          Darum sind sie zu recht verpönt.

                          In den heutigen OOP Zeiten gibt es keinen Grund mehr globale Variablen zu verwenden.

                          Wozu das ganze. Wie gesagt. Ich habe ein Projekt bei dem es möglich sein muss auf die Daten von verschiedenen Domains zuzugreifen.
                          Das hat nichts mit Sessions zu tun!
                          Das können sie nicht leisten.
                          Auch keine selbst gebauten.

                          Vermutlich sind SOAP oder REST die passenden Mittel um Daten über Domaingrenzen hinweg auszutauschen.
                          Zuletzt geändert von combie; 22.09.2010, 13:24.
                          Wir werden alle sterben

                          Kommentar


                          • #14
                            @onemorenerd: Es handelt sich nicht um Subdomains. Dann hätte ich das ganze Problem ja nicht.

                            Wie läuft die Übertragung der Session:
                            Es gibt eine Hauptseite (domain1). Diese verwaltet die kompletten Sessions. Gehst du auf domain2 wird geschaut ob ein Cookie mit Session für domain2 existiert. Ist dies nicht der Fall wird eine Anfrage an domain1 gestellt. Über ein Token System mit zusätzlicher "Fingerprint" Überprüfung wird die ID als neuer Cookie gesetzt - womit domain2 auf die Session zugreifen kann.

                            @combie: Dann wäre es wohl mal an der Zeit für mich, sich ausführlich mit der objektorientierten Programmierung auseinander zu setzen. Bisher hatte ich mit globals allerdings noch keine Probleme. Noch dazu weil ich grundsätzlich nur arrays globalisiere die extra für diesen Zweck angelegt sind.
                            Probleme diesbezüglich hatte ich noch nie.

                            Kommentar


                            • #15
                              Zitat von waldgeist Beitrag anzeigen
                              Es gibt eine Hauptseite (domain1). Diese verwaltet die kompletten Sessions. Gehst du auf domain2 wird geschaut ob ein Cookie mit Session für domain2 existiert. Ist dies nicht der Fall wird eine Anfrage an domain1 gestellt. Über ein Token System mit zusätzlicher "Fingerprint" Überprüfung wird die ID als neuer Cookie gesetzt - womit domain2 auf die Session zugreifen kann.
                              Dann ist also dieses Token das, was zwischen den Domains übergeben wird, um den Client identifizieren zu können ...?
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X