Just nu i M3-nätverket
Gå till innehåll

Session och If else sats problem!


Dieselmannen

Rekommendera Poster

Dieselmannen

Hej!

Är nybörjare!

Jag vill göra en enkel if else sats med session i!

 

<?php if ($HTTP_SESSION_VARS['username'] != NULL); ?>

 

Här skall den skriva ut en länk om Sessionen Username finns!

 

<?php else ?>

 

 

Ett till problem!

Jag vill göra en redirect om sessionen username finns, och det är redan en start session på sidan!

För det är samma sida som man skall logga in på!

 

 

Någon som vet vart jag skall leta i PHP manualen eller har en lösning på problemet, Ja är tyvärr inkörd på ASP!

 

 

Det är lättare att vara klok efter, än efterklok före.

 

Länk till kommentar
Dela på andra webbplatser

Grrr! Jag hade skrivit ett jättelångt och detaljerat inlägg, och då lyckades Eforum tappa bort det, och jag kunde inte heller gå tillbaka och hämta det igen.

 

Jaja, jag har inte tid att skriva om det just nu, men om ingen svarat när jag kommer tillbaka så ska jag göra det (igen).

 

 

Länk till kommentar
Dela på andra webbplatser

Dieselmannen

He he he, Förlåt, men det är ju typiskt, Murphys Lag, Lagen om alltings jävlighet!

 

Länk till kommentar
Dela på andra webbplatser

Jag vill göra en redirect om sessionen username finns, och det är redan en start session på sidan!

För det är samma sida som man skall logga in på!

Jag förstår inte riktigt vad du menar faktiskt.

 

Men här är ett enkelt, om än komplett, sessionsexempel.

I nya versioner har sessions-variabeln bytt namn till $_SESSION.

<?php

/* Starta session */
/* Måste vara högst upp i skriptet */
session_start();

/* Se om besökaren försöker logga in */
if (@$_POST["loggain"])
{
/* Kontrollera om användarnamn och lösenord överensstämmer */
/* Kan utökas till att kontrollera från en databas */
if (@$_POST["anv"] == "login" && @$_POST["losen"] == "lösenord")
{
$_SESSION["användarnamn"] = $_POST["anv"];
}
else
{
echo "Felaktigt användarnamn och/eller lösenord.";
}
}

/* Om användaren är inloggad */
if (@$_SESSION["användarnamn"])
{
?>
Inloggad.
<?php
}

/* Visa inloggningsformulär */
else
{
?>
<form method="post">
<input type="text" name="anv" /><br />
<input type="password" name="losen" /><br />
<input type="submit" value="Logga in" /><br />
<input type="hidden" name="loggain" value="1" />
</form>
<?php
}
?>

 

Länk till kommentar
Dela på andra webbplatser

Dieselmannen

Du förstod mig!

Jag var ute efter detta!

 

-----------------------------------

session_start();

if (@$_SESSION["Username"])

{

 

header ("Location: admin/default.php");

}

-----------------------------------

 

Och detta!

-----------------------------------

<?php session_start();

if (@$_SESSION["Username"]);

{

?>

<a href=admin/nyheterna.php?id=10>Ändra denna nyhet</a>

<?php } ?>

-----------------------------------

 

fast på den senare får jag ett felmeddelande!

-----------------------------------

Warning: session_start(): Cannot send session cache limiter - headers already sent

 

Du kanske vet vad det beror på?

 

 

Länk till kommentar
Dela på andra webbplatser

Du har skrivit ut något i php-skriptet innan du anropar session_start().

 

Det kan räcka med en tom rad före <?php

 

Det är just därför det alltid måste ligga i början av skriptet.

Samma sak gäller en header(). Du måste se till så att INGET skrivs ut innan du anropar den funktionen.

 

För att en header("Location: ...") ska fungera i alla webbläsare måste du anropa exit() direkt efter:

header("Location: admin/default.php");

exit;

 

