Real-World OOP med PHP og MySQL

Mange eksempler fra roboter til sykler har blitt tilbudt som "enkle" forklaringer på hva OOP er. Jeg har valgt å vise deg hvordan OOP fungerer med et virkelighetseksempel, for en programmerer. Ved å opprette en MySQL CRUD-klasse kan du enkelt lage, lese, oppdatere og slette oppføringer i alle dine prosjekter, uansett hvordan databasen er utformet.


Å sette opp skjelettet i klassen vår er ganske enkelt når vi finner ut nøyaktig hva vi trenger. Først må vi sørge for at vi kan gjøre våre grunnleggende MySQL-funksjoner. For å gjøre dette trenger vi følgende funksjoner:

  • Å velge
  • Sett inn
  • Slett
  • Oppdater
  • Koble
  • Koble fra

De virker ganske grunnleggende, men jeg er sikker på at når vi går gjennom, vil vi legge merke til at mange av dem bruker noen lignende aspekter, så vi må kanskje lage flere klasser. Her er hva klassens definisjon bør se ut. Legg merke til at jeg sørget for at metodene ble opprettet med det offentlige søkeordet.

()  offentlig funksjonstillegg ()  offentlig funksjon slette ()  offentlig funksjon oppdatering () 

funksjonstilkobling ()

Denne funksjonen vil være ganske grunnleggende, men å skape den vil kreve at vi først oppretter noen variabler. Siden vi vil sørge for at de ikke kan nås utenfor vår klasse, vil vi sette dem som private. Disse variablene vil bli brukt til å lagre verten, brukernavnet, passordet og databasen for tilkoblingen. Siden de ganske mye vil forbli konstant hele tiden, trenger vi ikke engang å opprette modifikator- eller tilgangsmetoder for det. Deretter trenger vi bare å lage en enkel mysql-setning for å koble til databasen. Selvfølgelig, siden vi som programmører alltid må anta at brukeren (selv om det er oss) vil gjøre noe dumt, kan vi legge til et ekstra forsiktighetslag. Vi kan sjekke om brukeren faktisk har koblet seg til databasen først, og hvis de har det, er det egentlig ikke nødvendig å koble til igjen. Hvis de ikke har det, kan vi bruke deres legitimasjonsbeskrivelser for å koble til.

privat db_host = "; privat db_user ="; privat db_pass = "; privat db_name ="; offentlig funksjon koble til (hvis $ $ this-> con) $ myconn = @mysql_connect ($ this-> db_host, $ this-> db_user, $ this-> db_pass); hvis ($ myconn) $ seldb = @mysql_select_db ($ this-> db_name, $ myconn); hvis ($ seldb) $ this-> con = true; returnere sant;  ellers return false;  ellers return false;  ellers return true; 

Som du kan se, bruker den noen grunnleggende mysql-funksjoner og litt feilkontroll for å sikre at ting går i henhold til planen. Hvis den kobles til databasen vellykket, vil den returnere sann, og hvis ikke, vil den returnere falsk. Som en tilleggsbonus vil det også sette tilkoblingsvariablen til sann hvis forbindelsen ble fullført.

offentlig funksjon koble fra ()

Denne funksjonen vil bare sjekke vår tilkoblingsvariabel for å se om den er satt til sann. Hvis det er, betyr det at det er koblet til databasen, og vårt skript vil koble fra og returnere sant. Hvis ikke, så er det egentlig ikke et behov for å gjøre noe i det hele tatt.

offentlig funksjon koble fra () if ($ this-> con) if (@mysql_close ()) $ this-> con = false; returnere sant;  ellers return false; 

offentlig funksjon velg ()

