kostenloser Webspace werbefrei: lima-city


session_start();

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    gesichtsbook

    gesichtsbook hat kostenlosen Webspace.

    Wenn ich folgendes Script laufen lasse erhalte ich die meldung, dass bereits ein session_start() ausgeführt wurde...
    <?php
    session_start();
    include("mysql_connect.php");
    mysqlconnect();
    @ $ID = $_SESSION['member']['ID'];
    if($ID != ""){
    
    
    
    
                             $login = mysql_query("SELECT loginip FROM user WHERE ID LIKE '$ID'");
                             while($row = mysql_fetch_array($login))
                             {
                             $IP['member'] = array();
                             $IP['member']['loginip'] = $row['loginip'];
                             }
    
    
             if($_SERVER['REMOTE_ADDR'] != $IP['member']['loginip']) {
             include("function_logout.php");
             $destroy_ip = mysql_query("UPDATE user SET loginip = '' WHERE ID = '$ID'");
             logout();
             echo 'Ihre Sitzung ist leider abgelaufen. Sie können sich <a href="login.php">hier</a> wieder einloggen.';
             }
             elseif($_SERVER['REMOTE_ADDR'] == $IP['member']['loginip']){
             $fehler = 'Herzlich willkommen '.$_SESSION['member']['username'].'<br><br>Sie können sich <a href="logout.php">hier</a> ausloggen!!!';
             }
    
    
    
    
    
    }
    else
    {
    include("function_login.php");
    @ login($_POST['name'],$_POST['pw'],'');
    }
    ?>

    weder die function_login.php noch die mysql_connect.php enthallten ein session_start() ... hab ich iwo den denkfehler? hab heut 4 stunden gebastelt und keine lösung gefunden...
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Poste bitte die genaue Fehlermeldung.
  4. justarustyspoon

    justarustyspoon hat kostenlosen Webspace.

    Ich vermute, du meinst eine Meldung wie header already sent.
    Um das zu vermeiden darf vor session_start(); oder header(); keine Ausgabe an den Client geschehen, also keine Leerzeichen / Whitespacezeichen vor dem Beginn des Skripts, keine Ausgaben mit echo, print, print_r, var_dump usw. und du musst sicherstellen, dass deine Skriptdateien ohne BOM gespeichert werden. Das kannst du in deinem Texteditor einstellen. Zum Beispiel in Notepad++ unter Kodierung -> Konvertiere zu UTF-8 ohne BOM

    Beitrag zuletzt geändert: 14.2.2011 10:10:05 von justarustyspoon
  5. Hallo,

    es könnte doch auch sein, dass in der php-config die Option session.autostart aktiviert ist. Prüf das mal mit
    phpinfo();
  6. session_start ist soweit ich weiss nicht deaktiviert.

    Du solltest aber vielleicht mal auch die Codes der includeten Dateien hier posten, damit man sich ein vollständiges Bild machen kann.

    Beitrag zuletzt geändert: 16.2.2011 7:20:14 von karpfen
  7. Vor allem würde mich mal interessieren, was login() macht.
  8. definexsoftware

    definexsoftware hat kostenlosen Webspace.

    @gesichtsbook:

    Du darfst maximal 1x session_start(); aufrufen und vorallem NICHTS anderes vorher also vor sesson_start(); stehen haben.
    Ein Leerzeichen oder eine Variable ergeben einen Fehler.
    Beispiel:


    $var = "bla";
    session_start();

    Status: Fehler

    session_start();
    $var = "bla";

    Status: Funktioniert


    Soweit verstanden?
    Egal ob Du session_start(); in einer Hauptdatei verwendest und dann andere inkludierst, darf in den inkludierten nichts von session_start(); stehen. ;)


    Viele Grüße
  9. hi
    man liest hier mehrfach den selben schwachsinn über session_start()!

    z.B.:
    definexsoftware schrieb: ...
    Beispiel:

    $var = "bla";
    session_start();

    Status: Fehler
    ERLESENER schwachsinn! das funktioniert einwandfrei, auch ohne zusatzmassnahmen.

    was vielmehr die wahrheit darstellt: du darfst vor session_start() alles mögliche ausgeben und zwar jede menge! und so geht das!
    ich halte aber NICHTS DAVON. zu meinem stil gehört es, im ganzen programm eine einzige ausgabe zu machen, und zwar am ende, wo die ganze seite in einem ruck aus einer variable ausgegeben wird. gut für performance, lesbarkeit ... und gegen 'spagetticode' (hir programmiert fast ein jede[r] spagetticode! das liegt daran, dass es so an logik wie auch an verständnich mangelt. es ist aber behebbar - durchs lernen. nichts für ungut).

    lg
  10. Ich habe nicht umsonst nach der genauen Fehlermeldung gefragt. Eine Fehlermeldung, dass session_start() bereits ausgeführt wurde, gibt es nämlich nicht - Maximal, dass bereits Header gesendet wurden.

    Header auch nach einem Output zu senden, ist, wie hemiolos bereits schrieb, durchaus möglich. Manchmal auch unumgänglich.

    Und gegen Spaghetticode gibts was - Ein Framework. Denn dort ist man zu sauberem Code gezwungen.

    So lange der TE sich nicht äußert, wäre ich für eine Schließung des Threads.
  11. fabo schrieb:
    ... Eine Fehlermeldung, dass session_start() bereits ausgeführt wurde, gibt es nämlich nicht ...
    es ist kein fehler, mehrere sessions zu starten. manchmal sogar nützlich! daher führt dieser code nicht zu fehler:
    <?php
    echo (session_start());
    echo '<hr />'.(session_start());
    die ausgabe sieht so aus:
    1
    ----------
    1
    also 2x 'true'.
    siehe dazu noch 'Rückgabewerte' und 'Changelog' im php-manual.
  12. Nur, weil keine Fehlermeldung ausgegeben wird, hei0t es nicht, dass es kein Fehler ist:

    Ab PHP 4.3.3 resultiert der Aufruf von session_start() nachdem die Session vorher gestartet wurde in einem Fehler der Stufe E_NOTICE. Der zweite Start der Session wird in diesem Fall einfach ignoriert.


    Fehler ist Fehler ;) Ob nun Warnung oder kompletter Scriptabbruch.
  13. justarustyspoon

    justarustyspoon hat kostenlosen Webspace.

    fabo schrieb:
    Ich habe nicht umsonst nach der genauen Fehlermeldung gefragt. Eine Fehlermeldung, dass session_start() bereits ausgeführt wurde, gibt es nämlich nicht - Maximal, dass bereits Header gesendet wurden.



    Hiho.
    Wird session_start() aufgerufen obwohl PHP so konfiguriert ist, Sessions automatisch zu erzeugen kann man folgendes beobachten:

    Notice: A session had already been started - ignoring session_start() in __FILE__ on line __LINE__



    fabo schrieb:
    Und gegen Spaghetticode gibts was - Ein Framework. Denn dort ist man zu sauberem Code gezwungen.


    Das wäre wohl für den durchschnittlichen Lima-City Fragesteller ein Overkill der seines gleichen sucht. Spagetthi Code kann man auch mit einfachen Mittel verhindern, das erfordert nur Zeit und die Bereitschaft über das was man tut nachzudenken und es auch klug umzusetzen. Das hat hemiolos ja schon ausgeführt.

    fabo schrieb:
    Header auch nach einem Output zu senden, ist, wie hemiolos bereits schrieb, durchaus möglich. Manchmal auch unumgänglich.


    Ich denke du meinst das richtige, drückst es aber falsch aus. Wenn du von Output sprichst denke ich an eine Ausgabe an den Client. Eine Ausgabe an den Client zwingt den Webserver dazu, den HTTP Header abzuschicken, da dieser wie der Name sagt, vor dem Body des Pakets ausgeliefert wird, ist es danach eben nicht mehr möglich diesen zu ändern.
    Durch den PHP Output Buffer ist es lediglich möglich, die an den Client gedachten Ausgaben zu puffern, tatsächlich abgeschickt werden diese aber erst wenn der Buffer geleert wird, das passiert erst wenn eine dementsprechende Funktion aufgerufen oder das Skriptende erreicht wurde.
    Bei dem Ausgabe Puffer muss ich aber wieder an den durchschnittlichen Lima City Fragesteller denken, und da ist es kurzfristig wohl einfacher die Dinge etwas einfacher darzustellen.
  14. definexsoftware

    definexsoftware hat kostenlosen Webspace.

    Von einer gut erklärten und PHP Tutorial Website:

    Erste Schritte
    Ganz oben auf der Site, bevor wir irgend etwas ausgeben, egal ob mit PHP oder mit HTML, muss folgendes stehen:

    <?php
    session_start();
    ?>

    Mit session_start(); sagen wir dem PHP Script, dass diese Seite mit Session arbeitet.
    Dieser Code muss immer ganz oben stehen, wenn ihr mit irgendwelchen Session Befehlen arbeitet.

    Hier sind zwei mögliche Fehlerquellen:

    1. Cannot send session cookie - headers already sent by Wenn diese Fehlermeldung erscheint, dann ist irgendwo vor dem kleinen Script eine Ausgabe. Eine leere Zeile (Zeilenumbruch) oder ein Space reicht schon aus.

    2. Warning: session_start() [function.session-start]: open(...) failed: No such file or directory
    Wenn diese Warnung erscheint, dann ist der angegebene Pfad zur Speicherung der Session Datei nicht verfügbar.


    Somit ist mein Beitrag gar nicht so falsch!
    Gut es mag sein das es kein Session-Fehler ist, jedoch eine Warnung bzw. einen Fehler erzeugt.
    Abgesehen davon, was bringt es mehrere session_start(); aufzurufen wenn bereits eine aufgerufen wurde?

    Soweit ich das verstanden habe sagt der Befehl session_start(); das EINE NEUE SESSION gestartet werden soll, was der Logik nach also bei jedem weiteren Aufruf zu einer NEUEN SESSION führen dürfte.

    Beispiel 1:

    Code...
    Code...
    session_start();
    Code...

    = Cannot send session cookie - headers already sent by ...

    Beispiel 2:

    session_start();
    Code...
    Code...

    = Übermitteln der angeforderten Website OHNE Warnung bzw. Fehler

    Beispiel 3:

    session_start();
    Code...
    Code...
    Code...
    session_start();

    = Erzeugt 2 NEUE SESSIONS


    Sollte das reichen?
    Achja, noch die Tutorial Website: www.php-einfach.de


    Viele Grüße
  15. definexsoftware schrieb:
    Von einer gut erklärten und PHP Tutorial Website:
    so, so! sehe den code hier mal an, probiere es aus und richte an dein tut schöne grüße von mir aus. und glaube es nicht, ich wäre der einzige wahnsinnige, der so etwas ungehäuerliches codet!

    <?php
    /**
     *  [LC] hemiolos.lima-city.de/session_start.php
     */
    error_reporting(E_ALL | E_STRICT);
    ob_start();
    
    $test = (isset($_POST['action']) && $_POST['action'] === 'test') ?
      '<p><hr /><h4>$_SESSION:</h4></p>':
      '<p><hr /></p>';
    
    // komplette seite VOR 'session_start()' ausgeben
    echo <<< EOT
    <html>
      <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <title>textausgabe vor session_start()</title>
      </head>
      <body>
        <h1>das geht auf alle fälle!</h1>
        <p>
          <form action="" method="post">
            <input type="submit" name="action" value="test" />
          </form>
        </p>
        <p>vor 'session_start()' wurde eine komplette seite ausgegeben.</p>
        $test
      </body>
    </html>
    
    EOT;
    
    
    // nach der seitenausgabe session starten:
    session_start();
    
    
    // wenn test
    if (isset($_POST['action']) && $_POST['action'] === 'test') {
      // etwas in die session reinschreiben
      if (!isset($_SESSION['test'])) {
        $_SESSION['test'] = 'TEST von ' . $_SERVER['REMOTE_ADDR'];
      }
      echo '<pre>' . print_r($_SESSION, true);
    }

    lg


    p.s.:
    1. die testausgabe ist zwar völlig irregulär, aber hierbei ist es irrelevant.
    2. wem am ende des codes '?>' fehlt, darf ein mulmiges gefühl haben :o) es ist trotzdem nicht nötig (öfters de.php.net lesen????).

    Beitrag zuletzt geändert: 20.2.2011 15:35:22 von hemiolos
  16. definexsoftware

    definexsoftware hat kostenlosen Webspace.

    Ich weiß wirklich nicht wieso sich Deine Meinung so felsenfest nur auf das beschränkt was nur Du zu glauben weißt?

    Tatsache ist das meine Aussage - ebenfalls auf DEINER angegebenen Homepage de.php.net geschrieben - auch stimmt und somit absolut korrekt ist.
    Hier ein Auszug aus der von Dir angegebenen Homepage:

    Hinweis:

    Um Cookie-basierte Sessions zu verwenden muss session_start() aufgerufen werden, bevor irgend etwas an den Browser geschickt wird.


    Was sagt uns das? session_start(); am besten als erstes aufrufen.


    Danke!
  17. definexsoftware schrieb:
    Danke!
    bitte!
    vielleicht habe unklar formuliert: du kannst vor session_start() alles mögliche machen, solange du das alles mögliche pufferst. (das hättest bemerkt, wenn du meinen code überhaupt aufmerksam durchgelesen hättest.)
    und bevor du meine worte in meinem munde umdrehst, oder sogar welche reintust, verinnerliche dir das hier, so dass du nachvollzien kanns, dass mein session_start() wohl VOR dem ganzen zeug davor ausgeführt wird. na dann gute nacht.

    lg
  18. definexsoftware schrieb:
    Soweit ich das verstanden habe sagt der Befehl session_start(); das EINE NEUE SESSION gestartet werden soll, was der Logik nach also bei jedem weiteren Aufruf zu einer NEUEN SESSION führen dürfte.

    Falsch. session_start() bedeutet nicht automatisch, dass eine neue Session gestartet wird. Die Funktion kann genauso eine vorhandene Session wieder aufnehmen, wenn ein passendes Sessioncookie gefunden wird. Das ist nämlich gerade der Sinn hinter Sessions.

    Bsp: Seite login.php erzeugt eine neue Session, die nächste Seite nach dem Login ruft zwar auch session_start() auf, da aber die Session schon erzeugt wurde (erkennt PHP an einem Cookie), wird die Session von login.php wieder aufgenommen.
  19. definexsoftware

    definexsoftware hat kostenlosen Webspace.

    Danke @ chatter.

    So habe ich das mit dem Befehl session_start(); nicht gesehen, habe nur gelesen - auf mehreren Seiten - das dieser Befehl eine neue Session startet.
    So wie Du das erklärst, kommt das logisch rüber.


    Grüße
  20. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!