session_start();
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausgabe
ausgeben
befehl
beispiel
code
datei
fehler
fehlermeldung
header
http
logik
login
manual
output
session
status
stehen
test
url
warnung
-
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... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Poste bitte die genaue Fehlermeldung.
-
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 -
Hallo,
es könnte doch auch sein, dass in der php-config die Option session.autostart aktiviert ist. Prüf das mal mitphpinfo();
-
Vor allem würde mich mal interessieren, was login() macht.
-
@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 -
hi
man liest hier mehrfach den selben schwachsinn über session_start()!
z.B.:
definexsoftware schrieb: ...
ERLESENER schwachsinn! das funktioniert einwandfrei, auch ohne zusatzmassnahmen.
Beispiel:
$var = "bla";
session_start();
Status: Fehler
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 -
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. -
fabo schrieb:
es ist kein fehler, mehrere sessions zu starten. manchmal sogar nützlich! daher führt dieser code nicht zu fehler:
... Eine Fehlermeldung, dass session_start() bereits ausgeführt wurde, gibt es nämlich nicht ...
die ausgabe sieht so aus:<?php echo (session_start()); echo '<hr />'.(session_start());
1
also 2x 'true'.
----------
1
siehe dazu noch 'Rückgabewerte' und 'Changelog' im php-manual. -
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. -
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. -
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 -
definexsoftware schrieb:
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!
Von einer gut erklärten und PHP Tutorial Website:
<?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 -
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! -
definexsoftware schrieb:
bitte!
Danke!
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 -
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. -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage