Sessions: Notice: Undefined index: lidid
Na een lange tijd ben ik weer eens begonnen met scripten en ik moet zeggen, ik ben weer verslaafd aan PHP ;-)
Maar even ter zaken, ik heb een oude website weer onder het stof vandaan gehaald en zit vol met fouten. (Naar mijn idee heeft deze website 2 jaar foutloos gedraaid, maar de nieuwe versie van PHP kan er niet lekker mee overweg)
Op mijn website werk ik met een inlog systeem door middel van sessions.
Zodra ik op mijn site kom zonder ingelogd te zijn verschijnt er een foutmelding:
Notice: Undefined index: lidid
Dit komt (volgens mij) omdat de session nog niet gevuld is met gegevens waardoor de lidid niet uit de database gehaald kan worden. Het is namelijk zo dat als je inlogt een session word aangemaakt met daarin een ID van de persoon die inlogt, deze session word op elke pagina gebruikt om de gegevens op te kunnen vragen van de ingelogde persoon.
Kortom hoe kan ik ervoor zorgen dat ik deze foutmelding niet krijg.
Welk stukje code willen jullie zien waardoor mijn verhaal duidelijker wordt?
Met vriendelijke groet,
Paul
P.s. Misschien moet ik maar een cursus sessions volgen..
Gewijzigd op 01/01/1970 01:00:00 door Paul
Het wordt veroorzaakt doordat je een variabele of een array-key aanroept die niet bestaat. Voorbeeld:
Code (php)
Ik gebruik hier in de if namelijk een variabele die niet bestaat ($array['foo']). Ik zou dus eerst een controle moeten doen met isset() en/of empty().
Waarschijnlijk heb jij ook een constructie als hierboven, dat komt het meest voor. Bijvoorbeeld if ($_SESSION['foo']) in plaats van if (isset($_SESSION['foo'])).
Als je dus iets met die waarde doet zonder eerst zijn bestaan te controleren, dan krijg je een notice. De reden dat je het voorheen niet kreeg is omdat de error_reporting daar anders was; PHP liet geen notices zien.
Een notice verpest/doet niets, maar is niet netjes. In een taal als Java of C++ zou je complete "script" er uit knallen bij compileren als je een variabele gebruikt die niet bestaat, PHP is magisch.
Edit: het heeft dus niets met sessies of databases te maken. Gewoon nooit iets gebruiken zonder het eerst te controleren met isset() of empty(), vooral bij dingen als $_GET, $_POST, $_COOKIE en $_SESSION.
Gewijzigd op 01/01/1970 01:00:00 door PHP erik
Het kan inderdaad kloppen dat de error_reporting uit stond.
Mijn script werkt wel voor 99% op dit moment.
Natuurlijk kan ik de reporting uit zetten maar ik vind (zoals velen) het beter om de waarschuwingen eruit te halen.
Ik ben bekend met de isset(), dit heb ik namelijk de afgelopen dagen door heel mijn website aan moeten passen. Alleen toen ik het bij session deed werkte het inloggen niet meer.
Hier onder een klein stukje code waar het mis liep.
(ik weet dat de code dubbelzinnig is opgesteld, maar dit was even ter controle):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
require_once 'sessionstarted.php';
// check of de sessie nog niet is gestart
// als de sessie nog niet is gestart, roep dan session_start() aan
if ( false === session_started() )
{
session_start();
}
//Connectie met database maken
include('dbconnect.php');
//Gebruikers instellingen uit de database
$Sessionid = $_SESSION['lidid'];
$Lidinstelling = mysql_query("SELECT * FROM leden WHERE ID = '$Sessionid'");
?>
require_once 'sessionstarted.php';
// check of de sessie nog niet is gestart
// als de sessie nog niet is gestart, roep dan session_start() aan
if ( false === session_started() )
{
session_start();
}
//Connectie met database maken
include('dbconnect.php');
//Gebruikers instellingen uit de database
$Sessionid = $_SESSION['lidid'];
$Lidinstelling = mysql_query("SELECT * FROM leden WHERE ID = '$Sessionid'");
?>
Als ik dit deed in mijn script:
$Sessionid = isset($_SESSION['lidid']);
Dan krijg ik de foutmelding niet meer vooraf maar een fout na het inloggen dat de lid gegevens niet gevonden kunnen worden.
Met vriendelijke groet,
Paul
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
//Gebruikers instellingen uit de database
$Sessionid = $_SESSION['lidid'];
$Lidinstelling = mysql_query("SELECT * FROM leden WHERE ID = '$Sessionid'");
?>
//Gebruikers instellingen uit de database
$Sessionid = $_SESSION['lidid'];
$Lidinstelling = mysql_query("SELECT * FROM leden WHERE ID = '$Sessionid'");
?>
Dus je kunt zoiets doen:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
if (isset($_SESSION['lidid'])) {
//Gebruikers instellingen uit de database
$Sessionid = $_SESSION['lidid'];
$Lidinstelling = mysql_query("SELECT * FROM leden WHERE ID = '$Sessionid'");
}
?>
if (isset($_SESSION['lidid'])) {
//Gebruikers instellingen uit de database
$Sessionid = $_SESSION['lidid'];
$Lidinstelling = mysql_query("SELECT * FROM leden WHERE ID = '$Sessionid'");
}
?>
Wat je wil is eerst controleren of die hele session(key) bestaat, en als die bestaat dan wil je 'm gebruiken. Vandaar de controle met isset eerst. Als de session(key) nog niet bestaat, dan wordt het stukje script overgeslagen vanwege de if en krijg je geen notice.
Maar toch ben ik nieuwsgierig waarom jouw stukje wel werkt het het volgende niet:
Zie bovenstaand. Isset is een controlefunctie en returnt true of false en niet de waarde zelf.
Ik snap 'm helemaal! Dankjewel voor je duidelijke uitleg..