Dette er den første funksjonen der ting begynner å bli litt komplisert. Nå skal vi håndtere brukerargumenter og returnere resultatene riktig. Siden vi ikke nødvendigvis vil kunne bruke resultatene med en gang, skal vi også introdusere en ny variabel som kalles resultat, som vil lagre resultatene riktig. Bortsett fra det skal vi også lage en ny funksjon som kontrollerer for å se om et bestemt bord finnes i databasen. Siden alle våre CRUD-operasjoner vil kreve dette, er det mer sanselig å lage det separat enn å integrere det i funksjonen. På den måten sparer vi plass i koden vår og som sådan kan vi bedre optimalisere ting senere. Før vi går inn i selve seleksjonserklæringen, her er tableExists-funksjonen og den private resultatvariabelen.

privat $ result = array (); privatfunksjonstabellExister ($ tabell) $ tablesInDb = @mysql_query ('VIS TABELLER FRA'. $ this-> db_name. 'LIKE' '. $ table.' "'); hvis ($ tablesInDb) if (mysql_num_rows ($ tablesInDb) == 1) return true;  ellers return false; 

Denne funksjonen kontrollerer bare databasen for å se om den nødvendige tabellen allerede eksisterer. Hvis det gjør det, vil det returnere sant og hvis ikke, vil det returnere falskt.

offentlig funksjon velg ($ tabell, $ rows = '*', $ where = null, $ order = null) $ q = 'SELECT'. $ rader. ' FRA '. $ Tabell; hvis ($ hvor! = null) $ q. = 'WHERE'. $ where; hvis ($ rekkefølge! = null) $ q. = 'BESTILL BY'. $ rekkefølge; hvis ($ this-> tableExists ($ table)) $ query = @mysql_query ($ q); hvis ($ spørring) $ this-> numResults = mysql_num_rows ($ query); for ($ i = 0; $ i < $this->numResults; $ i ++) $ r = mysql_fetch_array ($ query); $ key = array_keys ($ r); for ($ x = 0; $ x < count($key); $x++)  // Sanitizes keys so only alphavalues are allowed if(!is_int($key[$x]))  if(mysql_num_rows($query) > 1) $ dette-> resultat [$ i] [$ nøkkel [$ x]] = $ r [$ nøkkel [$ x]]; ellers hvis (mysql_num_rows ($ query) < 1) $this->resultat = null; ellers $ dette-> resultat [$ nøkkel [$ x]] = $ r [$ nøkkel [$ x]];  returnere sann;  ellers return false;  returnere heller ikke false; 

Selv om det virker litt skummelt ved første øyekast, gjør denne funksjonen virkelig en hel masse ting. For det første aksepterer 4 argumenter, hvorav 1 er nødvendig. Tabellnavnet er det eneste du må sende til funksjonen for å få resultater tilbake. Men hvis du vil tilpasse det litt mer, kan du gjøre det ved å legge til hvilke rader som skal trekkes fra databasen, og du kan til og med legge til en varsel og ordrebestemmelse. Selvfølgelig, så lenge du passerer den første verdien, blir resultatet standard til de forhåndsinnstilte, så du trenger ikke å bekymre deg for å sette dem alle. Biten av kode rett etter argumentene tjener bare til å samle alle våre argumenter inn i en valgt setning. Når det er gjort, gjøres en sjekk for å se om tabellen eksisterer, ved hjelp av vår tidligere tableExists-funksjon. Hvis den eksisterer, fortsetter funksjonen videre og spørringen utføres. Hvis ikke, vil det mislykkes.

Den neste delen er den virkelige magien av koden. Hva det gjør er å samle kolonnene og dataene som ble forespurt fra databasen. Den tilordner den til vår resultatvariabel. For å gjøre det enklere for sluttbrukeren, i stedet for automatisk inkrementering av talltastene, brukes navnene på kolonnene. Hvis du får mer enn ett resultat, blir hver rad som returneres lagret med et todimensjonalt array, idet den første nøkkelen er numerisk og automatisk inkrementert, og den andre nøkkelen er navnet på kolonnen. Hvis bare ett resultat returneres, blir det opprettet et endimensjonalt array med nøklene som er kolonnene. Hvis ingen resultater blir slått, blir resultatvariabelen satt til null. Som jeg sa tidligere, virker det litt forvirrende, men når du bryter ting ned i sine individuelle seksjoner, kan du se at de er ganske enkle og grei.

offentlig funksjonsinnsats ()

Denne funksjonen er mye enklere enn vår tidligere. Det lar oss bare legge inn informasjon i databasen. Som sådan vil vi kreve et ekstra argument til navnet på bordet. Vi vil kreve en variabel som tilsvarer verdiene vi ønsker å legge inn. Vi kan bare skille hver verdi med et komma. Da er alt vi trenger å gjøre, raskt sjekke for å se om vårt bordExists, og deretter bygge innsatserklæringen ved å manipulere våre argumenter for å danne en innsatserklæring. Så kjører vi bare spørringen vår.

offentlig funksjonsinnsats ($ tabell, $ verdier, $ rader = null) if ($ this-> tableExists ($ table)) $ insert = 'INSERT INTO'. $ tabell; hvis ($ rader! = null) $ insert. = '('. $ rader. ')';  for ($ i = 0; $ i < count($values); $i++)  if(is_string($values[$i])) $values[$i] = '"'.$values[$i].'"';  $values = implode(',',$values); $insert .= ' VALUES ('.$values.')'; $ins = @mysql_query($insert); if($ins)  return true;  else  return false;   

Som du kan se, er denne funksjonen mye enklere enn vår ganske komplekse utvalgte setning. Vår slettingsfunksjon vil faktisk bli enda enklere.

offentlig funksjon slette ()

Denne funksjonen sletter enten et bord eller en rad fra vår database. Som sådan må vi passere tabellnavnet og en valgfri vareklausul. Var-klausulen vil gi oss beskjed hvis vi trenger å slette en rad eller hele tabellen. Hvis varklausulen er bestått, betyr det at oppføringer som samsvarer, må slettes. Etter at vi har oppdaget alt det, handler det bare om å samle vår slettingserklæring og kjøre spørringen.

offentlig funksjon slette ($ tabell, $ hvor = null) if ($ this-> tableExists ($ table)) if ($ where == null) $ delete = 'DELETE'.  else $ delete = 'DELETE FROM'. $ table. ' Hvor '. $ Hvor;  $ del = @mysql_query ($ delete); hvis ($ del) return true;  ellers return false;  ellers return false; 

Og til slutt kommer vi til vår siste store funksjon. Denne funksjonen tjener bare å oppdatere en rad i databasen med ny informasjon. Men på grunn av den litt mer komplekse karakteren av den, vil den komme som litt større og uendelig mer forvirrende. Frykt aldri, det følger mye av det samme mønsteret i vår tidligere funksjon. Først vil det bruke våre argumenter for å opprette en oppdateringserklæring. Det vil da fortsette å sjekke databasen for å sikre at tabellenExister. Hvis den eksisterer, vil den bare oppdatere den aktuelle raden. Den vanskelige delen kommer selvfølgelig når vi prøver å opprette oppdateringserklæringen. Siden oppdateringserklæringen har regler for oppdatering av flere oppføringer (IE - forskjellige kolonner i samme rad via listig bruk av komma), må vi ta hensyn til dette og skape en måte å håndtere det på. Jeg har valgt å passere hvor klausulen som et enkelt utvalg. Det første elementet i arrayet vil være navnet på kolonnen blir oppdatert, og den neste vil være verdien av kolonnen. På denne måten vil hvert jevne tall (inkludert 0) være kolonnens navn, og hvert oddetall vil være den nye verdien. Koden for å utføre dette er veldig enkelt, og presenteres nedenfor utenfor funksjonen:

for ($ i = 0; $ i < count($where); $i++)  if($i%2 != 0)  if(is_string($where[$i]))  if(($i+1) != null) $where[$i] = '"'.$where[$i].'" AND '; else $where[$i] = '"'.$where[$i].'"';  else  if(($i+1) != null) $where[$i] = $where[$i]. ' AND '; else $where[$i] = $where[$i];   

Neste del vil opprette delen av oppdateringsoppgaven som omhandler å sette inn variablene. Siden du kan endre et hvilket som helst antall verdier, valgte jeg å gå med en matrise hvor nøkkelen er kolonnen og verdien er den nye verdien av kolonnen. På denne måten kan vi til og med gjøre en sjekk for å se hvor mange forskjellige verdier som ble sendt for å bli oppdatert, og kan legge til komma på riktig måte.

$ keys = array_keys ($ rader); for ($ i = 0; $ i < count($rows); $i++)  if(is_string($rows[$keys[$i]]))  $update .= $keys[$i].'="'.$rows[$keys[$i]].'"';  else  $update .= $keys[$i].'='.$rows[$keys[$i]];  // Parse to add commas if($i != count($rows)-1)  $update .= ',';  

Nå som vi har de to biter av logikk ut av veien, er resten av oppdateringsoppgaven enkel. Her presenteres det nedenfor:

offentlig funksjon oppdatering ($ tabell, $ rader, $ hvor) if ($ this-> tableExists ($ table)) // Parse hvor verdiene // likeverdier (inkludert 0) inneholder hvor rader // ulige verdier inneholder klausulene for raden for ($ i = 0; $ i < count($where); $i++)  if($i%2 != 0)  if(is_string($where[$i]))  if(($i+1) != null) $where[$i] = '"'.$where[$i].'" AND '; else $where[$i] = '"'.$where[$i].'"';    $where = implode('=',$where); $update = 'UPDATE '.$table.' SET '; $keys = array_keys($rows); for($i = 0; $i < count($rows); $i++)  if(is_string($rows[$keys[$i]]))  $update .= $keys[$i].'="'.$rows[$keys[$i]].'"';  else  $update .= $keys[$i].'='.$rows[$keys[$i]];  // Parse to add commas if($i != count($rows)-1)  $update .= ',';   $update .= ' WHERE '.$where; $query = @mysql_query($update); if($query)  return true;  else  return false;   else  return false;  

Nå som vi har det vi har fullført vår siste funksjon, er vårt enkle CRUD-grensesnitt for MySQL komplett. Du kan nå opprette nye oppføringer, lese bestemte oppføringer fra databasen, oppdatere oppføringer og slette ting. Også skape og gjenbruke denne klassen vil du finne at du sparer deg mye tid og koding. Åh, skjønnheten i objektorientert programmering.

Bruken

Så vi har gjort hele klassen vår, men hvordan bruker vi den? Denne delen er enkel. La oss starte med å lage en veldig enkel systemdatabase som skal brukes i testingen. Jeg opprettet en database som ble kalt test, og kjørte deretter MySQL-registret. Du kan plassere den i en hvilken som helst database du liker, bare vær sikker på at du endrer tilkoblingsvariablene øverst på skriptet for å matche:

Den første linjen er kommentert utelukkende fordi ikke alle vil trenge det. Hvis du trenger å kjøre det mer enn en gang, må du uncomment det andre gang for å sikre at den skaper bordet.

Nå som vårt bord er opprettet og befolket, er det på tide å kjøre noen enkle spørringer på den.

koble(); $ DB> velg ( 'mysqlcrud'); $ res = $ db-> getResult (); print_r ($ res); ?>

Hvis du gjør det riktig, bør du se følgende:

På samme måte kan vi gå et skritt videre og kjøre et oppdateringsspørsmål, og deretter skrive ut resultatene:

oppdatering ( 'mysqlcrud', array ( 'navnet' => 'skiftet!'), en matrise ( 'id', 1)); $ DB> oppdateringen ( 'mysqlcrud', array ( 'name' => 'Changed2!'), Array ( 'id', 2)); $ res = $ db-> getResult (); print_r ($ res); ?>

Vi bør se dette

Nå for en enkel innsatserklæring:

;sett inn ('mysqlcrud', array (3, "Name 4", "[email protected]")); $ res = $ db-> getResult (); print_r ($ res); ?>