Toon posts:

[PHP] Cookies werken half

Pagina: 1
Acties:

Verwijderd

Topicstarter
Lo tweakers,

Ik heb een registratie systeem gemaakt die gebaseerd is op cookies. Op zich was dat niet nieuw voor mij, maar de oude scripts waren wel weer aan verbetering toe, vandaar dat ik ff from scratch begonnen ben.

Op de frontpage staat nu een link naar login.php in een javascript popupje, maar als de cookies aangemaakt zijn wordt dit naar logout.php. In login.php staat nu dit:
PHP:
1
<?if ( isset( $form)){    include( "functions.php" );    $a = checklogin( $form[gebruikersnaam], $form[wachtwoord] );    if ( !empty( $a[id] ) &amp;&amp; !empty ($a[wachtwoord] ) &amp;&amp; !empty( $a[nickname] ))    {        setcookie( "userid", $a[id], "time()+7776000", "/" );        setcookie( "userpassword", $a[wachtwoord], "time()+7776000", "/" );        setcookie( "username", $a[nickname], "time()+7776000", "/" );                $message = "Succesvol ingelogd";            }    else    {        $message .= De gegeven inloginformatie is onjuist. Probeer het nogmaals.";    }}?>

Het script haalt de regel uit de tabel 'gebruikers' waar het wachtwoord en de gebruikersnaam gelijk zijn aan de ingevoerde gegevens (het formpje staat er uiteraard nog onder, maar beetje onnutig om die hieronder te plakken). Als de uitkomst van de query leeg is, dan worden de cookies niet geplaatst, maar wordt $message gevuld die bij het form weergegeven wordt. Anders worden ze wel geplaatst en het venstertje gesloten+main page gerefreshed (heb ik hier ff weggelaten). Als ik nu met $HTTP_COOKIE_VARS[userid] of één van de andere twee opvraag in login.php werkt dit perfect.

Maar als ik de main page refresh dan blijft er gelinkt worden naar login.php, het echo-en van $HTTP_COOKIE_VARS[0] heeft ook geen effect. Zowel login.php als de frontpage staan in de root directory op me HD. De cookies zijn ook niet te vinden op me HD...wie weet wat ik fout doe?

BTW, ja cookies zijn enabled in me browser :).

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Okee, probeer eens print_r($HTTP_COOKIE_VARS).
En die constructie snap ik ook niet helemaal? Wat ik zo zie ga je in main.php kijken of er een form is gepost, en anders een foutmelding geven? Als je form nou is gepost, dan worden die cookies gezet. Als je vervolgens main.php reload dan zijn de cookies wel gezet, maar dan is $form leeg, lijkt me...
Dus zet ff boven aan elke pagina print_r($HTTP_COOKIE_VARS) en maak ons blij met de output

Verwijderd

Topicstarter
Dit stukje code wat ik hierboven heb gepost is onderdeel van login.php. Hierbij hoort nog het formpje waarvan de input in $form, een array, gezet is.

Als er succesvol ingelogd is worden de cookies aangemaakt en wordt het bericht in $message gezet dat het gelukt is. Als het script eenmaal werkt zal ik dat weer vervangen voor een javascriptje dat het venster sluit en de main.php refresht zodat de cookies daar ook geladen worden. Nu refresh ik handmatig.

Ik heb nu, nadat er gecheckt is of de username klopt en de cookies gezet zijn, print_f($HTTP_COOKIE_VARS); toegevoegd. Hieruit komt gewoon: Array ( [3voted] => yes [5voted] => yes [8voted] => yes [12voted] => yes [userid] => 1 [userpassword] => *** (ff gehide) [username] => Wekko )

Dat klopt dus...die xvoted is een bepaald ID nummer waarbij al gevote is, staat los van het inlogscript. Maar als ik print_r($HTTP_COOKIE_VARS); op main.php zet krijg ik geen enkele output...staat wel in dezelfde (root) directory.

Verwijderd

Topicstarter
ik heb 't nu aangepast door het inlogscript niet in een apart popupje maar gewoon in de main.php te verwerken. Nu werkt het allemaal wel. Maar ik vraag me nog steeds af waarom?

Verwijderd

Topicstarter
hij doet het nog steeds niet goed :(. Met behulp van include(); heb ik templates gebouwd voor de site. include("top.php"); en bottom.php simpel gezegd. Als ik nu op het dynamische gedeelte de cookies opvraag (dus tussen de twee includes) dan werkt het. Maar vraag ik het op in de top.php, dan niet....

hoe fix ik dit?

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Op zondag 21 april 2002 20:00 schreef Frank83 het volgende:

Dat klopt dus...die xvoted is een bepaald ID nummer waarbij al gevote is, staat los van het inlogscript. Maar als ik print_r($HTTP_COOKIE_VARS); op main.php zet krijg ik geen enkele output...staat wel in dezelfde (root) directory.
Hou er rekening mee dat er een maximum is voor het te setten cookie per path, volgens mij ligt dat ergens op de 20.

Waarom gooi in userdata niet in 1 cookie, en hetzelfde met voted?
PHP:
1
<?if ( isset( $form)){    include( "functions.php" );    $a = checklogin( $form[gebruikersnaam], $form[wachtwoord] );    if ( !empty( $a[id] ) &amp;&amp; !empty ($a[wachtwoord] ) &amp;&amp; !empty( $a[nickname] ))    {        //setcookie( "userid", $a[id], "time()+7776000", "/" );        //setcookie( "userpassword", $a[wachtwoord], "time()+7776000", "/" );        //setcookie( "username", $a[nickname], "time()+7776000", "/" );        setcookie( "userdata", base64_encode(serialize($a)), "time()+7776000", "/" );         $message = "Succesvol ingelogd";        }    else    {        $message .= "De gegeven inloginformatie is onjuist. Probeer het nogmaals.";    }}?>

www.php.net/serialize geeft een string terug met daarin de complete array, gebruik unserialize om de array terug te krijgen.
www.php.net/base64_encode de string kan characters bevatten die niet in de header mogen worden verstuurt.

Programmer - an organism that turns coffee into software.


Verwijderd

Topicstarter
Dat van max 20 wist ik niet, toch wel handig dat je het zegt :).

Ik kan die voted gevallen niet echt makkelijk samen nemen. Dan zou ik na elke vote weer alle variabelen samen moeten voegen die aanwezig zijn en dan die variabelen + de nieuwe er weer in moeten stoppen. En ook niet vergeten de oude weg te halen. Maar met de user info moet het op zich wel kunnen. Ga het zo ff testen :). thanx.

Nu me probleem nog :).

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Op zondag 21 april 2002 20:59 schreef Frank83 het volgende:
hij doet het nog steeds niet goed :(. Met behulp van include(); heb ik templates gebouwd voor de site. include("top.php"); en bottom.php simpel gezegd. Als ik nu op het dynamische gedeelte de cookies opvraag (dus tussen de twee includes) dan werkt het. Maar vraag ik het op in de top.php, dan niet....

hoe fix ik dit?
include en require word door het systeem bezien als of het gewoon in de source code staat. Gebruik je de variablen daar anders? bv binnen een functie?
Heb je error_reporting (E_ALL) ?

Plaats anders de source code online liefst een phps dan kunnen we kijken..

Programmer - an organism that turns coffee into software.


Verwijderd

Topicstarter
error reporting E_ALL & ~E_NOTICE stond ie op, heb E_NOTICE weggehaald, dan geeft ie alleen maar aan dat de variabele $HTTP_COOKIE_VARS niet bestaat. Daar was ik al achter :).

De hele login.php source:
PHP:
1
<?include("functions.php");if ( isset( $form)){    $a = checklogin( $form[gebruikersnaam], $form[wachtwoord] );    if ( !empty( $a[id] ) &amp;&amp; !empty ($a[wachtwoord] ) &amp;&amp; !empty( $a[nickname] ))    {        setcookie( "userid", $a[id], "time()+7776000", "/" );        setcookie( "userpassword", $a[wachtwoord], "time()+7776000", "/" );        setcookie( "username", $a[nickname], "time()+7776000", "/" );                echo "<meta http-equiv=\"refresh\" content=\"0;URL=index.php\">";    }    else    {        $message = "<b><font color=#FF0000 face=verdana size=2>De gegeven inloginformatie is onjuist. Probeer het nogmaals.</b></font>";    }}includeall("log in" );?><table width=95% align=center border=0 bgcolor=#404040><form action="<? echo $PHP_SELF; ?>" method=post><tr>    <th colspan=2 class="white"><?php if ( isset( $message)) { echo "$message<br>"; } ?>Log in:</th></tr><tr>    <td class="white">Gebruikersnaam:</td>    <td><input type=text name="form[gebruikersnaam]" size=30 maxlength=15></td></tr><tr>    <td class="white">Wachtwoord:</td>    <td><input type=password name="form[wachtwoord]" size=30 maxlength=10></td></tr><tr>    <td>&amp;nbsp;</td>    <td><input type=submit value="Log in!"></td></tr></table><?phpinclude( "_bottom.php");?>

En dit staat in top.php (wat relevant is dan):
PHP:
1
<?if ( isset( $HTTP_COOKIE_VARS['userid'] ) &amp;&amp; isset( $HTTP_COOKIE_VARS[userpassword] ) &amp;&amp; isset( $HTTP_COOKIE_VARS[username]) ) {     $login = "<a href=\"logout.php\" class=\"white\">Log uit</a>";}else{    $login = "<a href=\"login.php\" class=\"white\">Log in / Registreer</a>";}echo $login;?>

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Plaats eens global $HTTP_COOKIE_VARS boven je if statement in top.php

Programmer - an organism that turns coffee into software.


Verwijderd

Topicstarter
Mijn dank is groot! Het werkt!

Ben je dan 2 uur mee bezig, zat ik er maar 1 functie'tje vandaan ;).

Allemaal bedankt!

  • tomato
  • Registratie: November 1999
  • Niet online
Het gebruik van $HTTP_COOKIE_VARS is deprecated. Gebruik $_COOKIE in plaats daarvan, deze variabele is ook altijd beschikbaar (magic global ofzo noemen ze het geloof ik).

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Maar veel mensen en hosters zijn nog 4.0.6 :/

Programmer - an organism that turns coffee into software.


Verwijderd

Topicstarter
Ik heb weer een soortgelijk probleem :(.

Tis dat ik nog geen toegang tot de ftp van de uiteindelijke webhost heb, want dan had ik 'm daar ff getest. Volgens mij ligt het namelijk gewoon aan PHPDev die ik hier gebruik...

Ik heb een reactie schermpje, wederom in een popupje, en ook daar zijn de variabelen niet in te lezen. Ook niet als ik global $HTTP_COOKIE_VARS; in de source zet. En aangezien $_COOKIES nog niet werkt in 4.0.6 kan ik dat ook niet gebruiken. Register_globals staan aan in de php.ini, dat is het in ieder geval niet.

Heeft iemand enig id wat het dan wel kan zijn?

Verwijderd

Topicstarter
Moet ik er dan maar van uit gaan dat het een of andere onverklaarbare bug is? :(

Verwijderd

Topicstarter
late reactie maar heb het eindelijk gevonden...

Ik gebruik editplus als txt editor. Hiermee kun je ook je pagina's testen. Daarbij gebruikt ie IE en [url="http://localhost/directory"]http://localhost/directory[/url]. Een popup is een apart venster buiten editplus, hiermee kan ie de cookies niet lezen. Als alles in dit leven nou eens zo eenvoudig was he...:)
Pagina: 1