login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[PHP4] Undefined property

Offline Rens - 26/09/2007 13:12 (laatste wijziging 26/09/2007 17:43)
Avatar van RensGouden medaille

Crew algemeen
Hoi,

Ik maak gebruik van een (kleine) MySQL klasse om queries uit te voeren en meteen error handling toe te passen mocht het nodig zijn.
Nu is dit mijn code:
  1. <?PHP
  2. class MySQL
  3. {
  4.  
  5. var $aCfg;
  6. function MySQL($aCfg)
  7. {
  8. $this->aCfg = $aCfg;
  9. }
  10.  
  11. function query($sQuery)
  12. {
  13. if(!$rResult = MySQL_Query($sQuery))
  14. {
  15. MySQL::error(MySQL_Error(), MySQL_Errno(), $sQuery);
  16. $rResult = false;
  17. }
  18. return $rResult;
  19. }
  20.  
  21. function error($sError, $iError, $sQuery="")
  22. {
  23. $rFile = @fOpen("logs/mysql.log", "a+");
  24. $sInput = "-= MySQL Error op ".date("d-m-Y")." om ".date("H:i")." =-\r\n";
  25. $sInput .= "Pagina: ".(IsSet($_GET['pagina']) ? $_GET['pagina'].".php" : "index.php")."\r\n";
  26. $sInput .= "Error: ".$sError."\r\n";
  27. $sInput .= "Errnr: ".$iError."\r\n";
  28. if(IsSet($sQuery) && strLen($sQuery) > 2)
  29. {
  30. $sInput .= "Query: ".$sQuery."\r\n";
  31. }
  32. $sInput .= "\r\n";
  33.  
  34. @fWrite($rFile, $sInput);
  35. header("Location: ".$this->aCfg['path']."errors/mysql");
  36. }
  37. }


Maar ik krijg er een fout bij, namelijk:
Citaat:
Notice: Undefined property: aCfg in /home/rensjuh/domains/rensjuh.nl/public_html/kemkens/KemkensLijstjes/classes/MySQL/class.MySQL.inc.php on line 35

(regel 35 is ook hier regel 35)

Het ligt dus aan het gebeuren met $this->aCfg.
Ik heb het ook al geprobeerd met self::-$aCfg(-teken niet meegerekend, anders komt er en smilie).
Als ik PHP.net: var_dump doe, krijg ik 3 keer de juiste output, mét 3 keer de error.

Ik weet het, het kan met global, maar het zou ook zo moeten kunnen.
Kan iemand me vertellen waarom het niet werkt?
Ik maak gebruik van PHP4.

M.v.g.
Rens

15 antwoorden

Gesponsorde links
Offline Grayen - 26/09/2007 13:19 (laatste wijziging 26/09/2007 13:21)
Avatar van Grayen PHP ver gevorderde waarschijnlijk werkt dit . Je moet namelijk ook de waarde van $aCfg ook doormiddel van de statische aanroeping doen, alleen dan kan je die waarde ook weer statisch oproepen.

  1. <?PHP
  2. class MySQL
  3. {
  4.  
  5. var $aCfg;
  6.  
  7. function MySQL($aCfg)
  8. {
  9. self::$aCfg = $aCfg;
  10. }
  11.  
  12. function query($sQuery)
  13. {
  14. if(!$rResult = MySQL_Query($sQuery))
  15. {
  16. MySQL::error(MySQL_Error(), MySQL_Errno(), $sQuery);
  17. $rResult = false;
  18. }
  19. return $rResult;
  20. }
  21.  
  22. function error($sError, $iError, $sQuery="")
  23. {
  24. $rFile = @fOpen("logs/mysql.log", "a+");
  25. $sInput = "-= MySQL Error op ".date("d-m-Y")." om ".date("H:i")." =-\r\n";
  26. $sInput .= "Pagina: ".(IsSet($_GET['pagina']) ? $_GET['pagina'].".php" : "index.php")."\r\n";
  27. $sInput .= "Error: ".$sError."\r\n";
  28. $sInput .= "Errnr: ".$iError."\r\n";
  29. if(IsSet($sQuery) && strLen($sQuery) > 2)
  30. {
  31. $sInput .= "Query: ".$sQuery."\r\n";
  32. }
  33. $sInput .= "\r\n";
  34.  
  35. @fWrite($rFile, $sInput);
  36. header("Location: ".self::$aCfg['path']."errors/mysql");
  37. }
  38. }
Offline Rens - 26/09/2007 13:27 (laatste wijziging 26/09/2007 13:28)
Avatar van Rens Gouden medaille

Crew algemeen
Dan krijg ik volgende error:

