Avatar billede andreas13_fam Nybegynder
04. juli 2009 - 18:35 Der er 11 kommentarer og
1 løsning

FeedBack på MySQLi objekt

Så blev jeg endelig "færdig" med mit MySQLi objekt.
Jeg er dog helt ny i OOP verden så ville da godt lige have lidt FeedBack på det.
Ideen med objektet var bl.a.:
1) Automatisk konvertering fra UTF-8 til ISO-8859-1.
2) Automatisk bind_result().
3) Fleksibel bind_parms();
4) Mindre kode under brug.
5) At gemme fejl i en log - tilføjer muligvis en MySQL funktion senere så det bliver.
    Prioritet a: Indsæt fejl i database
    Prioritet b: Indsæt fejl i txt fil.
6) Let adgang til insert_id, num_rows og affected_rows
7) At få prepare og query delen af MySQli til at ligne hinanden så meget som muligt.
8) At kunne have flere SQL kommandoer per MySQL forbindelse

Jeg håber i kan tyde min kode
Mit Objekt : http://pastebin.com/f14d62764
Simpelt eksempel: http://pastebin.com/f71b027
Udskrift af "Simpelt eksempel": http://mvc.netkogeren.a-mweb.dk/news

Jeg ser gerne mere end en bruger der giver respons, også hvis det allerede er sagt
Avatar billede dkfire Nybegynder
04. juli 2009 - 19:11 #1
Der er lige en ting du skal have rettet. Du har ikke lavet et objekt, men en klasse.
Du kan lave et objekt af denne klasse når du vil bruge klassen til noget.
Du laver bla et objekt her:
$mysqlc = new MySQLc('user');
Avatar billede dkfire Nybegynder
04. juli 2009 - 19:16 #2
Så kan jeg se du mangler en metode close().
Du kalder metoden her, men jeg kan ikke finde den:

private function connect($host, $username, $password, $database)
        {
                $this->close();
Avatar billede dkfire Nybegynder
04. juli 2009 - 19:20 #3
Og så skal jeg lige kigge lidt bedre efter ;-)
Avatar billede andreas13_fam Nybegynder
04. juli 2009 - 20:23 #4
Vil du lige uddybe det første jeg skriver jo new MySQLc();
eller er det bare en sproglig ting :?
Avatar billede dkfire Nybegynder
04. juli 2009 - 23:39 #5
Det er kun en sproglig ting.

Du laver en klasse.
Af den klasse kan du så lave objekter.
Det du har lavet er en klasse, som du så laver et eller flere objekter afhænger af den kode som du bruger din klasse til.
Håber det gav lidt mening.
Avatar billede dkfire Nybegynder
04. juli 2009 - 23:40 #6
D.v.s at MySQLc er din klasse, men at $mysqlc er et objekt af klassen MySQLc.
Avatar billede repox Seniormester
06. juli 2009 - 09:56 #7
Altså, jeg holder fast i at dine klasser ikke er synderlig brugbare og måske ikke helt giver så meget mening hver gang man støder på en metode.
Men jeg kan godt uddybe det lidt.

MySQLc::__construct():
Skulle jeg bruge objektet ville jeg i instancieringen støde på at jeg skal angive en af tre slags brugere. De to af dem kræver i princippet at jeg har otte linier der definerer konstanter et eller andet sted, hvorpå den sidste rent faktisk ikke er nødvendig, hvis jeg alligevel har angivet førnævnte konstanter.
Det er lidt bøvlet og giver anledning til fejl at have så mange indgangsvinkler blot for at forbinde til en database.
Og igen, det er nytteløst at have <pre> tags rundt om en kastet exception.

MySQLc::connect():
Ultra simpel kode, god indrykning og ikke mange spørgsmålstegn kan rejses ved koden. Dog kan det godt undre mig at du vil sikre dig at forbindelsen til MySQL ikke er oprettet. Da metoden alligevel kun benyttes i klassens construct kan man roligt antage at forbindelsen ikke er etableret.
Din måde at generere fejl på veksler også. I din conctruct bruger du exceptions, i denne metode sender du en fejlmeddelse videre til en anden metode. Men det kommer jeg også til.

MySQLc::query():
Hvad vil der ske, hvis jeg gerne ville køre en simpel query (ikke prepared statement) som denne:
$sql = "INSERT INTO table (brugerId, comment) VALUES (232, 'Hvad er det?')";
Ville den ikke starte en instans af klassen c_query med typen 'prepare'?
Men for at komme udover den problematik har du så lavet en metode kaldet ManualQuery. Det er ikke synderligt pænt - så ville det være bedre du havde to metoder der var navngivet logisk efter hvad du havde behov for (eksempelvis pQuery() og mQuery()).

