classes

  • class.database.php



    class.login.php



    tips of iets :)?


    thx:slotje:

  • NEE!


    Ik had een hele lijst met fouten gemaakt voor de Database class...
    Maar ik was vergeten het bericht te kopieren voor ik op "Plaats reactie" klikte, en wanneer je te lang wacht gaat er iets fout...


    Ik kan je wel vertellen dat het een hele hoop fouten waren...


    Ik ga het lijstje weer eens opstellen:


    Database::__construct()

    PHP
    # Create standard variables for class
            private $this->identifier;
            private $this->SqlLine;
            private $this->Value;


    Dat hoort binnen een class, niet binnen een method (zo noemen we een functie binnen een class).
    Ook is het "this->" niet nodig (geeft fouten)


    PHP
    $this->identifier = mysql_connect($this->hostname, $this->username, $this->password);


    Waar komen $this->hostname, $this->username en $this->password ooit vandaan?
    Geef vier verplichte parameters mee aan de constructor ($db = new Database('localhost', 'username', 'password', 'database'))


    PHP
    # Error handler, when sql error
                $RespondsHandler->sql('CONNECT_ERROR');


    Een mooie fout, maar niet wat je verwacht.
    $RespondsHandler bestaat niet binnen deze scope (de method) en geeft dus fouten.


    Database::SqlQuery()

    PHP
    function SqlQuery ( $this->SqlLine = 'Unknown' )
        {
            # when a empty line has been returned
            if ( $this->SqlLine  == 'Unknown' )
            {
            
                $RespondsHandler->sql('NO_SQL_LINE');
                
            }


    $this->SqlLine = 'Unkown' geeft een leuke fout: Cannot re-assign $this.
    Gebruik func_num_args() om te kijken hoeveel parameters er zijn meegegeven als je zo graag wilt dat $RespondsHandler de fout registreert (en NULL is een betere standaard waarde, het staat voor missende data namelijk, precies wat jij wilt)
    Ok lijkt het me beter om FALSE te returnen als er een error opduikt en niet niets (void). (in de constructor, de destructor en vast nog wel een paar andere magic methods heeft returnen geen zin)
    Beter:

    PHP
    public function SqlQuery ( $SqlLine = NULL )
        {
            # when a empty line has been returned
            if ( ! func_num_args() OR ! is_string($SqlLine))
            {
                $RespondsHandler->sql('NO_SQL_LINE');
                return FALSE;
            }



    PHP
    {
                    
                    # Sql succeed
                    return true;
                    
                }


    Database::Value gaat er toch echt vanuit dat deze method de mysql_query() returned...


    Database::Value()

    PHP
    if ($this->SqlLine == 'Unknown') || ($this->Value == 'None')


    Waar slaat ") || (" op? En dan vooral de haakjes...


    PHP
    protected $this->Result = self::SqlQuery( $this->SqlLine );
                    protected $this->array_return = array ( );


    Kom jij uit de Java(script) hoek vandaan ofzo?
    Binnen PHP geef je met "global" aan dat je een variabele van het aller laagste scope wilt gebruiken, en voor de rest zijn er superglobals die je in elke scope kan gebruiken en (de normale) variabelen die alleen binnen de huidige scope bestaan.
    $Result = $this->SqlQuery($this->SqlLine); is dus wat je wilt.
    $this->SqlQuery() inderdaad, Database::SqlQuery is niet static en kan dus niet aan worden geroepen alsof het wel static is...



    Je vergeet een = teken voor mysql_fetch_assoc()
    De foreach moet binnen de else, en de mysql_fetch_assoc moet buiten de foreach (de mysql_error() dus ook)
    De .= operator is voor een string, voor een array gebruik je $array[] =
    Nog beter is helemaal geen foreach maar een $array_return = array_interset_key($assoc, array_flip($Value)) is stukken beter



    Leef je nog?
    Ik heb elke soort fout maar een keer opgenoemd, het lijkt me dat je zelf wel kunt bedenken dat het voor andere plaatsen ook geldt.
    Wil je dat ik doorga met Login, of wil je eerst de kans krijgen Database en Login te verbeteren? (aub je oorspronkelijke bericht aanpassen en melden dat je dat gedaan hebt en niet hele nieuwe plakken code plaatsen)


    Toch vind ik het heel fijn dat je dit topic hebt aangemaakt!
    Weer eens een interessant topic!

  • nahja, untested was hij ook maar goed, heel erg bedankt dat je me zo wilt helpen. Want hierbij leer ik er weer is een keer van ^^


    tis wel een beetje hard hoe je het typt maar goed beter zo dat ik er van leer dat je bijna niks zegt :D


    thx ik ga er aan werken :)

  • Darsstar zegt waar het op staat, maar met alle reden.:) Hij kan het weten, en heeft dan ook gelijk.;)


    Het is gewoon jammer, het zijn syntax fouten. Het heeft dus niets met je manier van denken te maken, of andere fouten die je gewoon in je class hebt geprogrammeerd. Hoewel die fouten veel lastiger zijn (en vaak over te discussiëren valt), komen ze natuurlijk veel vaker voor.


    Ik wil je dan ook aanraden om een op php.net goed de syntax te bekijken. Dit is tenslotte simpel op te lossen door de syntax goed te leren!


    Ps. Maak je niet druk, je zit nog steeds ver boven het niveau hier met überhaupt "class Database {}".

  • Een tipje van mij kant ;)
    Probeer is een try block te gebruiken en exceptions :)


    Is handig voor foute vermelding.
    Ik gebruik het zelf ook in mijn eigen database class en werkt makkelijk;)

    School
    Tweedejaars Informatica Student @ Hogeschool Rotterdam.


    Webtalen
    - PHP ( OOP )
    - SQL
    - JavaScript i.c.m. jQuery framework
    - (x)HTML
    - CSS
    - Actionscript
    - XML


    Programmeertalen
    - Java
    - C#
    - Ruby i.c.m. on Rails framework

  • :: gebruik je bij static variabelen, omdat standaard attributen niet toegankelijk zijn binnen een statische klasse gebruik je i.p.v $this->$var self::$var.


    Hoop dat je het nu beetje snap.
    Anders wil ik hier verder op in gaan.

    School
    Tweedejaars Informatica Student @ Hogeschool Rotterdam.


    Webtalen
    - PHP ( OOP )
    - SQL
    - JavaScript i.c.m. jQuery framework
    - (x)HTML
    - CSS
    - Actionscript
    - XML


    Programmeertalen
    - Java
    - C#
    - Ruby i.c.m. on Rails framework

  • $this is voor binnen een method waar die op een instantie van die class is aangeroepen:
    $boe->schrik();
    $boe is dan de instantie.


    Maar methods (en variabelen) kunnen ok statisch (static) zijn en los van elke instantie aangeroepen worden.
    Binnen die method kun je "self" gebruiken (self::method())
    Die methodes kunnen geen $this gebruiken omdat $this de instantie voorstelt, maar dat is voor statische dingen niet het geval.


    Cookie::$domain = '.example.com';
    self::$domain (kan je binnen alle methods aanroepen) zal voor elke instantie het zelfde zijn.

  • Dus als ik het goed heb:


    gaat dit goed:

    PHP
    $this->identifier = mysql_connect($hostname, $username, $password);


    en dit fout:

    PHP
    self::identifier = mysql_connect($hostname, $username, $password);


    EDIT:


    nog even een vraagje deze regel:

    PHP
    $array_return = array_interset_key($assoc, array_flip($Value))


    snap ik niet 100% ik snap dat alles flipt maar wat doet die interset_key precies want de uitleg @php.net snap ik ook niet helemaal.


    EDIT 2:
    Nieuwe class.database.php


    al hoewel ik de foreach nog niet heb aangepast vanwege de uitleg ;) dus daarover nog niet beginnen.

  • Ok, daar komt het weer:


    Bij de constructor heb je (misschien onbewust) iets heel slims gedaan, NULL als de standaard waarde gezet.
    Zelf had ik geen standaard waarde neergezet en dus vier verplichte parameters.
    Maar mysql_connect(); zonder enige parameter kan gewoon werken (het hangt van de php.ini af of er een werkende verbinding wordt gemaakt).
    Maar mysql_connect(NULL, NULL, NULL, NULL); is precies het zelfde als mysql_connect(); (heb het getest)
    Gefeliciteerd, je hebt (misschien onbewust) een feature toegevoegd die niet voorgesteld was :p


    De fouten:

    PHP
    # Create standard variables for class
        private $this->identifier;
        private $this->SqlLine;
        private $this->Value;


    Het 'this->' gedeelte moet weg, dat geeft fouten, we zitten dan wel binnen de class, maar nog niet binnen een method.
    Verder lijk je Value en SqlLine niet voor elke method beschrikbaar te stellen, ik zou ook niet weten waarom, maar die mogen dus weg...
    $this->identifier zou ik gebruiken voor de optionele 2e parameter voor mysql_query(), voegt weer een feature toe.


    Database::__construct()
    De constructor nog even public maken aub.
    $RespondseHandler bestaat niet binnen de methods, je zult eerst $RespondseHandler = new RespondseHandler; of iets dergelijks binnen de method moeten plaatsen...


    Database::Value()

    PHP
    if ( !$SqlLine ) OR ( !$Value )


    ") OR (" die haaktjes horen daar niet.

    PHP
    if ( !$SqlLine OR !$Value )


    Dat is correct
    Je sloot de if, dan kwam OR wat niet zomaar ergens hoort te staan en daarna open je een haakje waar PHP ook niets van snapt.


    De rest van de Database::Value() method laat ik maar even zitten omdat er toch niets veranderd is...


    Database::Rows()
    Controleer ook nog even of $Query wel een string is of niet.


    Omdat Database::SqlQuery niet statisch is kun je die niet zo aanroepen (de naamgeving van methods is altijd alsof een method statisch is, mocht het je nog niet opgevallen zijn).
    Omdat het niet statisch is heb je een object van de Database class nodig waar je de method op kan aanroepen, omdat we al binnen een niet-statische method zitten is dat al gebeurd en representeert $this dat object.
    $this->SqlQuery($Query)



    PHP
    self::identifier = mysql_connect($hostname, $username, $password);


    Die regel zal altijd fout zijn, puur om de reden dat er een dollarteken mist.

    PHP
    self::$identifier = mysql_connect($hostname, $username, $password);


    Die regel zou goed kunnen zijn, mist $identifier een statische variable is, maar in dit geval is dat niet zo.



    hopelijk snap je die regel nu wel?
    Het is precies wat jij wilt, alleen dan is er geen foreach loop nodig.


    Edit: Ik zag net dat $database = NULL ook nog een parameter voor de constructor is...
    Ik zou dat juist vooraan zetten en die verplicht maken (geen standaard waarde)
    dan kun je $db = new Database('criminalspoint'); gebruiken ipv $db = new Database(NULL, NULL, NULL, 'criminalspoint'); :p

    Nieuwe reactie samengevoegd met originele reactie op 18.01.10 22:15:25:
    Trouwens, "if so run the if otherwise the else" als je zulke comments neerzet kun je net zo goed een heel PHP boek in commentaar voor elke regel zetten... :p

  • # Create standard variables for class
    private $this->identifier; die klopt niet;)
    Aangezien je eerst moet beginnen met variabelen maken moet je als volgt doen:
    private $identifier;


    En als je dan die identifier wilt gebruiken in de methodes dus constructor of andere functions dan gebruik je wel $this-> ervoor ;)



    Verder zal ik als ik zometeen thuis ben even naar je class.login.php kijken want ik zie daar toch wel aardig wat fouten zoals protected variabelen gebruiken in een constructor terwijl je die er boven moet aanmaken en dan in de constructor $this->$username = $username; bijv.

    School
    Tweedejaars Informatica Student @ Hogeschool Rotterdam.


    Webtalen
    - PHP ( OOP )
    - SQL
    - JavaScript i.c.m. jQuery framework
    - (x)HTML
    - CSS
    - Actionscript
    - XML


    Programmeertalen
    - Java
    - C#
    - Ruby i.c.m. on Rails framework

  • Ja, maar dan kan je maar met een database verbinden...
    Misschien heb je dat nu niet nodig, maar als je deze class wilt hergebruiken zou ik er alvast rekening mee houden...


    http://www.php.net/manual/en/language.oop5.basic.php
    Daar zie je ook geen "public $this->var;" maar "public $var" staan...


    Waarom is $database verdwenen uit de paremeter lijst van Database::__construct()?


    Ook wil ik nu echt eens van je horen waar volgens jou $RespondsHandler vandaan komt...
    Want die variabele bestaat NIET binnen die methods...
    En zet eens een "return FALSE;" na elke keer dat $RespondsHandler iets met de fouten doet, dat is ietsjes mooier...


    En maak van van de else in Database::Value() die controleert of $this-Value (dat moet natuurlijk $Value worden) een array is eens een elseif die controleert of $Value een string is.
    Dan maak je er nog eens als bij die mysql_fetch_assoc($Query) returned.

  • RespondsHandler moet ik nog maken :3 maar ja toen kwam er achter dat mijn classes zo'n faal waren dat ik dacht laat ik die eerst verbeteren ;)


    edit:
    update gemaakt :)


    edit2:


    class.login.php ook aangepast zeg niet dat hij foutloos is maar er staan zeer zeker minder fouten in

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!