[PHP] Undefined index & propertie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TangLeFuzZ
  • Registratie: Juni 2001
  • Laatst online: 28-05-2024
Hey,

als ik error_reporting op E_ALL heb staan, krijg ik de volgende notices;

Notice: Undefined property: stdClass::$userid in ........

Nu weet ik even geen nette manier om die notice weg te krijgen zeg maar, vind het ook een beetje onlogisch.

De notice komt voort uit een while loop van een query, waarin ik de vars uit de database in de class vars gooi.

PHP:
1
2
3
4
5
while ($record = mysql_fetch_object($result)) 
{
    $this->checkLogin = 1;
    $this->userId = $record->userid;
}


$record->userid; mag dus niet zomaar volgens PHP... maar ik kan die toch niet zomaar ergens netjes initialiseren of wel?

Hoe doen jullie dit?

[ Voor 4% gewijzigd door TangLeFuzZ op 19-02-2005 14:33 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Sowieso is mysql_fetch_assoc een stukje sneller. Verder mis ik een belangrijk stukje code: je query. Selecteer je wel het veld userid?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
$record->userid mag prima, mits er ook daadwerkelijk een userid-property is... Als ie userId, userID of UserID heet of gewoon niet bestaat krijg je uiteraard die waarschuwing.
En de notice betekent niet dat het "niet zomaar mag" alleen maar dat je naar een property van een object verwijst die niet bestaat... Notice is alleen maar een melding van iets dat fout is, maar verder geen invloed op de executie van de code heeft (wel eventueel op het resultaat van die executie).

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
waarom wil je velden uit een record initialiseren? dat lijkt me toch niet nodig als je hem gewoon goed ophaalt? doe anders eens een var dump op $record. je kunt ook gewoon in je query zien wat je ophaalt.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
djluc schreef op zaterdag 19 februari 2005 @ 14:40:
Sowieso is mysql_fetch_assoc een stukje sneller.
In dit geval lijkt het alsof de TS slechts 1 rij nodig heeft (loginscript ofzo). In dat geval zijn beide methoden overkill.

TS: kun je niet beter wat doen met mysql_result, in plaats van een mysql_fetch_object op 1 rij?

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

GlowMouse schreef op zaterdag 19 februari 2005 @ 15:32:
[...] TS: kun je niet beter wat doen met mysql_result, in plaats van een mysql_fetch_object op 1 rij?
Of mysql_fetch_row . Er zijn er nog wel wat denk ik :) .

DM!


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
JHS schreef op zaterdag 19 februari 2005 @ 15:52:
Of mysql_fetch_row . Er zijn er nog wel wat denk ik :) .
While() is eigenlijk het meest overbodig.

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Even afgezien van het feit dat een functie als bovenstaande geen notices zou hoeven genereren, is er wel een manier om specifieke Notices af te vangen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
define("ERR_LOG_SCREEN", 1);
define("ERR_LOG_FILE"  , 2);

define("ERR_LOG_LEVEL"  , E_USER_NOTICE);
define("ERR_LOG_METHOD" , ERR_LOG_SCREEN);

function errorHandler($errorType, $errorMessage, $filePath, $lineNo) {
    if($errorType <= ERR_LOG_LEVEL) {
        $errStr = $errorMessage.", in <b>".$filePath."</b> on line <b>".$lineNo."</b><br />";
        switch($errorType) {
            case E_NOTICE:
                if(strstr($errorMessage, "Undefined property") !== FALSE) return;
            case E_USER_NOTICE:
                $errStr = "<b>Notice:</b> ".$errStr;
                break;
            case E_WARNING:
            case E_USER_WARNING:
                $errStr = "<b>Warning:</b> ".$errStr;
                break;
            case E_ERROR:
            case E_USER_ERROR:
                $errStr = "<b>Fatal error:</b> ".$errStr;
                break;
        }
        
        if(ERR_LOG_METHOD & ERR_LOG_SCREEN) {
            print($errStr);
        }
        
        if(ERR_LOG_METHOD & ERR_LOG_FILE) {
            $errStr = strip_tags($errStr);
            $GLOBALS['errorlog']->msg($errStr);
        }
    }
}

error_reporting(E_ALL);
set_error_handler("errorHandler"); 

$foo = new stdclass;
echo $foo->bar;

$moo = array();
echo $moo[0];

trigger_error("dit is gewoon fout!", E_USER_ERROR);


Normaalgesproken zou op regel 41 een Notice gegenereerd worden, maar Notices van het type "Undefined property", worden niet gelogged (regel 12). De andere Notice op regel 44 wordt gewoon gemeld en met trigger_error (46) kun je ook nog eens custom error messages genereren.
Pagina: 1