webForumDet fria alternativet

Session

PHPur PHP

17 svar · 668 visningar · startad av Jörgen HP

Medlem sedan feb. 20012 412 inlägg
Frågan#1

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

Medlem sedan aug. 20002 975 inlägg
#2

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]" );
} 
?>
Medlem sedan feb. 20012 412 inlägg
#3

Det verkar fungera. Men ändå inte helt tillfredställande.

Två frågor:

  1. 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å?

  1. 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

Medlem sedan maj 2002647 inlägg
#4

Jag kör så här och det funkar för mig:

if(!($_SESSION['username'] || $_SESSION['passsword'] || $_SESSION['userID'])){
  header ("location: error.php");
}
Medlem sedan aug. 20002 975 inlägg
#5

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.

Medlem sedan aug. 200226 inlägg
#6

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.

Medlem sedan feb. 20012 412 inlägg
#7

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

Medlem sedan feb. 20012 412 inlägg
#8

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");
Medlem sedan aug. 20002 975 inlägg
#9

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 ?

Medlem sedan feb. 20012 412 inlägg
#10

PHP version 4.2.2

register_globals = On

mvh Jörgen HP

Medlem sedan feb. 20012 412 inlägg
#11

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?

Medlem sedan feb. 20012 412 inlägg
#12

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

Medlem sedan feb. 20012 412 inlägg
#13

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

Medlem sedan aug. 20002 975 inlägg
#14

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.

Medlem sedan feb. 20012 412 inlägg
#15

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!

Medlem sedan feb. 20012 412 inlägg
#16

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;
?>
Medlem sedan feb. 20012 412 inlägg
#17

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

Medlem sedan feb. 20012 412 inlägg
#18

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

140 ms totalt · 3 externa anrop · v20260731065814-full.8a4e7caf
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)