Länk till kommentar
Dela på andra webbplatser

Dieselmannen

<?php session_start();

if (@$_SESSION["Username"]);

{

?>

 

Ligger i början sv scriptet men inte i början av sidan!

Hoppas att det ok?

 

Och header funkar klockrent!

 

Länk till kommentar
Dela på andra webbplatser

Nej, det är inte okej.

 

Här det gäller dokument som skickas med protokollet HTTP (vilket nästan alla webbsidor gör), så skickas sidhuvuden ut först (header) och sedan dokumentinnehållet.

 

session_start() försöker skicka ut en header(), men kan inte det om du redan börjat skriva ut sidan.

 

header() och session_start() måste därför ALLTID komma innan några andra utskrifter. Basta! ;)

 

Sedan bör du ta för vana att alltid anropa exit() efter header(). Det kanske fungerar för dig som kör IE, men om en besökare har Opera så kommer denne bara få upp en tom sida, och inget händer.

 

Länk till kommentar
Dela på andra webbplatser

Dieselmannen

Jag förstår......inte!

Jag har gjort så här!

<?php session_start();?>

Överst på sidan!

 

Sedan mitt i sidan inom all HTML och en massa PHP så kommer detta!

 

<?php if (@$_SESSION["Username"]);

{

?>

<a href=admin/nyheterna.php?id=>&Auml;ndra denna nyhet</a>

<?php }?>

 

Och då syns länken trots att jag är utloggad!!

 

