Auteur Topic: Hoe pak ik grote projecten aan?  (gelezen 4271 keer)

0 leden en 1 gast bekijken dit topic.

jyy

  • DigitalPlace Lid
  • *
  • Berichten: 347
  • Karma: 12
    • Bekijk profiel
Hoe pak ik grote projecten aan?
« Gepost op: november 03, 2011, 08:42:37 pm »
  • [+1]1
  • [-1]0
  • Beste,

    Na enige inactiviteit (en nog inactiviteit dat zal volgen) zal ik ter compensatie hier even een HQ tut schrijven - at least, dat is mijn bedoeling. Anyways, omdat ik merk dat veel mensen projecten niet slim aanpakken of zomaar in het niets beginnen en daardoor veel halve onbruikbare dingen maken, zal ik hier een tut schrijven over het efficiënt en slim aanpakken van grotere projecten (phoo wat een lange vage zin weer). Ik neem hier als voorbeeld bij een login systeem in PHP. Het kán daarom handig zijn enige kennis te hebben in html en php, het is daarentegen niet nodig voor het volgen van deze tut. Wel ga ik gebruik maken van de cyclus van het "technisch ontwerpen" (dit is een universitaire studie).

    Inhoudsopgave
    • 1: De Ontwerpcyclus
    • 2: De eerste stappen
    • 3: We gaan er dieper op in
    • 4: Het echte programmeren
    • 5: Het einde van de cyclus?
    • 6: De eeuwige cyclus
    • 7: Nawoord
    • 8: Disclaimer
    [/b]


    1:  De Ontwerpcyclus
    Laten we beginnen! Als eerste hebben we de eerder genoemde "ontwerp cyclus", als hieronder weergegeven:

    Afb. 1 - De ontwerpcyclus

    Niet altijd moet je overal even lang over doen, zolang je maar alle stappen goed doorneemt. Ook begin je na stap 6 niet altijd weer bij stap 1, maar dat verschilt duidelijk per project. Laten we de cyclus eens volgen met ons toekomstige inlogpaneel.


    2:  De eerste stappen
    We volgen nu stap voor stap de ontwerpcyclus. Zo beginnen we bij 1.

    1. Analyseren en beschrijven - wat willen we nou eigenlijk?
    We willen neem ik aan een veilig systeem waarmee je bij een website kan in- en uitloggen. Ook moet je makkelijk kunnen kijken of iemand is ingelogd. Klopt dat? Ik kan me nu nog niets meer bedenken. Hier vooral kort en duidelijk opschrijven, maar niet onvolledig(!)

    2. programma van eisen opstellen - Wat moet het systeem allemaal gaan doen?
    Dit punt valt redelijk samen met punt 1, alleen je moet heel duidelijk voor jezelf gaan kijken, welke punten wil ik dat hij kan? Stuk voor stuk kun je deze noteren als deelonderwerpen. Wordt het te onduidelijk, dan maak je een blokschema met alles erop. Ook kun je woordwebs gebruiken, daar ben ik minder fan van. Uitleg over een blokschema volgt mogelijk nog (als er animo voor is?).
    In ons geval zou dat worden:
    Citaat
    1. Inloggen
    2. pagina's checken op ingelogd/uitgelogd
    3. uitloggen
    4. veilig !

    3:  We gaan er dieper op in


    3. (deel)uitwerkingen bedenken - Hoe gaan we het aanpakken?
    Hier maken we een tabel met de mogelijkheden hoe we iets aan kunnen pakken. In dit geval is het maar een systeem, en dat is inloggen. De rest wordt er namelijk op aangepast.
    Laten we eens kijken naar de tabel.

    Inloggen
                                    veilig | Gebruiksvriendelijk | makkelijk uitloggen | makkelijk te maken | makkelijk uit te breiden
    php sessions                  |   +    |          +          |         ++          |         ++         |          ++
    php database                  |   ++   |          +          |         -           |         +          |          ++
    ssjs (serverside javascript)  |   ++   |         +++         |         +           |         --         |          -
    RoR (Ruby on Rails)           |   ++   |         ++          |         +           |        -/+         |          +


    Na deze tabel ben ik toch maar gegaan voor de PHP database mogelijkheid. Dit vanwege mijn (nu nog) gebrek aan kennis op het gebied van Ruby On Rails. Misschien dat het binnenkort anders wordt.
    [block=Mijn CMS:2jqno3wj]Mijn eigen CMS heeft een combinatie van sessions en een database (dit werkt een stuk beter) maar dat zou voor deze tut te ingewikkeld worden om in een keer uit te leggen, het haat hier ook om het aanpakken ván het project. Natuurlijk kun je in je eigen project oplossingen ook combineren.[/block:2jqno3wj]
    Zoals je ziet, je weegt je mogelijkheden af en koest dan diegene die jou het beste lijkt. Daarna gaan we door naar stap 4.

    4. Ontwerpvoorstel formuleren - Hoe gaat het precies gebouwd worden?
    Mijn plannen zijn het op het moment niet dat het ongelofelijk groot gaat worden, dus ik heb besloten niet met classes te gaan werken. Als je op iets als dit stuit en je twijfelt, dan kun je eventueel nog even terug naar stap 3.
    We beginnen met het opstellen van een database. we noemen deze login.
    Wat moet erin komen? altijd een id (primary), een username, een IP (heel belangrijk!).

    Als we die database hebben moeten we natuurlijk ook kunnen kijken of iemand is ingelogd. Daar schrijven we een functie voor. In deze functie gaan we kijken of er een ingelogd persoon is met dat IP.
    Ook moeten we natuurlijk een tabel hebben met users. Hoe gaat deze eruit zien?
    We hebben nodig: een id (primary), een username, een wachtwoord. Eventueel kun je hier nog dingen toevoegen als een IsAdmin waarde, of een e-mail adres.

    Hoe loggen we dan in? We doen een aanvraag bij de users tabel. Klopt deze informatie (user + password) dan zetten we een waarde in onze login tabel.
    Ik ben atm een beetje te lui om dit te visualiseren. Daarnaast zit ik op een schoolcomputer en start gimp niet op dus het wordt sowieso een beetje lastig.

    4:  Het echte programmeren


    5. Ontwerp realiseren - we gaan ons project maken !

    Als eerst maken we de tabellen even klaar. Dat kan heel makkelijk in phpmyadmin, maar ik zal voor jullie een create table code maken. let op! Nu beginnen we pas met het echt schrijven van de code !

    CREATE TABLE `login` (
    `id` int(255) NOT NULL,
    `username` varchar(50) NOT NULL,
    `ip` varchar(50) NOT NULL,
    PRIMARY KEY `id`
    )


    CREATE TABLE `users` (
    `id` int(255) NOT NULL,
    `username` varchar(50) NOT NULL,
    `wachtwoord` text NOT NULL,
    PRIMARY KEY `id`
    )

    De tabellen hebben we al, nu de functies nog. We moeten kunnen inloggen.

    Code: php [Selecteer]
    function login($username, $wachtwoord) {
    }
      

    En nu? We gingen eerst kijken of de username en het wachtwoord bij elkaar klopten.

    Code: php [Selecteer]
    function login($username, $wachtwoord) {
    $query = mysql_query("SELECT * FROM `users` WHERE `username` = '".$username.
    "' AND `wachtwoord` = '".$wachtwoord."'") 
    or die
    ('mysql error: '.mysql_error());
    if (mysql_num_rows($query) > 0) { 
    /* als hij waardes vindt waarbij 
    de username en de wachtwoord gelijk is aan wat is ingevoerd gebeurd er dit */
    $query = mysql_query("INSERT INTO `login` (username, ip) 
    VALUES ('"
    .$username."', '".$_SERVER['REMOTE_ADDR']."')") 
    or die
    ('mysql error: '.mysql_error()); 
    /* Hier voegen we de waarden toe waarin staat dat we ingelogd zijn, in onze eerste tabel */
    return "Login succesvol!";
    }
     
    else 
    { // hier is de inlog mislukt
    return "Verkeerde username / wachtwoord!";
    }
    }
     // einde van de functie                   


    Nu kunnen we inloggen, maar wat hebben we eraan? We kunnen immers niet uitloggen of kijken of we wel ingelogd zijn. Laten we daar nou wat aan gaan doen!

    Code: php [Selecteer]
    function IsIngelogd() { 
    $query 
    = mysql_query("SELECT * FROM `login` WHERE `ip` = '".$_SERVER['REMOTE_ADDR']."'") 
    or die
    ('mysql error: '.mysql_error()); 
    /* We pakken de login waarde van het op dit moment gebruikte ip */
    if ($row = mysql_fetch_array($query)) { // als er een waarde uitkomt

    return true; // ingelogd en wel (: 

    } else { // als er geen waarde uit de query komt 
    return false; // Ook hier niet ingelogd. 
    } 
    } // einde van de functie 
      


    Nu missen we nog één ding: het uitloggen. Deze code wordt een stuk simpeler.

    Code: php [Selecteer]
    function loguit() { 
    $query 
    = mysql_query("DELETE FROM `login` WHERE `ip` = '".$_SERVER['REMOTE_ADDR']."'") 
    or die
    ('mysql error: '.mysql_error()); 
    /* we verwijderen de waarde gewoon weer als ze willen uitloggen. */
    } // einde functie
      


    Zo. Dat was even een stukje code. Even een cola'tje en dan gaan we weer verder ;d

    5:  Het einde van de cyclus?


    Het antwoord is nee. Een cyclus heeft nooit een einde. Toch zijn we hier bij stap 6 aan gekomen.
    6. Ontwerp testen en evalueren.

    We gaan de code uittesten en kijken of hij werkt. Dan gaan we kijken naar wat nog niet goed is. Zoals het er nu uitziet hebben we redelijk wat we willen. Of niet?

    We gaan de cirkel even door tot 2. Daar stond er bij ons dit:
    Citaat
    1. Inloggen
    2. pagina's checken op ingelogd/uitgelogd
    3. uitloggen
    4. veilig !
    Hij moet dus ook veilig zijn! Dan gaan we nu weer naar stap 5. Daar herschrijven we onze login functie "even".
    Code: php [Selecteer]

        function login
    ($username, $wachtwoord) {

        $username = mysql_real_escape_string($username); // zodat een SQLi niet meer mogelijk is
        $wachtwoord= mysql_real_escape_string($wachtwoord); // idem

    $query = mysql_query("SELECT * FROM `users` WHERE `username` = '".$username.
    "' AND `wachtwoord` = '".$wachtwoord."'") 
    or die
    ('mysql error: '.mysql_error());
    if (mysql_num_rows($query) > 0) { 
    /* als hij waardes vindt waarbij 
    de username en de wachtwoord gelijk is aan wat is ingevoerd gebeurd er dit */
    $query = mysql_query("INSERT INTO `login` (username, ip) 
    VALUES ('"
    .$username."', '".$_SERVER['REMOTE_ADDR']."')") 
    or die
    ('mysql error: '.mysql_error()); 
    /* Hier voegen we de waarden toe waarin staat dat we ingelogd zijn, in onze eerste tabel */
    return "Login succesvol!";
    }
     
    else 
    { // hier is de inlog mislukt
    return "Verkeerde username / wachtwoord!";
    }
    }
     // einde van de functie             


    Werkt er helemaal niks of niet zoals je wilt, dan kun je weer naar stap 3 en 4. Dan kun je in 6 weer kijken wat je mist.

    6:  De eeuwige cyclus

    Als je dit systeem serieus gaat gebruiken zul je merken dat je:
    • altijd ingelogd blijft tot je uitlogt (geen auto-logout)
    • wachtwoorden zonder algoritme opgeslagen worden, dus als er iemand op jouw site komt en jij kijkt in je tabel zie je zomaar zijn of haar wachtwoord staan ipv een hash.
    • handmatig alle leden moet toevoegen (geen registratie oid)
    • handmatig wachtwoorden moet bewerken (change pass)
    • handmatig alle lost passwords moet behandelen
    Ook zal iedereen in je netwerk ingelogd zijn wanneer jij bent ingelogd. Zo zijn er nog een heleboel aandachtspuntjes, en het valt altijd te verbeteren. Je wilt ook altijd meer. Uiteindelijk zul je nooit klaar zijn met ontwikkelen.


    7:  Nawoord

    Zoals je ziet in het einde van deze tut, zul je nooit klaar zijn met ontwikkelen. Daarom helpt het zeker om een project efficiënt aan te pakken. Ook is het slim om heel duidelijk deeltaken gescheiden te houden. Het is niet één project waar je mee bezig bent, maar eigenlijk allemaal kleine projectjes. Daarom moet je ook goed weten en voor jezelf analyseren wat je nou precies wilt maken / aan het maken bent.
    Ik hoop dat jullie iets hebben geleerd van deze tutorial. Er bestaan vast genoeg variaties op wat ik hierboven heb uitgelegd, maar het komt allemaal op hetzelfde neer. Sorry voor de weinig plaatjes enzo, misschien dat iemand daar nog zin in heeft? Ik faal in PS namelijk.
    Bedankt voor het lezen !
    En vragen kunnen natuurlijk altijd gesteld worden.


    8:  Disclaimer

    Het bovenstaande artikel staat onder internationale rechten en mag alleen verveelvoudigd worden met toestemming van de schrijver.
    Dit artikel is alleen voor leerdoeleinden. De schrijver van dit artikel is in geen van de gevallen aansprakelijk voor onwaarheden en/of eventuele schade.






    Edit: Ga er niet vanuit dat dit een goede basis is voor een CMS, dat is het namelijk NIET! Wil je toch je eigen CMS maken en heb je hulp nodig, dan mag je altijd contact opnemen.
    « Laatst bewerkt op: november 03, 2011, 11:29:47 pm door Thisegzz »
    myH> take 50 (cycle "SPAM ")
    "SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM "

    Thisegzz

    • Administrator
    • DigitalPlace Guru
    • *****
    • Berichten: 4279
    • Karma: 342
      • Bekijk profiel
    Re: Hoe pak ik grote projecten aan?
    « Reactie #1 Gepost op: november 03, 2011, 11:24:52 pm »
  • [+1]0
  • [-1]0
  • Mag deze op de homepage?
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »
    [18:09]   infected: Je bent een geile knuffelbeertje
    [18:12]   infected: Ik aanbid thisegzz en niemand anders.
    [18:13]   infected: Ik zit in de eenden comissie.

    jyy

    • DigitalPlace Lid
    • *
    • Berichten: 347
    • Karma: 12
      • Bekijk profiel
    Re: Hoe pak ik grote projecten aan?
    « Reactie #2 Gepost op: november 03, 2011, 11:36:14 pm »
  • [+1]0
  • [-1]0
  • als je er een leuk plaatje bij kan vinden ;)
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »
    myH> take 50 (cycle "SPAM ")
    "SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM "

    xvilo

    • Global Moderator
    • Verslaafd DigitalPlace Lid
    • *****
    • Berichten: 2675
    • Karma: -44
      • Bekijk profiel
      • http://www.xvilo.com
    Hoe pak ik grote projecten aan?
    « Reactie #3 Gepost op: november 04, 2011, 07:46:47 am »
  • [+1]0
  • [-1]0
  • wow!!!
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »


    p03WS

    • Actief DigitalPlace Lid
    • **
    • Berichten: 1252
    • Karma: 12
      • Bekijk profiel
      • http://p03ws.wordpress.com
    Re: Hoe pak ik grote projecten aan?
    « Reactie #4 Gepost op: november 04, 2011, 11:33:09 am »
  • [+1]0
  • [-1]0
  • Nice tutorial :)
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »

    Robin

    • Administrator
    • DigitalPlace Guru
    • *****
    • Berichten: 3158
    • Karma: 145
      • Bekijk profiel
      • http://www.robinj.be/
    Re: Hoe pak ik grote projecten aan?
    « Reactie #5 Gepost op: november 04, 2011, 11:43:09 am »
  • [+1]0
  • [-1]0
  • Citaat van: "jyy"
    Na enige inactiviteit (en nog inactiviteit dat zal volgen) zal ik ter compensatie hier even een HQ tut schrijven - at least, dat is mijn bedoeling.
    Op meerdere forums lange tijd inactief geweest? :p http://webcache.googleusercontent.com/s ... clnk&gl=be
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »
    >><<

    Thisegzz

    • Administrator
    • DigitalPlace Guru
    • *****
    • Berichten: 4279
    • Karma: 342
      • Bekijk profiel
    Re: Hoe pak ik grote projecten aan?
    « Reactie #6 Gepost op: november 04, 2011, 02:17:28 pm »
  • [+1]0
  • [-1]0
  • http://digitalplace.nl/tutorials/overig ... jecten-aan
    Het lijkt me beter om daar verder te gaan ;)
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »
    [18:09]   infected: Je bent een geile knuffelbeertje
    [18:12]   infected: Ik aanbid thisegzz en niemand anders.
    [18:13]   infected: Ik zit in de eenden comissie.

    Mark

    • DigitalPlace Lid
    • *
    • Berichten: 157
    • Karma: -1
      • Bekijk profiel
    Re: Hoe pak ik grote projecten aan?
    « Reactie #7 Gepost op: november 04, 2011, 02:56:49 pm »
  • [+1]0
  • [-1]0
  • Maybe slotje hier dan?
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »

    xvilo

    • Global Moderator
    • Verslaafd DigitalPlace Lid
    • *****
    • Berichten: 2675
    • Karma: -44
      • Bekijk profiel
      • http://www.xvilo.com
    Hoe pak ik grote projecten aan?
    « Reactie #8 Gepost op: november 04, 2011, 04:18:05 pm »
  • [+1]0
  • [-1]0
  • yeay goed idee voor een slotje!!
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »


    Thisegzz

    • Administrator
    • DigitalPlace Guru
    • *****
    • Berichten: 4279
    • Karma: 342
      • Bekijk profiel
    Re: Hoe pak ik grote projecten aan?
    « Reactie #9 Gepost op: november 04, 2011, 04:59:34 pm »
  • [+1]0
  • [-1]0
  • Dat mag jyy zelf beslissen ;)
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »
    [18:09]   infected: Je bent een geile knuffelbeertje
    [18:12]   infected: Ik aanbid thisegzz en niemand anders.
    [18:13]   infected: Ik zit in de eenden comissie.

    jyy

    • DigitalPlace Lid
    • *
    • Berichten: 347
    • Karma: 12
      • Bekijk profiel
    Re: Hoe pak ik grote projecten aan?
    « Reactie #10 Gepost op: november 04, 2011, 05:04:36 pm »
  • [+1]0
  • [-1]0
  • Haha, wat jullie willen xd

    /locked
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »
    myH> take 50 (cycle "SPAM ")
    "SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM "