einsiedler: Platzhalter einsetzen

Hallo (nochmal) liebe Forumer,

Wie kann man nachträglich in meine index.php
meine Meldung: Sie haben sie erfolgreich ausgeloggt! per echo str_replace( '{meldung}', implode($_LayoutHtml ); einfügen?

Hintergrund: Ich möchte dieses von meiner logout.php ausführen lassen.

Im logout.php steht folgendes (bekanntes):

<?php 
session_start();
session_destroy();
unset($_SESSION['userid']);

//Remove Cookies
setcookie("identifier","",time()-(3600*24*365)); 
setcookie("securitytoken","",time()-(3600*24*365)); 

require_once("inc/config.inc.php");
require_once("inc/functions.inc.php");

?>

// HIER soll nun mein PHP script die Meldung ausgeben!!
// <div class="foo">
// Der Logout war erfolgreich. <a href="login.php">Zurück zum Login</a>.
// </div>
// DIREKT  und OHNE eine Linkweiterleitung

In meiner login.php Seite steht bereits schon der Platzhalter: {logout}

Ich benötige u.a. dies:

const LAYOUT_HTML_FILE_PATH = './login.php';
const WIDGETS_FOLDER_PATH = './templates/';      // benötige ich warscheinlich gar nichtmal!!!
$_LayoutHtml = file_get_contents( LAYOUT_HTML_FILE_PATH );
$_UserCardsHml = file_get_contents( WIDGETS_FOLDER_PATH . 'section-card.html' );  // benötige ich warscheinlich gar nichtmal!!!

Welche Paar Zeilen bewerkstelligen dies?

Wer hilft mir, sodass ich schnell weitermachen kann?

LG der sonntagliche misanthrop

  1. Hallo einsiedler,

    nicht, dass ich wirklich verstehen würde, was Du willst, aber ich rate mal, dass deine logout.php letztlich die login-Seite anzeigen soll, mit dem Hinweis drin "Sie haben sie erfolgreich ausgeloggt!".

    Allerdings verstehe ich dies hier nicht:

    const LAYOUT_HTML_FILE_PATH = './login.php'; $_LayoutHtml = file_get_contents( LAYOUT_HTML_FILE_PATH );

    Wenn login.php eine PHP Datei ist, wird das PHP nicht ausgeführt. Die Datei wird 1:1 eingelesen und PHP-Anweisungen bleiben stehen. Sowas ist extrem verwirrend.

    Du solltest einen von zwei Wegen gehen:

    1. der PHP Weg:

    Wenn Du die Datei unbedingt login.php nennen willst, dann hol sie mit require oder include herein. PHP-Code darin wird dann ausgeführt, d.h. du kannst zwar immer noch sowas wie {meldung} erzeugen, musst aber nicht. Du kannst auch vor dem include eine Variable $meldung bestücken und im login.php <?= $meldung ?> schreiben. PHP löst die Variable dann auf.

    Output-buffering: Wenn Du die login.php an der Stelle X einlesen willst, aber erst später an der Stelle Y ausgeben kannst, dann kannst Du die Ausgabe, die login.php erzeugt, puffern. Dafür gibt es ob_start() (output buffering start), das rufst Du vorher auf, und $loginPart = ob_get_clean(); zum Auslesen und Löschen des Puffers. Ein echo $loginPart kannst Du dann nach Lust und Laune ausführen. Und du kannst in $loginPart auch Ersetzungen durchführen, wenn Du noch {blah} Marker drin hast. Wie das geht, erkläre ich gleich.

    1. Templating:

    Wenn Du die login-Vorlage mit file_get_contents einlesen willst, dann nenne sie login.tpl oder so, nicht .php. Damit ist klar, dass darin kein PHP Code ausgeführt wird.

    Das Ersetzen von Template-Symbolen geht in einfacher Form mit

    $template = file_get_contents(...);
    $template = str_replace("{meldung}", $meldung, $template);
    

    Wenn Du mehrere Symbole ersetzen willst, kannst Du die Array-Variante von str_replace verwenden:

    $template = str_replace(
       [ "{meldung}", "{warnung}", "{titel}" ],
       [$meldung, $warnung, $titel ],
       $template);
    

    Weiß nicht ob Du's weißt: [1,2,3] ist die Abkürzung für ARRAY(1,2,3).

    Rolf

    --
    sumpsi - posui - clusi
    1. Ja, das weiß ich... lieber Rolf

      const TEMPLATES_FOLDER_PATH = './templates/';
      $_TemplateCardHml = file_get_contents( TEMPLATES_FOLDER_PATH . 'meldung.html' );
      $template = str_replace(
         [ "{meldung}", "{warnung}", "{titel}" ],
         [$meldung, $warnung, $titel ],
         $template);
      

      Bringe es nicht ganz zusammen...

      Aber muss man für die eine Zeile <p>Sie haben sie erfolgreich ausgeloggt!</p> ein eigenes template anlegen?

      Aber jetzt ist es ja noch nicht in meinem login.php eingefügt. Oder doch durch das: {logout} an dieser Stelle wo dies steht?

      Das script oben steht letztlich in meiner logout.php

      Also:

      <?php 
      session_start();
      session_destroy();
      unset($_SESSION['userid']);
      
      //Remove Cookies
      setcookie("identifier","",time()-(3600*24*365)); 
      setcookie("securitytoken","",time()-(3600*24*365)); 
      
      require_once("inc/config.inc.php");
      require_once("inc/functions.inc.php");
      
      const TEMPLATES_FOLDER_PATH = './templates/';
      $_TemplateCardHml = file_get_contents( TEMPLATES_FOLDER_PATH . 'meldung.html' );
      $template = str_replace(
         [ "{meldung}", "{warnung}", "{titel}" ],
         [$meldung, $warnung, $titel ],
         $template);
      ?>
      

      Gruß T.

      1. Hallo Tassilo,

        mein [{meldung}, {warnung}, {titel}] war symbolisch und sollte zeigen, wie man - wenn man möchte - mehrere Marker auf einmal ersetzen kann. Das kannst Du nicht 1:1 übernehmen. Wenn Du das getan hast, dann ist

        Bringe es nicht ganz zusammen...

        die Untertreibung des Sommers 😀

        str_replace kann entweder genau einen String durch einen anderen ersetzen, das war das, was ich oben mit der einfachen Form meinte, oder eben auch mehrere auf einmal. Das habe ich der Vollständigkeit halber hinzugefügt. Wenn Du das nicht brauchst, bleib bei der einfachen Form.

        Ansonsten bin ich immer noch verwirrt und weiß nicht, was Du eigentlich genau tun willst. Das hatte ich eingangs geschrieben, aber darauf bist Du nicht eingegangen. Statt dessen zeigst Du jetzt Code, der eine andere Datei als zuvor mit file_get_contents einliest. Tut mir leid, damit komme ich nicht klar. Vielleicht ist es zu spät und zu heiß. Jedenfalls habe ich keine Ahnung von der inneren Struktur deiner Anwendung, welche Dateien Du wofür verwendest, welche PHP Scripte Du hast.

        Versuchs nochmal. Du hast eine index.php, eine login.php und eine logout.php. Und vermutlich noch mehr, aber das ist hier wohl egal.

        Vermutlich kann ich von index nach login kommen, melde mich an und habe dann eine Session, die mir mehr Möglichkeiten auf deiner Seite gibt. Und dann klicke ich logout. Was genau soll ich jetzt zu sehen bekommen? Die Login-Seite? Die Index-Seite im abgemeldeten Zustand plus dem "Sie sind ausgeloggt" Hinweis?

        Rolf

        --
        sumpsi - posui - clusi
        1. Vermutlich kann ich von index nach login kommen, melde mich an und habe dann eine Session, die mir mehr Möglichkeiten auf deiner Seite gibt. Und dann klicke ich logout. Was genau soll ich jetzt zu sehen bekommen? Die Login-Seite? Die Index-Seite im abgemeldeten Zustand plus dem "Sie sind ausgeloggt" Hinweis?

          Damit liegst Du nicht ganz falsch, allerdings starte /betrete (ich) sofort die login.php. Ich weiß nicht ob man es so korrekterweise macht. Jedenfalls ist der Rest genau so wie Du es beschrieben hast.

          Mit dem KlICK auf den logout Button kommt man surück zur login.php Seite. Und es erscheint über der Login - <form> eben die Meldung: Sie haben sich erfolgreich abgemeldet.

          Wie macht man das? Gibt es zwei varianten vom login.php eine zum start die andere auf der man landet wenn man ausloggt. Aber das kann es doch nicht sein oder?

          Jedenfalls fände ich es besser wenn man beim logout nachträglich diese zeile einfügt.

          Gruß T.

          1. Hi,

            Vermutlich kann ich von index nach login kommen, melde mich an und habe dann eine Session, die mir mehr Möglichkeiten auf deiner Seite gibt. Und dann klicke ich logout. Was genau soll ich jetzt zu sehen bekommen? Die Login-Seite? Die Index-Seite im abgemeldeten Zustand plus dem "Sie sind ausgeloggt" Hinweis?

            Damit liegst Du nicht ganz falsch, allerdings starte /betrete (ich) sofort die login.php. Ich weiß nicht ob man es so korrekterweise macht. Jedenfalls ist der Rest genau so wie Du es beschrieben hast.

            Mit dem KlICK auf den logout Button kommt man surück zur login.php Seite. Und es erscheint über der Login - <form> eben die Meldung: Sie haben sich erfolgreich abgemeldet.

            Wie macht man das? Gibt es zwei varianten vom login.php eine zum start die andere auf der man landet wenn man ausloggt. Aber das kann es doch nicht sein oder?

            Man macht nicht die ganze Session kaputt, sondern nur den "operativen Teil", also alle Aktionen, die benutzerspezifische Daten enthalte. Den admistrativen Teil behält man. Darin steht z. B. did letzte Aktion und die passende Meldung dazu.

            Und überleg dir mal, ob Du nicht alles über einen zentralen Dispatcher (index.php) laufen lassen willst und nicht über atomisierte Einzeldateien.

            LG
            RoRo

          2. Hallo Tassilo,

            zum einen kann man es so machen wie RR vorschlug: Session nur teilweise abwracken und die Meldung darin speichern. Die Login Seite findet sie dann dort.

            Eine andere Möglichkeit wäre, Login und Logout zu einer PHP zusammenzufassen und den Logout durch login.php?action=logout auslösen. Je nach Action prüft du die Credentials oder meldest ab.

            Es gibt aber auch Argumente für eine zwischengeschaltete Infoseite, die z.B. auf klick oder nach 2s weiterleitet. An- und Abmeldung sind Aktionen, die besondere Bedeutung haben. Da sollte man nicht eben mal so per vor/zurück im Browser drüber weg hüpfen können.

            Rolf

            --
            sumpsi - posui - clusi
            1. Es gibt aber auch Argumente für eine zwischengeschaltete Infoseite, die z.B. auf klick oder nach 2s weiterleitet. An- und Abmeldung sind Aktionen, die besondere Bedeutung haben. Da sollte man nicht eben mal so per vor/zurück im Browser drüber weg hüpfen können.

              Hallo Rolf, das gibt mir gerade zu denken, stimmt auch wieder... Bei meinem GMX logout z.B. ist es genauso, klar wird dann auch viel Werbung untergebracht, das sich die Seite mit irgendwelchem Content "füllt". Aber das muss ja gar nicht mal.

              Hmmmmmmm...

              Ist eigentlich soetwas möglich: header("refresh: 4; url=https://muehlbauer.intern.wald-frieden.net/); (Oder auch ein relativer Pfad der dort stehen kann!)

              Zusätzlich als Angebot ein Link "Zurück zum Login" , wenns noch schneller gehen soll. ;o)

              Gruß T.

              1. Hallo Tassilo,

                ich bin an der Stelle nicht ganz sattelfest.

                Aber eins ist klar: Du kannst diesen Header mit der header-FUnktion setzen, oder du kannst in den <head> der Seite ein Meta-Element eintragen:

                <meta http-equiv="refresh" content="4; URL=..." />
                

                Die Wirkung ist gleich. In beiden Fällen verwendest Du einen von Netscape erfundenen und nie standardisierten Response-Header, der aber von den meisten Browsern unterstützt wird.

                Tatsächlich kenne ich keinen standardisierten und sicher funktionierenden Weg, der den refresh-Header ersetzen könnte.

                Eine JavaScript-Alternative gibt's noch, aber JS kann ja auch ausgeschaltet sein. Deinen Link brauchst Du also auf jeden Fall.

                <script>
                setTimeout(function() { document.location="login.php"; }, 4000);
                </script>
                

                Rolf

                --
                sumpsi - posui - clusi
    2. Lieber Rolf, oder auch jem. anderes, wer zeigt mir Bitte wie das genau mit dem "simplen templating" geht?

      Zum Verständnis nochmal: wenn man im "internen Bereich" ist und dort den LOGOUT Button drückt erfolgt mein logout.php also die Paar Zeilen script. Von da aus müßte doch ein redirect ( header("location: login.php"); ) oder so etwas folgen , das dort in der login.php eben die Meldung "Sie haben sich erfolgreich ausgeloggt." an der entsprechenden Stelle {logout} dort erscheinen kann. Also wer Bitte zeigt mir das "einfache templating" mit nur dieser einen Zeile.

      Gute n8 der misanthrop

      1. Hallo einsiedler,

        Eine Möglichkeit: Du führst zwei Variablen in $_SESSION, etwa logged_in und userid. Beim Logout löschst du die eine zurück.

        Dann in der Login:

        <?php 
        session_start();
        
        if (isset($_SESSION['logged_in']) && !isset($_SESSION['userid'])) {?>
        
          <p>Erfolgreich ausgeloggt</p>
          <?php session_destroy(); 
        
        }?>
        

        Keine Garantie

        Vollkommen ungetestet

        Nutzerverwaltung ist ein schwieriges Terrain. Da muss man sehr aufpassen, dass man sich keine Sicherheitslücken einbaut.

        Bis demnächst
        Matthias

        --
        Pantoffeltierchen haben keine Hobbys.
        ¯\_(ツ)_/¯
  2. Hallo (nochmal) liebe Forumer,

    Wie kann man nachträglich in meine index.php
    meine Meldung: Sie haben sie erfolgreich ausgeloggt!

    Hintergrund: Ich möchte dieses von meiner logout.php ausführen lassen.

    Dann würde ich das auch auf dieser Seite ausgeben und nicht auf der index.php.

    Idee: den Vorgang Login/Logout auf einer Anwendungsseite machen und den Unterschied über einen Schlüsselparameter regeln. MFG

    1. Lieber Emil, wenn ich den Botton LOGOUT in meinem internen Bereich anklicke, dann besteht mein logout.php script nur aus diesen Zeilen.

      <?php
      session_start();
      session_destroy();
      unset($_SESSION['userid']);
      //Remove Cookies
      setcookie("identifier","",time()-(3600*24*365));
      setcookie("securitytoken","",time()-(3600*24*365));
      require_once("inc/config.inc.php");
      require_once("inc/functions.inc.php");
      ?
      
      
      // HIER soll nun das PHP  die Meldung innerhalb meiner logout.php ausgeben!!
      
      // <div class="foo">
      
      // Der Logout war erfolgreich. 
      
      // </div>
      
      // DIREKT und OHNE eine Linkweiterleitung
      
      

      Aber ich bin mir nun nicht sicher ob man es überhaupt so macht, ihr seid ja die Profis und konstruiert soetwas professionell für eure Aufträge.

      LG T.

      1. Hallo Tassilo,

        "Profi" heißt: man bekommt für das, was man tut, soviel Geld, dass man davon leben kann. Das heißt nicht, dass alle Profis gleicher Meinung sind.

        Der Thread enthält nun mehrere Ansätze, entscheide Dich für einen. Falsch ist keiner.

        Rolf

        --
        sumpsi - posui - clusi
        1. Hallo,

          "Profi" heißt: man bekommt für das, was man tut, soviel Geld, dass man davon leben kann. Das heißt nicht, dass alle Profis gleicher Meinung sind.

          erstens das, zweitens ist die umgangssprachliche Definition für "Profi" eine andere, nämlich: Jemand, der eine bestimmte Aufgabe sehr gut beherrscht.
          Im Idealfall treffen beide Eigenschaften zu; selbstverständlich ist das leider nicht.

          Ciao,
           Martin

          --
          Ein Tag, an dem du nicht wenigstens einmal gelacht hast, ist ein verlorener Tag.
          1. @@Der Martin

            zweitens ist die umgangssprachliche Definition für "Profi" eine andere, nämlich: Jemand, der eine bestimmte Aufgabe sehr gut beherrscht.

            Und jemand, der weiß, dass das, was er nicht gut beherrscht, irrelevant ist.

            Im Idealfall treffen beide Eigenschaften zu; selbstverständlich ist das leider nicht.

            Natürlich nicht.

            LLAP 🖖

            --
            „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
        2. Offengestanden habe ich das mit dem Login/Logout u.s.w. von hier https://www.php-einfach.de/experte/php-codebeispiele/loginscript/

          Gut finde ich hierbei das sowohl das Passwort als auch der Securitytoken vom "angemeldet bleiben" in der Datenbank als Hashwerte abgespeichert werden.

          Wobei sich mir nun die Frage stellt, wielange so ein Securitytoken überhaupt "lebensfähig" sein sollte, das fragte ich ja anderswo!

          Nun, auf jeden Fall wenn man in dem Beispiel dort (das ich individuell umbauen möchte) kommt man , wenn man den LOGOUT Button drückt auf eine Unterseite eben mit dieser Meldung, des weiteren ein Link "Zurück zum LOGIN" das man dann anlicken muss.

          Doch wenn ich zum Beispiel einen meiner E-Mail Hoster nehme, dann ist es dort fast überall so dass man auf das LOGIN kommt, mit eben dieser Meldung.

          Einfacher ist es natürlich mit der Zwischenseite, jetzt kommt es wohl darauf an WAS ICH WILL! Hmmmmmm.....

          Gruß T.

          1. Das Passwort muss ja vor der Anmeldung gespeichert sein: Damit Du es beim Login vergleichen kannst. Das Passwort nach einer Anmeldung erneut zu speichern ist unsinnig. Vielmehr muss nur gespeichert werden, ob ein Login erfolgreich war. Empfehlenswert natürlich zu speichern auch wer da angemeldet ist und ggf. welcher Benutzergruppe er angehört. Optional auch der Zeitstempel der Anmeldung. MFG

      2. Ne, wenn ich was mache, tu ich das nur für mich. Aber ich kann Dir ja mal meinen Perlcode+Template zeigen wie ich login/logout als Klasse umgesetzt habe. Sind nur 100 Zeilen. Willste?