Session soll im SMF Forum und auf meiner Seite funktionieren

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

  • Session soll im SMF Forum und auf meiner Seite funktionieren

    Ich kenne mich überhaupt nicht mit Sessions aus und habe bis jetzt einfach irgendeinen "zusammengekritzelten" Code verwendet, wo in der index.php (die für jede Unterseite verwendet wird) ganz am Anfang steht:

    PHP-Code:
    <?php
       session_start
    ();

       
    //...
    Nun will ich das SMF Forum nutzen, wo es diese spezielle Datei SSI.php gibt. Da gibt es mehrere Funktionen, mit denen man die Seite und das Forum verbinden kann. Zum Beispiel gibt es Funktionen, dass letzte Beiträge angezeigt werden oder die Benutzerdaten angezeigt werden etc.

    So ziemlich am Anfang in dieser SSI.php steht:
    PHP-Code:
    //...
    // Start the session... known to scramble SSI includes in cases...
    if (!headers_sent())
        
    loadSession();
    else
    {
        if (isset(
    $_COOKIE[session_name()]) || isset($_REQUEST[session_name()]))
        {
            
    // Make a stab at it, but ignore the E_WARNINGs generted because we can't send headers.
            
    $temp error_reporting(error_reporting() & !E_WARNING);
            
    loadSession();
            
    error_reporting($temp);
        }

        if (!isset(
    $_SESSION['rand_code']))
            
    $_SESSION['rand_code'] = '';
        
    $sc = &$_SESSION['rand_code'];
    }
    //... 
    Wie ich schon schrieb: Ich kenne mich kaum mit Sessions aus. Auf jeden Fall sind sich jetzt die Session in der Hauptseite und die Session in der SSI.php irgendwie im Weg. Wenn ich session_start(); ganz am Anfang in meinem Skript lasse, dann funktioniert die Session im Forum nicht. Und wenn ich session_start(); weglasse, dann funktionieren die Sessions auf der Hauptseite nicht. Weiter unten kann ich sie allerdings auch nicht einbauen, denn dann sind die Header-Dateien bereits gesendet.

    Was muss ich jetzt machen, damit die Session fürs Forum und für meine Hauptseite gelten?

    [color=red]EDIT by MRA: Sorry, das ich den [code]-Tag anstatt des [php]-Tags verwendet habe. Ich habe das sofort geändert, damit der Code auch farblich hervorgehoben wird.[/color]
    Zuletzt geändert von Mra; 30.12.2006, 00:09.
    [color=red]Meine Seite:[/color]
    American-Dad.de

  • #2
    [Funktion] Session-Funktionen vom SMF Forum

    Ich sehe gerade, dass loadSession(); gar keine vordefinierte Funktion ist. Im SMF Forum werden einige Session-Funktionen gesetzte:

    PHP-Code:
    // Attempt to start the session, unless it already has been.
    function loadSession()
    {
        global 
    $HTTP_SESSION_VARS$modSettings$boardurl$sc;

        
    // Attempt to change a few PHP settings.
        
    @ini_set('session.use_cookies'true);
        @
    ini_set('session.use_only_cookies'false);
        @
    ini_set('url_rewriter.tags''');
        @
    ini_set('session.use_trans_sid'false);
        @
    ini_set('arg_separator.output''&amp;');

        if (!empty(
    $modSettings['globalCookies']))
        {
            
    $parsed_url parse_url($boardurl);

            if (
    preg_match('~^\d{1,3}(\.\d{1,3}){3}$~'$parsed_url['host']) == && preg_match('~(?:[^\.]+\.)?([^\.]{2,}\..+)\z~i'$parsed_url['host'], $parts) == 1)
                @
    ini_set('session.cookie_domain''.' $parts[1]);
        }
        
    // !!! Set the session cookie path?

        // If it's already been started... probably best to skip this.
        
    if ((@ini_get('session.auto_start') == && !empty($modSettings['databaseSession_enable'])) || session_id() == '')
        {
            
    // Attempt to end the already-started session.
            
    if (@ini_get('session.auto_start') == 1)
                @
    session_write_close();

            
    // This is here to stop people from using bad junky PHPSESSIDs.
            
    if (isset($_REQUEST[session_name()]) && preg_match('~^[A-Za-z0-9]{16,32}$~'$_REQUEST[session_name()]) == && !isset($_COOKIE[session_name()]))
            {
                
    $_REQUEST[session_name()] = md5(md5('smf_sess_' time()) . rand());
                
    $_GET[session_name()] = md5(md5('smf_sess_' time()) . rand());
                
    $_POST[session_name()] = md5(md5('smf_sess_' time()) . rand());
            }

            
    // Use database sessions? (they don't work in 4.1.x!)
            
    if (!empty($modSettings['databaseSession_enable']) && @version_compare(PHP_VERSION'4.2.0') != -1)
                
    session_set_save_handler('sessionOpen''sessionClose''sessionRead''sessionWrite''sessionDestroy''sessionGC');
            elseif (@
    ini_get('session.gc_maxlifetime') <= 1440 && !empty($modSettings['databaseSession_lifetime']))
                @
    ini_set('session.gc_maxlifetime'max($modSettings['databaseSession_lifetime'], 60));

            
    // Use cache setting sessions?
            
    if (empty($modSettings['databaseSession_enable']) && !empty($modSettings['cache_enable']) && php_sapi_name() != 'cli')
            {
                if (
    function_exists('mmcache_set_session_handlers'))
                    
    mmcache_set_session_handlers();
                elseif (
    function_exists('eaccelerator_set_session_handlers'))
                    
    eaccelerator_set_session_handlers();
            }

            
    session_start();

            
    // Change it so the cache settings are a little looser than default.
            
    if (!empty($modSettings['databaseSession_loose']))
                
    header('Cache-Control: private');
        }

        
    // While PHP 4.1.x should use $_SESSION, it seems to need this to do it right.
        
    if (@version_compare(PHP_VERSION'4.2.0') == -1)
            
    $HTTP_SESSION_VARS['php_412_bugfix'] = true;

        
    // Set the randomly generated code.
        
    if (!isset($_SESSION['rand_code']))
            
    $_SESSION['rand_code'] = md5(session_id() . rand());
        
    $sc $_SESSION['rand_code'];
    }

    function 
    sessionOpen($save_path$session_name)
    {
        return 
    true;
    }

    function 
    sessionClose()
    {
        return 
    true;
    }

    function 
    sessionRead($session_id)
    {
        global 
    $db_prefix;

        if (
    preg_match('~^[A-Za-z0-9]{16,32}$~'$session_id) == 0)
            return 
    false;

        
    // Look for it in the database.
        
    $result db_query("
            SELECT data
            FROM 
    {$db_prefix}sessions
            WHERE session_id = '" 
    addslashes($session_id) . "'
            LIMIT 1"
    __FILE____LINE__);
        list (
    $sess_data) = mysql_fetch_row($result);
        
    mysql_free_result($result);

        return 
    $sess_data;
    }

    function 
    sessionWrite($session_id$data)
    {
        global 
    $db_prefix;

        if (
    preg_match('~^[A-Za-z0-9]{16,32}$~'$session_id) == 0)
            return 
    false;

        
    // First try to update an existing row...
        
    $result db_query("
            UPDATE 
    {$db_prefix}sessions
            SET data = '" 
    addslashes($data) . "', last_update = " time() . "
            WHERE session_id = '" 
    addslashes($session_id) . "'
            LIMIT 1"
    __FILE____LINE__);

        
    // If that didn't work, try inserting a new one.
        
    if (db_affected_rows() == 0)
            
    $result db_query("
                INSERT IGNORE INTO 
    {$db_prefix}sessions
                    (session_id, data, last_update)
                VALUES ('" 
    addslashes($session_id) . "', '" addslashes($data) . "', " time() . ")"__FILE____LINE__);

        return 
    $result;
    }

    function 
    sessionDestroy($session_id)
    {
        global 
    $db_prefix;

        if (
    preg_match('~^[A-Za-z0-9]{16,32}$~'$session_id) == 0)
            return 
    false;

        
    // Just delete the row...
        
    return db_query("
            DELETE FROM 
    {$db_prefix}sessions
            WHERE session_id = '" 
    addslashes($session_id) . "'
            LIMIT 1"
    __FILE____LINE__);
    }

    function 
    sessionGC($max_lifetime)
    {
        global 
    $db_prefix$modSettings;

        
    // Just set to the default or lower?  Ignore it for a higher value. (hopefully)
        
    if (!empty($modSettings['databaseSession_lifetime']) && ($max_lifetime <= 1440 || $modSettings['databaseSession_lifetime'] > $max_lifetime))
            
    $max_lifetime max($modSettings['databaseSession_lifetime'], 60);

        
    // Clean up ;).
        
    return db_query("
            DELETE FROM 
    {$db_prefix}sessions
            WHERE last_update < " 
    . (time() - $max_lifetime), __FILE____LINE__);

    Es tut mir wirklich sehr leid, dass ich so einen langen Code poste, aber ich verstehe kaum etwas von Sessions. Von diesen Funktionen verstehe ich leider überhaupt nichts.
    [color=red]Meine Seite:[/color]
    American-Dad.de

    Kommentar


    • #3
      Sorry, ich habe ja schon viel gesehen...
      aber die drehen ja wirklich an jedem Rädchen....
      Schon klar, wenn dort verschiedenste Sessionhandler gesetzt werden, daß sich das beißt...

      Eigendlich scheint es nur 2 Möglichkeiten zu geben:
      1. Du ordnest deinen Kram diesem Sessiongehampel unter
      2. Du operierst den ganzen Wasserkopf aus dem Forum raus
      Wir werden alle sterben

      Kommentar


      • #4
        Original geschrieben von combie
        Sorry, ich habe ja schon viel gesehen...
        aber die drehen ja wirklich an jedem Rädchen....
        Schon klar, wenn dort verschiedenste Sessionhandler gesetzt werden, daß sich das beißt...

        Eigendlich scheint es nur 2 Möglichkeiten zu geben:
        1. Du ordnest deinen Kram diesem Sessiongehampel unter
        2. Du operierst den ganzen Wasserkopf aus dem Forum raus
        Danke für deine Antwort.

        Ich verstehe leider nichts von Sessions, deshalb kann ich keine deiner 2 Möglichkeiten anwenden. Vielleicht könntest du mir da helfen. Ich würde es wirklich gerne versuchen, aber ich verstehe rein gar nichts von dem Code: Warum der Code nicht so toll ist, warum das nicht funktioniert etc.

        Doch was ich mir dazu überlegt habe: Es wäre sicherlich gut, alles zu optimieren. Bei SMF sitzen ja auch nur Menschen. Die Sicherheit sollte jedoch nicht darunter leiden.

        Ich wäre aber auch schon sehr glücklich, wenn du mir sagst, wie man eigene Sessions dem System von SMF unterordnet, damit ich es verwenden kann.

        [color=red]EDITED by MRA: Das nächste Problem mit dieser SSI.php: Die Coderung funktioniert nicht mehr. Statt ö wird z. B. ö gezeigt.[/color]
        Zuletzt geändert von Mra; 30.12.2006, 02:15.
        [color=red]Meine Seite:[/color]
        American-Dad.de

        Kommentar


        • #5
          Statt ö wird z. B. ö gezeigt.
          Meist: Ein utf8 Text wird in irgendeiner 8Bit Codierung präsentiert.. z.B. iso-latin
          Und in utf8 besteht so ein ö Zeichen halt aus 2 Byte(16Bit)

          2 völlig verschiedene Scripte "vernünftig" zu verbinden, kann echt Arbeit sein...
          1. gibts denn kein Forum für das Forum
          2. Zu wenig Information
          3. zu wenig Zeit (ist Geld)
          4. steck das Forum in ein iframe, dann sollte es gehen..
          Also gebe ich auf....
          Tut mir leid...
          Wir werden alle sterben

          Kommentar


          • #6
            Theoretisch müsstest du einfach nur die SSI.php includieren, da wird ja dann loadSession() aufgerufen, danach kannst du $_SESSION in deinem Code verwenden. Wenn nicht (s.o. "geht nicht"), musst du mal ein paar Testausgaben machen

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              Original geschrieben von ghostgambler
              Theoretisch müsstest du einfach nur die SSI.php includieren, da wird ja dann loadSession() aufgerufen, danach kannst du $_SESSION in deinem Code verwenden. Wenn nicht (s.o. "geht nicht"), musst du mal ein paar Testausgaben machen
              Genau das ist das Problem, dass es so nicht funktioniert. So gilt $_SESSION nur für das Forum. Die Session auf der Hauptseite wird ignoriert.
              [color=red]Meine Seite:[/color]
              American-Dad.de

              Kommentar


              • #8
                testausgaben?

                erwarte nicht, dass das ganze mit 3 zeilen code, den du nichtmal verstehen, sondern nur einfügen müsst, erledigt ist.

                Kommentar

                Lädt...
                X