Hallo
Heb me een lange periode bezig gehouden met OOP en hebt toen niets meer gedaan met mysql (was langetijd(met lange tussen pauzes van niks doen en overnieuw starten) bezig met een html form creator dat de html form zelf geeft + validatie en ben daar zo goed als klaar mee).

Maar nu wil ik een goed beveiligde authentication script maken, maar weet niet meer precies hoe :$. Heb natuurlijk hier op phphulp naar de scripts zelf gekeken. Maar daar vind je veel 'verouderde', incomplete en/of te simele authentication scripts.

Waar ik nu vooral mee zit is de mysql gedeelte. Ik weet niet meer precues hoe ik dingen precies (het beste) moet aanpakken. Ik heb hier nog wel een handige boek dat ik kan doornemen(PHP 5 en MySQL Het Complete HANDboek), maar wil het weer leren door te doen(heb het alleen verleerd).

Mijn doel is dus om een authentication script te maken met de volgende dingen in gedachten:
-PHP5 OOP
-Sessions (geen cookies)

Punten die ik er in wil gaan verwerken:

Inlogsysteem

Onderdelen:
Inloggen
Uitloggen
Registreren
Checkpermission
Activeren
Wachtwoord vergeten
Failure check(bv naar 5 keer mislukt inloggen binnen een half uur is bannen(niet kunnen inloggen) voor 1 uur).
Captcha beveiliging?

Adminpanal:
-Accounts:
|-Toevoegen
|-Aanpassen
|-Verwijderen
|-Zoeken
|-??

-Rechten(weet nog niet hoe ik dit ga doen met behulp van een database. Ga dit gebruiken Tut link):
|-Toevoegen
|-Aanpassen
|-Verwijderen
|-??

-Cijfers
|-Aantal leden
|-Aantal active leden
|-Leden online
|-Laatste 10-100 leden geregistreerd
|-??

-Config
|-Activeren (aan/uit)
|-Failurecheck instellingen (na ?x mislukt binnen ?? minuten bannen voor ?? minuten)
|-??


Met deze 'tijdenlijke' mysql:

Bevat misschien nog fouten. Zal het morgen verbeteren...
edit(tabel verandert):
CREATE TABLE users (
  id int(11) NOT NULL auto_increment,
  username varchar(20) NOT NULL default '',
  password varchar(32) NOT NULL default '',
  email varchar(...) NOT NULL default '',
  activation int(11) NOT NULL default '0',
  reg_date datetime NOT NULL default '0000-00-00 00:00:00',
  last_date datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (id),
  UNIQUE KEY username
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


Nu wil ik beginnen met de login gedeelte. Ik heb dus dan een 'class authentication' met daarin de functie 'login'.

Nu heb ik het volgende(grotensdeels hier van de scripts op phphulp):

<?php
  function login($username, $password)
  {
    $sql_query = 'SELECT * FROM authentication WHERE username="'.$username.'" AND password="'.md5($password).'"'; 
    $rows = mysql_num_rows(mysql_query($sql)); 
    if($rows == 1)  
    {
      $update = 'UPDATE authentication SET ip="'.$_SERVER["REMOTE_ADDR"].'" WHERE username="'.$username.'"'; 
      mysql_query($update); 
      $_SESSION['login'] = '1';
    } 
    if($rows == 0) 
    { 
      // header terug
    }	
  }
?>


Hoe kan ik nu dit al beste aanpakken(zo efficent en snel mogenlijke - beste manier gewoon). Hoe zou jij dit doen. (Met ingedachte dat je de connectie al hebt gemaakt en boven aan session_start() heb staan.

Een lange topic :p, maar wil graag het hele script hier zo maken als dat gaat. Is altijd leuk als je ziet hoe andere mensen het doen en zo van elkaar leert. Ik wil dit script daarna hier op phphulp plaatsen als het af is samen met de credits van iedereen hier die hiermee meehelpt.

Ik hoop dat jullie mij niet gaan afzeiken van dat ik het met gaan google of gewoon het boek moet doorlezen, want het zou leuk zijn als samen met iedereen hier een goeie basis script lib kunnen maken. Wil dus een soort van refactormycode.com doen(check de site als je het niet kent).

Alvast bedankt, DDragonz :) :$
Ik weet dat ze het gaan opsplitsen idd. Licentie gezeur toch ook altijd...

Ik heb zelf de classes van mysqli ge-extend inderdaad.
Maar had in het verleden eigenlijk precies het zelfde maar dan met wrapper classes voor mysql met queries voor Statements e.d.

PDO...
Nope niet voor mij! mysql / pgSql zijn bijna niet te vergelijken. En voor de nieuwelingen is PDO dan misschien makkelijk. Maar persoonlijk hoeft het van mij niet...
OOP gaat ook ten koste van de snelheid, validatie ook, maar zijn dat dingen die je niet zou doen?


Waar haal je dit nou vandaan?


PDO zou iets recht moeten maken wat krom is, namelijk SQL dialecten.

- Er zijn verschillen tussen wat database systemen kunnen. PDO kan dit niet voor jou na maken.
- Meestal maak je een project voor 1 of 2 database systemen. Waarom dan PDO gebruiken?
- Je zult een PDO niet specifiek voor 1 database systeem een project kunnen maken, iets wat in de praktijk toch vaak voorkomt en nodig is. Uiteraard zou je PDO kunnen uitbreiden, maar wat is dan nog het verschil met mysql of mysqli?

Eigenlijk net als met ActiveRecord in Ruby on Rails, eerst is het geweldig maar dan begint de ellende als je iets buiten het boekje wilt doen.

edit:

Hier nog wat benchmark,s:
http://dealnews.com/developers/php-mysql.html
http://blogs.vinuthomas.com/2006/08/07/benchmark-mysql-mysqli-pdo-in-php/

Het lijkt mij dat dit voor pgSQL hetzelfde zal zijn.
PDO is een database abstraction layer en zal altijd langzamer zijn dan de mysql, mysqli of pg extensies.

Maar natuurlijk is PDO ook gewoon een goede basis voor een project.
Maar ik zou het niet snel gaan gebruiken.
Dus wel of geen PDO? En welke database ken ik nu het best gebruiken als ik het later ook op php 6 wil gaan laten functioneren? Ik heb nu altijd met mysql gewerkt. Zou iemand hier misschien ergens op zijn eigen host een poll maken(met misschien .htacces om mensen buiten phphulp en dit topic weg te houden) waar je moet kiezen wat nu het beste is als je kijkt naar het later intergreren naar php6.
Bv

*Mysql
*Mysqli
*pgSQL
*PDO


Wil het beste alles eerst op 'papier'. Is veel makelijker programmeren zo als je weet wat je moet gaan doen :)(planning).
blijft een persoonlijke keuze natuurlijk..
Maar verschillende databases kunnen verschillende dingen en werken ook heel verschillend.