Och en sak till, Vad gör Snabela:et, (@$_SESSION...

 

 

 

Länk till kommentar
Dela på andra webbplatser

Snabela:et gör så att eventuella felmeddelanden undantrycks och inte visas. (http://se.php.net/manual/en/language.operators.errorcontrol.php)

 

Jag förstår......inte!

Jag har gjort så här!

<?php session_start();?>

Överst på sidan!

Är det verkligen absolut ingenting överst på sidan? Det får alltså inte ens vara ett blanksteg innan detta kommer.

 

--

Some say I am crazy.. but the Voices in my head disagree...

 

Länk till kommentar
Dela på andra webbplatser

Dieselmannen

Jag lovar på heder och samvete!!

Men skall det inte vara typ, If (@$_SESSION[username']); == ""

 

Eller nåt, man talar ju inte om att det inte skall vara något värde, kanske > 0 eller nåt!

 

Länk till kommentar
Dela på andra webbplatser

Att du ser länkenm trots att du är utloggad beror då antagligen på att du inte är utloggad ;)

 

Hur vet du att du är utloggad?

session_start() sätter automatiskt en kaka på din dator. Som standard (tror jag) den går ut först när du stänger webbläsaren.

 

För att logga ut en användare och ta bort dennes session gör du så här:

session_start();
session_destroy();
unset($_SESSION);

 

Länk till kommentar
Dela på andra webbplatser

Nej faktiskt inte, om $_SESSION['username'] innehåller någon data så kommer den if satsen bli true, i annat fall blir det false och således går inte PHP in där.

 

Du kan även köra med isset funktionen, vilket jag själv föredrar i den här situationen, (http://se.php.net/manual/en/function.isset.php) för att se om det finns någon data i sessionen.

 

[redigerat]Ett kommatecken gjorde min text lite mer läsbar[/redigerat]

 

--

Some say I am crazy.. but the Voices in my head disagree...

 

[inlägget ändrat 2003-05-02 22:09:00 av Bj0rN]

Länk till kommentar
Dela på andra webbplatser

TicoRoman
<?php if (@$_SESSION["Username"]);

{

?>

Hmm ta bort ; efter if-satsen. Den ska nog inte vara där.

 

Istället för att testa om $_SESSION["Username"] _finns_, så kan du kolla om den tilldelats ett värde genom if (isset($_SESSION["Username"])) { }

 

 

_________

TicoRoman - Anfall är bästa försvar

 

[inlägget ändrat 2003-05-02 22:08:32 av TicoRoman]

Länk till kommentar
Dela på andra webbplatser

Men skall det inte vara typ, If (@$_SESSION[username']); == ""

 

Eller nåt, man talar ju inte om att det inte skall vara något värde, kanske > 0 eller nåt!

Nej, i PHP har du inga fasta variabeltyper, om du inte definierar just vilket variabeltyp som ska användas i givet tillfälle.

 

Det betyder att en sträng likaväl kan vara ett heltal eller en boolean.

 

Alltså om du har en tom sträng så är den samma sak som false, och om den inte ens är definierad är den också false.

 

Du behöver därför ingen sådan jämförande del i en if-sats i PHP.

Jättebra tycker jag (kompaktare och enklare kod)!

 

Länk till kommentar
Dela på andra webbplatser

Suck! Att jag missade den enkla...

Jag såg att han hade gjort det felet i sin första kod, men trodde att han sedan kopierat min felfria ;)

 

Men sedan måste jag säga emot dig Almir. Det finns inget bättre med isset($_SESSION["Username"]) istället för bara @$_SESSION["Username"].

Snarare tvärtom. Läs mitt tidigare inlägg ovan.

 

Länk till kommentar
Dela på andra webbplatser

Ja, se där... jag trodde oxå att det var rättat och tänkte inte mycket över det på det inlägg jag svarade på heller! :)

 

Troligen är det detta som är felet!

 

--

Some say I am crazy.. but the Voices in my head disagree...

 

Länk till kommentar
Dela på andra webbplatser

TicoRoman
Det finns inget bättre med isset($_SESSION["Username"]) istället för bara @$_SESSION["Username"].
Du har nog rätt tror jag, när jag tänker efter. Det är nog en smaksak ;)

 

 

_________

TicoRoman - Anfall är bästa försvar

 

Länk till kommentar
Dela på andra webbplatser

Dieselmannen

Jag ber om Ursäkt Cariad!

Ja det funkar nu, trots att det stod någonstans att man alltid skall ha ; efter en kodsträng i PHP!

Jag gillar det inte ännu!, men det kanske kommer!(ASP är det som gäller...)

 

Tack för all hjälp!

Det är lättare att vara klok efter, än efterklok före.

 

Länk till kommentar
Dela på andra webbplatser

TicoRoman
trots att det stod någonstans att man alltid skall ha ; efter en kodsträng i PHP!
Jo, det ska man ha efter funktioner, men inte precis överallt. Tex ska man inte ha det efter if-satser, for-loopar osv... Ett ; där sabbar satsen/loopen, eftersom den då i själva verket hamnar _mitt i_ en kodsträng.

 

Se följande exempel:

 

(FEL)

if ($var = 1);

{

echo "Hej!";

}

 

(RÄTT)

if ($var = 1)

{

echo "Hej!";

};

 

dvs if-satsen är slut först efter }

 

_________

TicoRoman - Anfall är bästa försvar

 

[inlägget ändrat 2003-05-02 22:25:03 av TicoRoman]

Länk till kommentar
Dela på andra webbplatser

Tack för all hjälp!
Den här tråden blev mer en komplett undervisning i sessioner (vilket är bra). Något man kan referera till vid framtida frågor.

 

Almir, du är ju moderator, och kan ändra i inlägg även om det finns svar på dem.

Finns det inte någon möjlighet att du kan starta en tråd där vi sparar alla jättenyttiga tips, utan allt runtomkringtjafs? ;)

 

Har sett att det varit uppe för diskussion tidigare med en sådan funktion över hela forumet, men inget verkar ju hända på den fronten ;)

 

[Ändrat] Stavfel.

 

[inlägget ändrat 2003-05-02 22:26:03 av Cariad]

Länk till kommentar
Dela på andra webbplatser

Men sedan måste jag säga emot dig Almir. Det finns inget bättre med isset($_SESSION["Username"]) istället för bara @$_SESSION["Username"].

Nu är inte jag någon superexpert på hur PHP hanterar garbage. Dvs, om nu $_SESSION['Username'] hade varit tom så hade en varning kommit fram (om man har varningar igång), detta läggs in i error variabeln och tar minne. Jo, jag vet, inte mycket minne, men ändå. :)

 

