Versio

[OOP] Iets vergeten?

Overzicht Reageren

Jesper Diovo

Jesper Diovo

29/01/2009 22:30:00
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
        }
    }
}

?>


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
 
PHP hulp

PHP hulp

25/05/2012 12:55:38
Gesponsorde koppelingen:
 
Karl Karl

Karl Karl

29/01/2009 22:31:00
Quote Anchor link
Waar roep je hem aan?
En volgens mij gaat het ook niet echt werken...
Gewijzigd op 01/01/1970 01:00:00 door Karl Karl
 
Jesper Diovo

Jesper Diovo

29/01/2009 22:33:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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']);
}

?>


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
 
Jelmer rrrr

Jelmer rrrr

29/01/2009 22:45:00
Quote Anchor link
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, ...)
Gewijzigd op 01/01/1970 01:00:00 door Jelmer rrrr
 
Jesper Diovo

Jesper Diovo

29/01/2009 22:58:00
Quote Anchor link
Helpt ook niet. In error.log staat alleen iets over mod_rewrite:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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.
 
Jelmer rrrr

Jelmer rrrr

29/01/2009 23:02:00
Quote Anchor link
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'].
 
Jesper Diovo

Jesper Diovo

29/01/2009 23:06:00
Quote Anchor link
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..
 
Jelmer rrrr

Jelmer rrrr

29/01/2009 23:10:00
Quote Anchor link
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 >:)
 
Jesper Diovo

Jesper Diovo

29/01/2009 23:13:00
Quote Anchor link
Helaas, opnieuw geen resultaat.

Wat geeft hij bij jou weer?
 
Karl Karl

Karl Karl

30/01/2009 10:32:00
Quote Anchor link
Ik heb hem hier effe door de debugger gegooit.
Eerst krijg je een pagina met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>>]

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.
 
Jesper Diovo

Jesper Diovo

30/01/2009 17:51:00
Quote Anchor link
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??
 
Karl Karl

Karl Karl

30/01/2009 19:08:00
Quote Anchor link
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.
 



Overzicht Reageren

Get Adobe Flash player