De ham vraag is dus waar je gebruik van wilt maken... voor standaard dingen ben je qua scripten sneller af met PDO lijkt me...
Maar dan laat je dus een hoop dingen over 1 kam scheren...
Martijn, benchmarking op dit gebied is allemaal heel erg leuk en erg goed van je dat je zulke totaal nutteloze tests kan vinden op het internet.

Een test waar 88 r/s gemaakt worden en een insert gedaan wordt van 10000 records, en dan heb jij het over de praktijk? De praktijk die in dit topic gaat over een authenticatie systeem?

@dragonz, ik zou het niet direct afstemmen op php6, dit duurt zeker nog jaren.
Wat ik wel zou afwegen is of je iets wil leren ofniet. Wil je weer je oude rotte mysql code uit de kast halen, of wil je een echte database gaan gebruiken zoals pgsql.
En wil je alles direct aanspreken of wil je absctractiue layers gaan schrijven ?
@Lode:
Hoebedoel je met alles over een kam scheren... Graag uitleg.

@Joep:
Wat zou ik dan het beste kunnen gebruiken? Op de meeste (goedkope/budget)hostingdealers hebben ze bijna alleen maar mysql ondersteuning. Mysql is toch het meest gebruikte database, toch.

@allemaal:
pgSQL ziet er wel goed uit, maar in de officiele documontatie op de website van hun staan allemaal voorbeelden samen met C taal(wat lijkt op php, maar toch geen webbased programmeren is). Maar op http://nl3.php.net/pgsql staat wel alles goed uitgelegd dus het leren van dit zou geen probleem moeten zijn.

Welke andere goeie databases kan ik overwegen? Of pgSQL gewoon al het beste?

edit:
Is pgSQL gratis of moet je daar licenties voor kopen als webhoster?
Ik zou gewoon gebruik gaan maken van PDO, en vervolgens een keuze maken tussen MySQL of PostreSQL.

Niet zomaar beginnen met scripten maar eerst een duidelijke klasse diagram maken zodat je weet welke klasses welke functionaliteit hebben.
Met PDO zou het toch kunnen om het voor mysql en phsql allebij te programmeren.
edit:
Is PDO wel op elke server te doen? Want je moet er toch iets voor in de php.ini doen dus er is een kans dat een webhosting niet heeft. Zie http://nl2.php.net/pdo
Met PDO zou het toch kunnen om het voor mysql en phsql allebij te programmeren.
In de praktijk zal dat nooit mogelijk zijn aangezien de SQL die je gebruikt voor beide databases niet op alle punten hetzelfde zal zijn. Ok, de basishandelingen zoals het selecteren, invoegen, updaten en verwijderen van records wel, maar als je alleen die functies gebruikt, benut je niet de echte kracht van de database. Je zult dus eigenlijk nooit een systeem schrijven dat voor 2 database systemen geschikt is.

Als je de keuze hebt kies je uiteraard voor postgreSQL en ga je niet eens proberen om je vingers aan MySQL te branden. Deze laatste gaat namelijk veel te vrij om met de standaarden en probeert regelrechte bugs als functionliteit te verkopen.
DDragonz schreef op 17.02.2008 19:17
Met PDO zou het toch kunnen om het voor mysql en phsql allebij te programmeren.
edit:
Is PDO wel op elke server te doen? Want je moet er toch iets voor in de php.ini doen dus er is een kans dat een webhosting niet heeft. Zie http://nl2.php.net/pdo


Ja PHP 5 is vereist, maar wanneer je het Object georienteerd gaat schrijven is PHP5 ook wel required.
Verder hoef je niks in je php.ini te doen want in PHP5 staan standaard alle pdo extenties enabled ( zover ik weet ).

Reageren