[OOP] Iets vergeten?
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
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
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 -
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.
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..
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 >:)
Wat geeft hij bij jou weer?
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.
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.