Det vette sjutton om det är bättre att framkalla en varning än att på ett snabbt sätt kolla om variabeln innehåller någon data öht... Att köra med @ tecken är säkert snabbare, men själv använder jag nog hellre isset för att jag då vet om det finns något värde alls där.

 

Ponera att variabeln innehåller värdet 0. Detta är ju faktiskt ett värde, men i @$_SESSION['Username'] fallet kommer ändå if satsen tolka detta som att det inte finns något. OK, isset fallet kommer även tolka en tom sträng i variabeln som att det finns data, men det kan man ju sköta elegant genom att inte tilldela värdet om det inte finns. (Förvisso kan man sköta det elegant om värdet är 0 oxå....)

 

Ja, jag vet inte.... själv använder jag nog isset eftersom det känns som att jag har mer kontroll över min kod då. Det är nog en smaksak vilket sätt man använder tror jag...

 

--

Some say I am crazy.. but the Voices in my head disagree...

 

Länk till kommentar
Dela på andra webbplatser

TicoRoman
Almir, du är ju moderator, och kan ändra i inlägg även om det finns svar på dem.

finns det inte någon möjlighet att du kan starta en tråd där vi sparar alla jättenyttiga tips, utan allt runtomkringtjafs? ;)

Inte helt omöjligt. Vi har ju den där tråden där du gick igenom ett par grejer (sessioner, osv...) som jag ibland brukar referera till. Vi kanske kan fortsätta på den?

 

Har sett att det varit uppe för diskussion tidigare med en sådan funktion över hela forumet, men inget verkar ju hända på den fronten ;)
Det är en del av version 5 av eForum. Tanken var att denna FAQ redan nu ska byggas upp och innehålla en hel del frågor innan eForum 5 lanseras, men det är tyvärr inte särkilt många frågor som lagts dit.

 

 

_________

TicoRoman - Anfall är bästa försvar

 

Länk till kommentar
Dela på andra webbplatser

Ja, jag vet inte.... själv använder jag nog isset eftersom det känns som att jag har mer kontroll över min kod då. Det är nog en smaksak vilket sätt man använder tror jag...
Självklart är det en smaksak, men när jag föredrog @ före isset() talade jag inte generellt, utan just i detta fall.

 

Ibland är det definitivt bättre med isset(), men i detta fall föredrar jag @.

 

Jag har dock svårt att argumentera emot ditt resonemang angående feltext-lagringar. Det är ju som du säger, men å andra sidan har jag för mig att den bara sparar felkoden, och hämtar texten vid utskrift.

Alltså kanske vi talar om en/två byte i minnesanvändning, att jämföra med det samma, fastän flera omskrivningar om vi ska använda oss av isset($_SESSION["Username"]) && $_SESSION["Username"] != "".

 

 

Länk till kommentar
Dela på andra webbplatser

Dieselmannen

Jag som i går började med PHP skulle gärna läsa att det finns nån sån kanal med bra inlägg sparade!

 

Det är ju som återkommande vad man vill ha tag i för grejs!

 

I asp heter det dim, men hur e det i PHP?

Jag testade

<?php SESSION_START()

if (@$_SESSION['Username'])

{

$minvariabel = "ok";

}?>

 

Då borde detta funka också?

<?php

if $minvariabel = "ok"

{?>

Länk till sidan!

<?php }?>

 

 

Det var detta som jag inte fattade med { ?>Att man kan skriva här! och avsluta med <?php } ?>

 

 

[inlägget ändrat 2003-05-02 22:42:50 av Dieselmannen]

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...