Gå til innhold

Hva er "best practise" for å kjøre MySQL spørringer? Er OOP verdt det?


Anbefalte innlegg

Hei,

 

Jeg har sett så mange forskjellige måter å gjøre ting på... Jeg har begynt å jobbe litt med OOP da jeg har hørt dette skal være så bra. Men så langt er jeg rett og slett i tvil om det er noen vits å ha en database klasse... jeg sparer vel egentlig ikke noen kode på det, eller i veldig liten grad.

 

Hva er det som er "best practise" egentlig? Jeg vil gjerne gjøre det som er mest mulig "standard", og ønsker IKKE installere spesielle pakker for at noe skal funke på serveren min... Generelt sett ønsker jeg en metode som kan brukes på alle serveren med støtte for php 5 og mysql.

 

Noen tips?

 

Eksempel på det jeg mener OOP vs vanlig:

OOP:

$db->prep('INSERT INTO forum_topics (cat_id, title, username, views, replies) VALUES(:a, :b, :c, :d, :e)');
		   $db->bind(':a',$cat_id);
		   $db->bind(':b',$title);
		   $db->bind(':c',$username);
		   $db->bind(':d',0);
		   $db->bind(':e',0);
		   $db->run();
		   $topic_id = $db->insertId();

Vanlig:

$q = sprintf('INSERT INTO forum_topics (cat_id, title, username, views, replies) VALUES(%d, %s, %s, %d, %d)',
	   quote_smart($cat_id),
	   quote_smart($title),
	   quote_smart($username),
	   0,
	   0);	
	   $res = mysql_query($q);	
	   $topic_id = mysql_insert_id();

 

Kanskje jeg bare bruker en "dårlig" db class..

Lenke til kommentar
Videoannonse
Annonse

Jeg bruker MDB2 (PEAR pakke)

Der har du feks kun

$sth = $mdb2->prepere('INSERT INTO forum_topics (cat_id, title, username, views, replies) VALUES(?, ?, ?, 0, 0)');
$res = $sth->execute(array($cat_id,$title,$username));
$topic_id = $mdb2->lastInsertID();
$sth-free();

 

 

Skal si at jeg ikke husker hvordan man henta ut siste langt til id, men det er kun en enkel linje

(sjekke dok)

 

EDIT:

Fant den

Endret av AlecTBM
Lenke til kommentar

Har faktisk vært borti den noen ganger, men den må installeres på server ikke sant? Eller er den normalt med...?

 

En annen ting jeg glemte å si er at jeg vil helst ha noe uten copyright slik at jeg kan bruke det i absolutt alle type prosjekter...

Lenke til kommentar

om du benchmarker det er overheaden av klasser merkbar. native funksjonskall er overlegent raskest, så om du har en side som hittes mye kan du tjene på å unwrappe databasespørringer fra en klasse.

 

Lesligheten av kode (og vedlikehold) når du bruker klasser er er bedre.

 

bruker du bind variabler vil databasen din performe bedre. php sine mysql_ funksjoner støtter ikke dette, men det er mulig å få til via pear eller database driver kall.

 

I antall kode-linjer vil du ende omtrent likt.

Lenke til kommentar

Takker for tips... men jeg må ha noe som er standard, altså at man ikke trenger å installere noe spesielt på server...

 

PS, kan du oversette dette til norsk:? :p

 

om du benchmarker det er overheaden av klasser merkbar. native funksjonskall er overlegent raskest, så om du har en side som hittes mye kan du tjene på å unwrappe databasespørringer fra en klasse.

Lenke til kommentar

@Warz

om du kun et ute etter perfomance, unngå klasser og bruk mysql_ funksjonene som kommer standard i php ;)

Har du noe grunnlag for å si at de forskjellene er særlig merkbare? Jeg vil tro ytelsesforbedringen er i størrelsesorden µs/req., med litt flaks kanskje nesten 0.1ms, og begge deler kan kalles mer eller mindre neglisjerbar forskjell.

Lenke til kommentar

ja, i større nettsamfunn der du server flere hundre request i sekundet er forskjellen merkbar om man går med oop design.

 

men det er jo et godt poeng du har at for de *fleste* er nok dette en mikro-optimering som man ikke trenger å gjøre. er nok mange andre lure ting man kan gjøre før man trasher lesbarhet for perfomance.

Lenke til kommentar

ja, i større nettsamfunn der du server flere hundre request i sekundet er forskjellen merkbar om man går med oop design.

Godt mulig det, men jeg har til gode å se en test som verifiserer at det i det heltatt er mulig å spare såpass mye at det er verdt det uannsett skala. Jeg blir ikke mindre skeptisk når jeg etter en kjapp test må konstantere at overhead av å opprette et objekt av en klasse og kjøre en funksjon i den klassen kontra å bare kjøre en funksjon er på ca 1µs. Du skal ha veldig mye trafikk, ha veldig mange klasser i bruk og kjøre veldig mange funksjoner i de klassene før dette lønner seg. Til sammenligning vil det å opprette og tilegne 5 variabler en verdi ta mer eller mindre samme tid, iallfall på min maskin. Derfor er jeg svært skeptisk her.

 

men det er jo et godt poeng du har at for de *fleste* er nok dette en mikro-optimering som man ikke trenger å gjøre. er nok mange andre lure ting man kan gjøre før man trasher lesbarhet for perfomance.

Ja, dessverre er det alt for mange som henger seg opp i poengløse ytelsesforbedringer.
Lenke til kommentar

gjorde en kjapp test her:

antall kall den klarte på 10 sek.

 

(script som new'er en klasse og setter noen variabler)

 

class wrapped: 259 roundtrips. (med include)

unwrapped: 278 roundtrips.

 

 

class wrapped: 267 roundtrips. (uten include)

unwrapped: 273 roundtrips.

 

ser ut som mesteparten av hitten faktisk kommer av includen, som egentlig maker sense, da disk io kan være "dyrt".

 

Men jeg er enig med ernie, dette er ikke noen forskjeller å snakke om. Jeg ville definitvt gått for en klasseløsning.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...