Jörgen HPMedlem sedan feb. 20012 179 inlägg
Hej!
jag har följande absolut högst upp på sidan. Ingen HTML och inga blankrader:
<?php
session_start();
$inloggad = $_SESSION['userId'];
if ( !isset($inloggad) || strlen($inloggad) == 0 ) {
header ( "Location: [url]http://www.domän.nu/error.php[/url]" );
}
?>
ändå får jag:
Warning: Cannot add header information - headers already sent...
Uppdaterar jag sedan sidan fungerar det utan varning.
Hur fasiken kommer jag ifrån detta :q
MatteMedlem sedan aug. 20002 970 inlägg
Vad får du för resultat om du provar med:
<?php
session_start();
if ( !isset($_SESSION['userId']) || strlen($_SESSION['userId']) == 0 ) {
header ( "Location: [url]http://www.domän.nu/error.php[/url]" );
}
?>
Jörgen HPMedlem sedan feb. 20012 179 inlägg
Det verkar fungera. Men ändå inte helt tillfredställande.
Två frågor:
- Det verkar vara jäkligt instabilt. På sidan innan gör jag en kontrollutskrift av sessionvärdet för att försäkra mig om att ett värde finns. Och ett värde finns, i mitt fall nummer 1. Men ena gången laddar den sidan bra, utan varningen ovan, nästa gång skickar den mig till felsidan trots att den skrev ut sessionens värde på sidan innan.
Vad kan detta bero på?
- Efter din ändring (matte) kan jag ju inte använda sessionvärdet längre ner på sidan. Hur gör jag lämpligst för att kunna göra detta på hela sidan?
Tackar på förhand!
mvh Jörgen HP
WebslaveMedlem sedan maj 2002662 inlägg
Jag kör så här och det funkar för mig:
if(!($_SESSION['username'] || $_SESSION['passsword'] || $_SESSION['userID'])){
header ("location: error.php");
}
MatteMedlem sedan aug. 20002 970 inlägg
1.
Själv har jag aldrig haft några som helst problem med det, men två funderingar.
a: header() skickar iväg till annan sida, men kanske inte absolut omedelbart, så innan den skickas vidare hinner några rader längre ned i skriptet att köras. Dessa kan strula till det för dig. Ta för vana att raden efter header() skriva exit; för att avbryta skriptet.
b: För du sessionsvariabeln med dig i url-en. Ifall du gör det så kommer sessionen att tappas om du går till en sida som inte har session_start().
Detta kan t.ex ske om webbläsaren inte tillåter cookies eller du har session.use_cookies=0 i din php.ini.
2.
det finns inget i den kodsnutten som skulle kunna påverka sessionshanteringen längre ned. Allt det gör är att kolla om sessionsvariabeln finns och i såfall hur lång den är.
Du kan testa en lite förenklad form:
<?php
session_start();
if ( !isset($_SESSION['userId'])) {
header ("Location: [url]http://www.domän.nu/error.php[/url]");
exit;
}
?>
Det här ska inte göra någon större skillnad, så fortsätter det att spöka så vore det bra om du kunde visa lite mer kod. Annars får du ta en titt på inställningar för sessioner i din php.ini.
snake_vbgMedlem sedan aug. 200228 inlägg
Vad har du mer i detta dokumentet?
Du får Headers has already been sent by "header.inc" eller vad det säger
det är ju att header information redan är skickat
vad jag gör är att jag enbart gör PHP cod i ett separat dokument när
jag skickar sessions eller cookies för då krockar det inte med annan HTML kod eller Headers som redan är satta.
Jörgen HPMedlem sedan feb. 20012 179 inlägg
Okey, php.ini är inställt på följande:
session.use_cookies = On
den övre biten på sidan är PHP, resterande är enbart HTML, än så länge. Koden ser ut enligt följande:
<?php
// *** inkludera sessionhantering ***
include "$DOCUMENT_ROOT/includes/session_secret.php";
// *** kolla så att det finns ett id i adressraden, annars skicka till indexsidan ***
if ( !isset($id) || !is_numeric($id) || strlen($id) == 0 ) {
header ( "Location: [url]http://www.domän.nu/index.php[/url]" );
}
?>
Sedan inkluderingsfilens innehåll är enligt följande:
<?php
session_start();
if ( !isset($_SESSION['userId']) || strlen($_SESSION['userId']) == 0 ) {
header ( "Location: [url]http://www.domän.nu/not_member.php[/url]" );
}
?>
Jag ska prova lägga till exit; samt skära bort strlen kontrollen.
mvh Jörgen HP
Jörgen HPMedlem sedan feb. 20012 179 inlägg
Nu kör jag denna:
<?php
session_start();
if ( !isset($_SESSION['userId'])) {
header ("Location: [url]http://www.domän.nu/error.php[/url]");
exit;
}
?>
Trots att jag vet att ett sessionvärde finns på sidan innan blir jag skickad till errorsidan :(
Jag skapar min session på följande vis. ska lägga till en extra kontroll med ip-jämförelse också så fort jag fått rätt på detta.
session_start();
$userId = $row['AnvId'];
$userName = $row['req_Username'];
$level = $row['Level'];
session_register("userId", "userName", "level");
MatteMedlem sedan aug. 20002 970 inlägg
Två frågor som kan ha betydelse.
1. Vilken version av php kör du ?
2. Är register_globals i din php.ini satt till On eller Off ?
Jörgen HPMedlem sedan feb. 20012 179 inlägg
PHP version 4.2.2
register_globals = On
mvh Jörgen HP
Jörgen HPMedlem sedan feb. 20012 179 inlägg
Jag provade nu att gå till sidan 20 ggr i rad. 14 av dessa besök blev jag skickad till errorsidan, 6 gånger kom jag in perfekt utan beskymmer eller felmeddelande.
Jag kom att tänka på en sak som vissa haft problem med i ASP. Jag har menyer mm dynamiskt och länkar därmed till full adress, dvs hela http://www......
Kan den tolka det som att man kommer till ny domän och därmed avbryta eller neka en session?
Jörgen HPMedlem sedan feb. 20012 179 inlägg
Problemet är löst!
Först vill jag rikta ett STORT tack till er alla som hjälp till, speciellt Mattes genomarbetade svar!
Ni som är intresserade av vad som skapade problem kan läsa här:
http://support.levonline.com/support.cgi?content=phpsession#phpsession
Att man inte tittar där med en gång. :r :OO
Jörgen HPMedlem sedan feb. 20012 179 inlägg
Nya bekymmer
Hej!
Jag har råkat ut för nya problem. Nu vill inte mina sessions avbrytas vid utloggning.
Hur tar jag död på aktuell session vid utloggning?
Jag använder följande kod:
<?php
session_start();
session_unset();
session_destroy();
Header("Location: [url]http://www.domän.com/utloggad.php[/url]");
Exit;
?>
Observera i min länk ovan att jag får specificera var mina sessions ska sparas pga att servern är lastbalanserad. För mer information läs länken nedan:
http://support.levonline.com/support.cgi?content=phpsession#phpsession
ini_alter("session.gc_maxlifetime", "3600"); //1 timme
ini_alter("session.cache_expire", "3600"); //1 timme
ini_alter("session.save_path", "$DOCUMENT_ROOT/../data/sessions");
mvh Jörgen HP
MatteMedlem sedan aug. 20002 970 inlägg
I och med att du flyttar katalogen där du sparar sessionen hoppas jag att du har dina ini_alter kommandon med på varje sida som arbetar med sessioner. Tror du behöver ha med dom före session_start().
Om du har det, prova med att ta bort dina sessionsvariabler samtidigt som du avslutar sessionen.
session_start();
foreach($_SESSION as $key => val){
session_unregister($key);
}
$_SESSION = array();
session_unset();
session_destroy();
Det rekommenderas i manualen att ta bort sessionsvariablerna samtidigt som sessionen förstörs. Koden ovan är lite overkill, men kanske hjälper.
Jörgen HPMedlem sedan feb. 20012 179 inlägg
Matte skrev:
I och med att du flyttar katalogen där du sparar sessionen hoppas jag att du har dina ini_alter kommandon med på varje sida som arbetar med sessioner. Tror du behöver ha med dom före session_start().
Jo, det har jag. :)
Ska tasta din kod, tack!
Jörgen HPMedlem sedan feb. 20012 179 inlägg
Tack matte! :D
Fick rätta till en liten miss i din kod, men annars fungerade det kalas!
Kod till er som kanske råkar ut för samma beskymmer. :)
<?php
ini_alter("session.gc_maxlifetime", "3600"); //1 timme
ini_alter("session.cache_expire", "3600"); //1 timme
ini_alter("session.save_path", "$DOCUMENT_ROOT/../data/sessions");
session_start();
$_SESSION = array();
foreach($_SESSION as $key => $val) {
session_unregister($key);
}
session_unset();
session_destroy();
Header("Location: [url]http://www.domän.com/logout.php[/url]");
Exit;
?>
Jörgen HPMedlem sedan feb. 20012 179 inlägg
Hej igen! ;)
Någon som haft problem med sessions i PHP och Nätskräp 4.x?
Den vill ej veta av sessions :(
PS. Ja, cookies är aktiverad. DS.
mvh Jörgen HP
Jörgen HPMedlem sedan feb. 20012 179 inlägg
Netscape tycker visst ej om när det står www i länken i menyn, då super den bort värdet på sessionen. När jag bytade till /katalog/sida.php blev den gladare. :D
mvh Jörgen HP