[OOP] Iets vergeten?
Hoi hoi,
Ik ben bezig met mijn allereerste OOP script. Op zich gaat het allemaal goed, en het ziet er goed uit. Alleen als ik de classe wil laden, krijg ik een totaal witte pagina. Het zit hem hier in:
Ik zie zo gauw echt niet wat daar fout aan is, maar misschien dat ik iets vergeten ben?
Ik hoop dat iemand me kan helpen, want zit er nu al een paar uur op te kijken en kom er maar niet uit..
Gr, Jezpur
Ik ben bezig met mijn allereerste OOP script. Op zich gaat het allemaal goed, en het ziet er goed uit. Alleen als ik de classe wil laden, krijg ik een totaal witte pagina. Het zit hem hier in:
Code (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
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
<?php
class Enquete {
global $_SESSION;
private $aVragen = array();
private $aShowVragen = array();
private $aShowAntwoorden = array();
private $iTeller = 0;
private $iCounter = count($this->aVragen);
private $iLimit = 5;
public $aErrors = array();
public function Enquete() {
if(!isset($_SESSION['vragen']) || empty($_SESSION['vragen'])) {
$_SESSION['vragen'] = array();
} else {
$this->setSessionToEnquete();
}
}
public function hasVragen() {
if(count($this->aVragen) > 0) {
return true;
} else {
return false;
}
}
}
?>
class Enquete {
global $_SESSION;
private $aVragen = array();
private $aShowVragen = array();
private $aShowAntwoorden = array();
private $iTeller = 0;
private $iCounter = count($this->aVragen);
private $iLimit = 5;
public $aErrors = array();
public function Enquete() {
if(!isset($_SESSION['vragen']) || empty($_SESSION['vragen'])) {
$_SESSION['vragen'] = array();
} else {
$this->setSessionToEnquete();
}
}
public function hasVragen() {
if(count($this->aVragen) > 0) {
return true;
} else {
return false;
}
}
}
?>
Ik zie zo gauw echt niet wat daar fout aan is, maar misschien dat ik iets vergeten ben?
Ik hoop dat iemand me kan helpen, want zit er nu al een paar uur op te kijken en kom er maar niet uit..
Gr, Jezpur
Gesponsorde koppelingen:
Waar roep je hem aan?
En volgens mij gaat het ook niet echt werken...
En volgens mij gaat het ook niet echt werken...
Gewijzigd op 01/01/1970 01:00:00 door Karl Karl
Code (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
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
<?php
$enq = new Enquete;
if($enq->hasVragen() !== true) {
// vraag 1
$enq->setVraag('Waar slaap jij?');
$iLast = $enq->getLastInserted();
$enq->setAntwoord($iLast, 'In bed');
$enq->setAntwoord($iLast, 'Op de bank');
$enq->setAntwoord($iLast, 'Onder de brug');
$enq->setAntwoord($iLast, 'In een doos');
// vraag 2
$enq->setVraag('Wie is Barack Obama?');
$iLast = $enq->getLastInserted();
$enq->setAntwoord($iLast, 'De President van Amerika');
$enq->setAntwoord($iLast, 'De dictator van Kenia');
$enq->setAntwoord($iLast, 'Een inwoner van de Bahama\'s');
}
if($_SERVER['REQUEST_METHOD'] == "POST") {
if($enq->controleAntwoorden($_POST, 'antw') !== false) {
// antwoorden zijn gecontroleerd en opgeslagen
header("Location: ".$_SERVER['REQUEST_URI']);
} else {
if($enq->getErrors() !== false) {
echo $enq->getErrors();
}
}
}
if($enq->controleFullyFilledIn() !== true) {
echo $enq->getForm(5, 'antw', $_SERVER['REQUEST_URI']);
}
?>
$enq = new Enquete;
if($enq->hasVragen() !== true) {
// vraag 1
$enq->setVraag('Waar slaap jij?');
$iLast = $enq->getLastInserted();
$enq->setAntwoord($iLast, 'In bed');
$enq->setAntwoord($iLast, 'Op de bank');
$enq->setAntwoord($iLast, 'Onder de brug');
$enq->setAntwoord($iLast, 'In een doos');
// vraag 2
$enq->setVraag('Wie is Barack Obama?');
$iLast = $enq->getLastInserted();
$enq->setAntwoord($iLast, 'De President van Amerika');
$enq->setAntwoord($iLast, 'De dictator van Kenia');
$enq->setAntwoord($iLast, 'Een inwoner van de Bahama\'s');
}
if($_SERVER['REQUEST_METHOD'] == "POST") {
if($enq->controleAntwoorden($_POST, 'antw') !== false) {
// antwoorden zijn gecontroleerd en opgeslagen
header("Location: ".$_SERVER['REQUEST_URI']);
} else {
if($enq->getErrors() !== false) {
echo $enq->getErrors();
}
}
}
if($enq->controleFullyFilledIn() !== true) {
echo $enq->getForm(5, 'antw', $_SERVER['REQUEST_URI']);
}
?>
Daarzo. Alleen als ik de classe helemaal als commentaar zet, krijg ik de melding dat de classe 'Enquete' niet bestaat. Dus de fout moet in de classe zelf zitten, toch?
Edit: hoezo gaat het niet werken?
Gewijzigd op 01/01/1970 01:00:00 door Jesper Diovo
Die "global $_SESSION" levert waarschijnlijk een parse-error op. Gelukkig hoef je ook geen "global $_SESSION" ergens neer te zetten, ten eerste omdat global niet een keyword binnen een klasse is (alleen binnen functies) en ten tweede omdat $_SESSION altijd al een global is, en daar kan je lekker helemaal niets aan doen. Naja, tenzij je geen sessie start, dan bestaat $_SESSION gewoon niet :P
Tip: Zet je error_reporting thuis standaard op E_ALL en display_errors op true, zodat je ze allemaal te zien krijgt. Bekijk ook de error.log van Apache, daar staat soms hele nuttige informatie in wanneer PHP het zelf even niet meer weet. Naast de normale foutmeldingen en notices van PHP komen ook de segfaults van PHP, mocht je er eentje tegen het lijf lopen, in error.log te staan.
edit: nog een foutje, die count aanroep bij je definieren van een private property gaat niet werken. Bij het initialiseren kan je alleen maar vaste waarden (alleen scalar waarden, de simpele typen, overigens) toekennen aan properties. De rest moet dan maar via de constructor wat volgens mij zelden problemen oplevert, zolang je jezelf maar aanleert om bij het extenden altijd even netjes de parent constructor aan te roepen.
edit 2: En nog een schoonheidsfoutje. Je moet je constructor "__construct" noemen, en niet "Enquete". Dat is de PHP 4 manier die niet meer aangeraden wordt, en ik weet niet hoe goed dat gaat aflopen in combinatie met PHP 5's visibility keywords (public, private, ...)
Tip: Zet je error_reporting thuis standaard op E_ALL en display_errors op true, zodat je ze allemaal te zien krijgt. Bekijk ook de error.log van Apache, daar staat soms hele nuttige informatie in wanneer PHP het zelf even niet meer weet. Naast de normale foutmeldingen en notices van PHP komen ook de segfaults van PHP, mocht je er eentje tegen het lijf lopen, in error.log te staan.
edit: nog een foutje, die count aanroep bij je definieren van een private property gaat niet werken. Bij het initialiseren kan je alleen maar vaste waarden (alleen scalar waarden, de simpele typen, overigens) toekennen aan properties. De rest moet dan maar via de constructor wat volgens mij zelden problemen oplevert, zolang je jezelf maar aanleert om bij het extenden altijd even netjes de parent constructor aan te roepen.
edit 2: En nog een schoonheidsfoutje. Je moet je constructor "__construct" noemen, en niet "Enquete". Dat is de PHP 4 manier die niet meer aangeraden wordt, en ik weet niet hoe goed dat gaat aflopen in combinatie met PHP 5's visibility keywords (public, private, ...)
Gewijzigd op 01/01/1970 01:00:00 door Jelmer rrrr
Helpt ook niet. In error.log staat alleen iets over mod_rewrite:
Snap d'r niet veel van, maar toen ik in m'n .htaccess 'RewriteOptions: MaxRedirects' zette, kreeg ik die laatste 3 errors. Dat is dus ook niks.
Hier is m'n hele classe, met alles wat er bij hoort.
http://www.dzjemo.nl/phphulp/enquete-logica.phps (script valt te testen op http://www.dzjemo.nl/phphulp/enquete-logica.php)
En ik krijg nog steeds geen error.
Code (php)
1
2
3
4
5
2
3
4
5
[Thu Jan 29 02:57:36 2009] [error] [client <ip>] mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.
[Thu Jan 29 03:09:07 2009] [error] [client <ip>] mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.
[Thu Jan 29 22:51:57 2009] [alert] [client <ip>] /home/vhosts/dzjemo.nl/httpdocs/.htaccess: RewriteOptions: MaxRedirects has the format MaxRedirects=n.
[Thu Jan 29 22:52:03 2009] [alert] [client <ip>] /home/vhosts/dzjemo.nl/httpdocs/.htaccess: RewriteOptions: MaxRedirects has the format MaxRedirects=n.
[Thu Jan 29 22:52:17 2009] [alert] [client <ip>] /home/vhosts/dzjemo.nl/httpdocs/.htaccess: RewriteOptions: MaxRedirects has the format MaxRedirects=n
[Thu Jan 29 03:09:07 2009] [error] [client <ip>] mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.
[Thu Jan 29 22:51:57 2009] [alert] [client <ip>] /home/vhosts/dzjemo.nl/httpdocs/.htaccess: RewriteOptions: MaxRedirects has the format MaxRedirects=n.
[Thu Jan 29 22:52:03 2009] [alert] [client <ip>] /home/vhosts/dzjemo.nl/httpdocs/.htaccess: RewriteOptions: MaxRedirects has the format MaxRedirects=n.
[Thu Jan 29 22:52:17 2009] [alert] [client <ip>] /home/vhosts/dzjemo.nl/httpdocs/.htaccess: RewriteOptions: MaxRedirects has the format MaxRedirects=n
Snap d'r niet veel van, maar toen ik in m'n .htaccess 'RewriteOptions: MaxRedirects' zette, kreeg ik die laatste 3 errors. Dat is dus ook niks.
Hier is m'n hele classe, met alles wat er bij hoort.
http://www.dzjemo.nl/phphulp/enquete-logica.phps (script valt te testen op http://www.dzjemo.nl/phphulp/enquete-logica.php)
En ik krijg nog steeds geen error.
Regel 180: Alleen simpele typen als default waarden. $_SERVER['REQUEST_URI'] gaat niet werken (en levert een syntax error op)
Je kan het oplossen door $default = null mee te geven, en dan binnen de functie te kijken of $default gelijk is aan null, zo ja, dan $default = $_SERVER['REQUEST_URI'].
Je kan het oplossen door $default = null mee te geven, en dan binnen de functie te kijken of $default gelijk is aan null, zo ja, dan $default = $_SERVER['REQUEST_URI'].
Goed geprobeerd, jammer maar helaas, geen resultaat. Het kan net zo goed zijn dat er ergens een ; ontbreekt. Heeft m'n php parser dinges ook nog wel eens moeite mee... Alleen heb ik het script al 3 x afgezocht naar zo'n fout, en niks gevonden..
Hmm, bij mij werkt hij nu lokaal (in de zin van: hij geeft wat weer)
Misschien dat het dan toch aan je htaccess-bestandje ligt. Download & verwijder (of hernoem) het eens, zodat Apache het niet meer pakt, en werkt het script dan wel? Zo ja, dan is het tijd voor een nieuw topic over rewrite rules >:)
Misschien dat het dan toch aan je htaccess-bestandje ligt. Download & verwijder (of hernoem) het eens, zodat Apache het niet meer pakt, en werkt het script dan wel? Zo ja, dan is het tijd voor een nieuw topic over rewrite rules >:)
Helaas, opnieuw geen resultaat.
Wat geeft hij bij jou weer?
Wat geeft hij bij jou weer?
Ik heb hem hier effe door de debugger gegooit.
Eerst krijg je een pagina met:
Wat ik allemaal uit de debugger heb gehaalt:
Error: E_STRICT Only variables should be passed by reference at enquete-logica.php line 61
$iDone = $this->iCounter - $this->getAmountToGo(); <== Bevat ook fouten.
Regel 108 moet voor regel 107.
In de constructor ga je de fout in door eerst te tellen hoeveel vragen je hebt, voordat je ze eigenlijk uit de session haalt.
De eerste keer wordt er ook geen variabelen (iig de waarden) in de session gezet.
Regel 149 wordt overgeslagen. Wat moet regel 230 doen? Bij regel 238 gaat ie de tweede keer de mist in.
Er zitten serieuze fouten in je ontwerp, ik vind ook dat je soms wat dingen raar gaat doen.
Wat ik dacht dat er mis zou zijn waren de dingen die Jelmer zei, alleen dat wist ik niet zeker.
Eerst krijg je een pagina met:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1. Waar slaap jij?
In bed
Op de bank
Onder de brug
In een doos
1. Wie is Barack Obama?
In bed
Op de bank
Onder de brug
In een doos
De President van Amerika
De dictator van Kenia
Een inwoner van de Bahama's
[Volgende>>]
In bed
Op de bank
Onder de brug
In een doos
1. Wie is Barack Obama?
In bed
Op de bank
Onder de brug
In een doos
De President van Amerika
De dictator van Kenia
Een inwoner van de Bahama's
[Volgende>>]
Wat ik allemaal uit de debugger heb gehaalt:
Error: E_STRICT Only variables should be passed by reference at enquete-logica.php line 61
$iDone = $this->iCounter - $this->getAmountToGo(); <== Bevat ook fouten.
Regel 108 moet voor regel 107.
In de constructor ga je de fout in door eerst te tellen hoeveel vragen je hebt, voordat je ze eigenlijk uit de session haalt.
De eerste keer wordt er ook geen variabelen (iig de waarden) in de session gezet.
Regel 149 wordt overgeslagen. Wat moet regel 230 doen? Bij regel 238 gaat ie de tweede keer de mist in.
Er zitten serieuze fouten in je ontwerp, ik vind ook dat je soms wat dingen raar gaat doen.
Wat ik dacht dat er mis zou zijn waren de dingen die Jelmer zei, alleen dat wist ik niet zeker.
Waar heb je die debugger ergens vandaan? Zou fijn zijn als ik de boel ook zelf een beetje kan testen.
Ik heb de code nu een beetje aangepast, vooral de fouten die je zei. Maar het werkt nog steeds niet. Overigens krijg ik dus helemaal niks, terwijl jullie wel iets te zien krijgen??
Ik heb de code nu een beetje aangepast, vooral de fouten die je zei. Maar het werkt nog steeds niet. Overigens krijg ik dus helemaal niks, terwijl jullie wel iets te zien krijgen??
Jezpur schreef op 30.01.2009 17:51:
Waar heb je die debugger ergens vandaan? Zou fijn zijn als ik de boel ook zelf een beetje kan testen.
Ik gebruik NuSphere PhpED, natuurlijk kan je ook eclipse gebruiken, maar die vondi k niet fijn werken (traag, log, onhandig).
Gewoon op het pijltje met de D drukken en dan steeds op F7 (step into geloof ik). Je kunt dan over elke variable met je muis gaan om te zien welke waarde die heeft, verder zie je hoe php door het script loopt.
Ook kan je als je de pagina weer hebt gepost dan verder gaan met debuggen.