Parse error: syntax error, unexpected '=', expecting '(' in /home/rensjuh/domains/rensjuh.nl/public_html/.
kemkens/KemkensLijstjes/classes/MySQL/class.MySQL.inc.php on line 9
Offline Grayen - 26/09/2007 13:34 (laatste wijziging 26/09/2007 13:34)
Avatar van Grayen PHP ver gevorderde Weet je zeker dat je self:: $aCfg hebt staan en niet self::aCfg ??? Want dan zou het logisch zijn, omdat hij dan een methode verwacht in plaats van een variable.
Offline Rens - 26/09/2007 13:38
Avatar van Rens Gouden medaille

Crew algemeen
Ik heb je code gewoon letterlijk gekopieerd...:s
Offline Rik - 26/09/2007 13:41
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Als je $aCfg als static variabele wilt gebruiken moet je hem ook als static definieëren. Probeer eens static ipv var ervoor te zetten?
Offline Rens - 26/09/2007 13:45
Avatar van Rens Gouden medaille

Crew algemeen
Ik heb alleen de beschikking over PHP4 hè, niet PHP5... 
Offline Simon - 26/09/2007 14:15
Avatar van Simon PHP expert $this->aCfg[] = $aCfg;

zo misschien?
Offline Stijn - 26/09/2007 14:26
Avatar van Stijn PHP expert @Simon: nee dat zal een 2D array opleveren.

Het probleem ligt in regel 15 (MySQL::error(...)).

Die statische benadering is niet correct want $this-> in een statische functie kan niet (eg. Zend_Loader::loadClass() zal geen instantie van de class Zend_Loader gebruiken). Dus hij kent $this-> niet want hij kent geen statische functie. Moest je nu je instantie als parameter meeleveren en de functie wat aanpassen zou het wel werken. Maar verander gewoon MySQL::error in $this->error(...);
Offline Rens - 26/09/2007 14:53 (laatste wijziging 26/09/2007 14:55)
Avatar van Rens Gouden medaille

Crew algemeen
Als ik MySQL::error verander in $this->error krijg ik daar juist een error bij...
Citaat:
Fatal error: Call to undefined function: error() in /home/rensjuh/domains/rensjuh.nl/public_html/
kemkens/KemkensLijstjes/classes/MySQL/class.MySQL.inc.php on line 14

Maar daardoor is het andere probleem nog niet opgelost...

Ik heb dat nu met global opgelost.
Het werkt nu wel, maar het zou eigenlijk ook zonder global moeten kunnen werke... 
Offline Wim - 26/09/2007 14:55
Avatar van Wim Crew algemeen stijn ik begrijp je denkwijze volledig, en geef je gelijk met de logica dat je een andere instantie van de klasse zou bekomen.
Maar, Rens zegt dat als hij een print_r van $this->$aCfg doet, dat hij wel 3x de correcte waardes krijgt, maar ook 3x de foutmelding.
Als het een andere instantie zou zijn, zou hij de waardes uit $aCfg van de niet-gebruikte instantie toch niet bekomen?
Offline Grayen - 26/09/2007 14:56
Avatar van Grayen PHP ver gevorderde Rens hoe maak jij gebruik van jouw classe? Statisch of maak je er een object van?
Offline Stijn - 26/09/2007 14:58 (laatste wijziging 26/09/2007 14:59)
Avatar van Stijn PHP expert Wat gebeurt er als je lijn 35 vervangt door self::-$aCfg... en de rest laat zoals in je codefragment 1?

@Grayen: hij zal er een instantie van maken, dat kan niet anders 
Offline Rens - 26/09/2007 15:08
Avatar van Rens Gouden medaille

Crew algemeen
Dan krijg ik volgende error:
Citaat:
Parse error: syntax error, unexpected '.', expecting '(' in /home/rensjuh/domains/rensjuh.nl/public_html/kemkens/KemkensLijstjes/classes/MySQL/class.MySQL.inc.php on line 34

Net ofdat het uitgeschakeld is of zo...? 
Offline Grayen - 26/09/2007 15:55
Avatar van Grayen PHP ver gevorderde
Citaat:
@Grayen: hij zal er een instantie van maken, dat kan niet anders

Hoezo zou hij persee een instantie er van moeten aanmaken :S. Ik bedoel roept hij de methodes zo aan (statisch dus) MySQL::query(); of $oMysql = new MySQL; $oMysql->query.

Dat is in dit geval heel belangrijk. Want als hij hem niet statisch oproept zal "self::" niet werken. Als hij er een instantie van maakt dan zal hij overal met $this-> moeten werken (ook dus bij het aanroepen van error) en anders overal self:: (ook bij error). Als dat niet werkt probeer het dan te vervangen voor MySQL::, waarschijnlijk zal het dan wel opgelost zijn.
Offline Rens - 26/09/2007 16:24
Avatar van Rens Gouden medaille

Crew algemeen
In de klasse zelf doe ik het met MySQL::query().
Daarbuiten niet, aangezien het PHP4 is en je de klasse dus niet statisch kunt maken...
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.194s