MySQLc::AddError():
Hører efter min mening ikke til i klassen.
Du burde have et seperat objekt der håndterer logning af dine fejlmeddelser, såfremt de skulle opstå. For det første kræver det at jeg har skriveadgang til en fil (eller et helt bibliotek hvis du vil oprette den hvis den ikke eksisterer som du angiver med w+), for det andet er det slet ikke sikkert at jeg ønsker fejlmeddelserne gemt i en logfil, men det bestemmer jeg jo ikke selv. Den tilknyttede funktion curPageURL() hører heller ikke til i din klasse. Hvis det er et script jeg har inkluderet der skaber problemet, så er URL'en jo egentlig også ligegyldig, så ville jeg hellere vide hvad det er for en fil jeg har fejl i.

MySQLc::pre():
Din klasse virker umiddelbart som om du gerne ville have det skulle være et abstraktionslag; nu har du dog også HTML output med. Måske en meget god ide under udvikling, men så vender vi jo bare tilbage til din AddError funktion.

Puha, det var så den første klasse; Den c_query klasse er jo endnu længere men den kommer jeg let henover: dine funktionaliteter i c_query burde være en del af MySQLc. Jeg ser slet ingen fordel eller formål i opdelingen, heller ikke med tanke på dit eksempel. Dine funktioner i klassen er alligevel også så prægede af mysqli at den er så specifik at du ikke længere kan portere den over i et andet database lag.
Jeg forstår ikke hvorfor det er så vigtigt for dig at lade dit databaselag håndtere encoding? For det første er det ikke alle der har mbstring som extension på deres server - for det andet bør det også være op til udvikleren at lave sin kode ordentligt, så du ikke skal tage højde for at koden kan være sløset.

Stadigvæk, min holdning er ikke den ufejlbarlige sandhed - det her er kun en holdning.
Avatar billede andreas13_fam Nybegynder
06. juli 2009 - 15:31 #8
Mange tak for respons repox.
Jeg skal nok tage det noget mere seriøst denne gang, da mit må jo nu er at rette fejl/mangler, :)
Avatar billede andreas13_fam Nybegynder
06. juli 2009 - 21:47 #9
Tror der er meget forskel på hvad meningen er med vores 2 meget forskellige classer.
Dit formål er at gøre brugen af 2 forskellige SQL-database-typer ens. Jeg kender knap nok til 10% af funktionerne i MySQL, og tænker ikke over at skulle bruge andre SQL-database-typer (selvfølgelig kan det ændre sig).

Mens mit mål er at gøre brugen af MySQLi meget letter, med mindre huske kode, med samme muligheder.
fx var bind_result noget at det der altid gav problemer, fordi jeg skulle angive hver en række i min database tabel.

Grunden til de 2 classer er hvis sagt før 8) At kunne have flere SQL kommandoer per MySQL forbindelse.

Det med konverteringen er faktisk lidt sjov, det har intet med dårlig kode at gøre. Men mere at MySQL i utf8_danich ikke sotere ÆØÅ ordentligt. Derfor konvertere jeg til (kun ved brug af nogle tabler), til ISO-8859-1  da ÆØÅ problemet ikke er her.
Dette var enlig ikke et forsøg på at forsvare noget, men mere at oplyse om at vores formål er meget forskellige.

PS: PHP er for mig kun en hobby, så det er også kun mig der skal bruge classen, og jeg er allerede blevet glad for den.

PPS: arbejder stadig på næste version ;)
Avatar billede repox Seniormester
07. juli 2009 - 00:07 #10
Jeg tror du har ganske ret at formålet med vores klasser, sammenlignet altså, er to vidt forskellige.
Du har så stadig ikke helt forstået idéen med mit abstraktionslag, men som jeg har nævnt før, så er min kode ikke den rigtige måde at gøre det på; det er een måde at gøre det på.

hvis du føler dit arbejde med mysqli extension nu er blevet væsentligt nemmere for dig at arbejde med, og du egentlig føler du har opnået hvad du ville, så forstår jeg ikke hvad det spørgsmål du har oprettet her drejer sig om?

Nå, men, så længe dine behov bliver opfyldt efter dine kriterier, så er koden som den skal være.
Avatar billede andreas13_fam Nybegynder
11. december 2010 - 12:31 #11
Mange tak for dine kommentarer, jeg beklager at jeg ikke har skrævet før nu, men du må meget gerne ligge et svar.
Avatar billede repox Seniormester
11. december 2010 - 13:15 #12
Det fik du her...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester