Enkel PHP Class-Based Querying

Selv om det vanligvis er tilrådelig å bruke en slags rammeverk eller CMS, er det noen ganger et prosjekt som er lite nok slik at disse alternativene vil veie ned utviklingen. Men selv i mindre prosjekter bør ikke separering av presentasjonselementer fra backend-spørring ignoreres. Denne opplæringen vil gå deg gjennom å lage en grunnleggende klassebasert spørringsmotor for PHP og MySQL.


Trinn 1. Konfigurer prosjektet

Det første vi skal ønske å gjøre, er å lage noen bestemte filer og kataloger. Slik liker jeg å sette opp prosjektene mine. Du kan selvfølgelig gjerne endre navn og struktur til din smak. Bare vær sikker på at du endrer kravet senere også.

Lag kataloger

Vi trenger en ny katalog for å holde alt. I dette tilfellet ringte jeg det tut. Innsiden av det legger jeg konfigurasjonsfilene i en katalog som heter conf. Da skal jeg lage en inc katalog (kort for å inkludere) og sette en "klassekatalog" inne i det.

Legg til filer

Deretter inne / conf, vi skal lage config.php. Innsiden / Inc / class vi skal lage DAL.php. Til slutt, i rotkatalogen, vil vi lage index.php.

DAL står for "Data Access Layer" eller "Data Access Link".

I flertrinnsarkitektur er det i hovedsak brukt til å oversette database-spørringsresultater til objekter og omvendt.


Trinn 2. Oppsett databasen

Vi må lage en database og fylle den med noen data. I forbindelse med denne opplæringen vil det bare være en to-tabell database med et enkelt-til-mange forhold. Dette er bare slik at vi kan vise vår forespørselsmotor som spenner over minst ett forhold.

Opprett tabeller

Så, i en database kalt "tut", la oss lage et bord som heter gjør at og et bord kalt modeller. De gjør at bordet vil ha felt "id" og "navn" og modeller bordet vil ha felt "id", "make" og "name".

Legg til noen data

Nå kan vi bare legge til noen merker (som Ford, Chevy, etc.) som data i produsentbordet og noen modeller som disse produsentene er ansvarlige for.

Denne opplæringen antar at du har litt arbeidskunnskap om databaser og SQL, så jeg vil ikke gå inn i detaljer om forholdet / utenlandsk nøkkeloppsett.


Trinn 3. Databasetilkoblingen

Vanligvis liker jeg ikke å jobbe med råkonstanter i PHP. Jeg vil typisk definere en haug med ting og deretter gjøre noen funksjoner for å hekte inn i disse konstantene. For dette eksempelet, la oss bare holde ting enkle og bruke konstantene.

Definer tilkoblingsvariabler

I vår /conf/config.php fil, la oss konfigurere våre databasetilkoblingsvariabler. Mens vi er i det, la oss kaste en inkludere til vårt DAL.php script.

 

Dette oppsettet forutsetter at du kjører MySQL på standardporten.

Opprett tilkoblingsfunksjon

Nå inne /inc/class/DAL.php, Vi vil lage en funksjon som vi skal bruke for å koble til vår database.

Forbindelsen, så vel som alle kommende spørsmål, vil leve inne i en klasse som heter DAL. Ved å pakke inn all databasengasjement inne i en enkelt klasse kan vi manipulere våre spørsmål senere uten å måtte berøre forretnings- eller presentasjonslagsskript. Også, det gir en viss grad av mock namespacing.

I tilfelle av denne klassen vil vi legge til en konstruktør, selv om den ikke trenger å gjøre noe.

 Kunne ikke koble til MySQL-serveren "); mysql_select_db (DB_DB, $ conn) eller die ("
Kunne ikke velge den angitte databasen "); returner $ conn;?>

Legg merke til at omfanget av dbconnect Metoden er privat. Dette skyldes at vi ikke trenger å koble til databasen utenfor vår DAL. I stedet vil vi ha offentlige spørringsmetoder som vil ringe dbconnect fra inne i DAL. Litt forvirrende? Ingen bekymringer, les videre.


Trinn 4. Lag generiske søkeverktøy

For å abstrahere våre spørsmål slik at vi kan gjenbruke korte koden, trenger vi to ting. Først må vi ha en slags "generisk spørresultat" -klasse. For det andre trenger vi en generisk spørringsmetode i DAL.

Lag generisk spørresultatklasse

Hensikten med alt dette er å kunne konvertere SQL-spørringer til objekter og minimere bruken av de stygge mens ($ rad = mysql_fetch_array ($ resultat)) sløyfe. Objekter er langt enklere å jobbe med og tillater oss å bruke egenskaper i stedet for arraynøkler.

Kort sagt, vi ønsker å lage en klasse som vil skape eiendomsnavn på fly og lagre data knyttet til disse egenskapene.

Vi vil sette denne klassen inne i vår /inc/class/DAL.php manus. Siden det er en ny klasse, vil den være utenfor DAL-klassen.

 klasse DALQueryResult private $ _results = array (); offentlig funksjon __construct ()  offentlig funksjon __set ($ var, $ val) $ dette -> _ resultater [$ var] = $ val;  offentlig funksjon __get ($ var) hvis (isset ($ dette -> _ resultater [$ var])) return $ this -> _ results [$ var];  ellers return null; 

Lag generisk spørringsmetode

Nå inne i vår DAL klasse, må vi lage en generisk spørringsmetode som vil slå Å VELGE spørringer inn i DALQueryResult objekter.

I utgangspunktet ønsker vi å slå hvert returnert feltnavn til en eiendom av DALQueryResult gjenstand.

 privatfunksjonsspørsmål ($ sql) $ this-> dbconnect (); $ res = mysql_query ($ sql); hvis ($ res) hvis (strpos ($ sql, 'SELECT') === false) return true;  annet hvis (strpos ($ sql, 'SELECT') === false) return false;  ellers return null;  $ results = array (); mens ($ row = mysql_fetch_array ($ res)) $ result = new DALQueryResult (); foreach ($ rad som $ k => $ v) $ resultat -> $ k = $ v;  $ resultater [] = $ result;  returnere $ resultater; 

Her er en privat funksjon som aksepterer en SQL-spørring. Den kobles til databasen og kjører spørringen. Deretter sjekker det for å se om det er noen resultater. Hvis det ikke er noen resultater, returnerer det null på en Å VELGE spørring, falsk på andre søk. Hvis spørringen var vellykket og spørringen ikke var en Å VELGE spørring, det kommer tilbake sann. Hvis det var en Å VELGE, da konverterer resultatet resultatene til en rekke DALQueryResult-objekter. Dette etterligner resultatene som man normalt vil få fra en mysql_query.


Trinn 5. Skriv en bestemt spørring

Nå er vi klare til å faktisk skrive en SQL-spørring. DAL-spørringer bør være veldig spesifikke både i navn og formål. La oss lage en som finner alle modeller av en gitt merkevare.

Dette blir vår første offentlige metode.

 offentlig funksjon get_models_by_make_name ($ name) $ sql = "SELECT models.id som id, models.name som navn, gjør.navn som gjør FRA modeller INNER JOIN lager ON models.make = makes.id WHERE makes.name = '$ Navn'"; returner $ this-> spørringen ($ sql); 

Her skriver vi bare spørringen og returnerer resultatet i form av DALQueryResult-objekter. Våre generiske spørsmål Metoden tar seg av itterations og beslutningsprosesser.

Ferdig DAL

På dette punktet, vår DAL.php Skriptet er ferdig. Det skal se ut som følgende.

 _resultater [$ var] = $ val;  offentlig funksjon __get ($ var) hvis (isset ($ dette -> _ resultater [$ var])) return $ this -> _ results [$ var];  ellers return null;  klasse DAL offentlig funksjon __construct ()  offentlig funksjon get_models_by_make_name ($ navn) $ sql = "SELECT models.id som id, models.name som navn, gjør.navn som gjør FRA modeller INNER JOIN lager ON modeller .make = makes.id WHERE makes.name = '$ name' "; returner $ this-> spørringen ($ sql);  privat funksjon dbconnect () $ conn = mysql_connect (DB_HOST, DB_USER, DB_PASSWORD) eller dø ("
Kunne ikke koble til MySQL-serveren "); mysql_select_db (DB_DB, $ conn) eller die ("
Kunne ikke velge den angitte databasen "); return $ conn; privatfunksjonsspørsmålet $ this-> dbconnect (); $ res = mysql_query ($ sql); hvis ($ res) if (strpos sql, 'SELECT') === false) return true; annet hvis (strpos ($ sql, 'SELECT') === falskt) return false; else return null; $ results = array (); mens ($ rad = mysql_fetch_array ($ res)) $ result = ny DALQueryResult (); foreach ($ rad som $ k => $ v) $ resultat -> $ k = $ v; $ resultater [] = $ result; returnere $ resultater;?>

Trinn 6. Bruk DAL

La oss endelig gå over til vår /index.php skript og vise resultatene våre ved hjelp av DAL. Alt vi trenger å gjøre er å inkludere vår /conf/config.php fil, instantiate DAL, og gjør noe med dataene. Her er et eksempel.

 get_models_by_make_name ($ make); ekko "

Modeller av $ make

"; // Sjekk om det var noen resultater hvis ($ resultater) echo"
    "; // sykle gjennom resultater foreach ($ resultater som $ modell) echo"
  • $ modell-> lage $ modell-> navn (Database ID: $ model-> ID)
  • "; ekko "
"; else // Vis en melding om manglende data ekko"

Beklager, vi har ingen informasjon om denne produsenten.

";?>

Som du ser, har vi nå resultater som vi kan ringe feltnavnene som egenskaper for et PHP-objekt.


Trinn 7. Ta ting ett skritt videre

Ofte vil det være nyttig å konvertere generisk DALQueryResult inn i en mer spesifikk gjenstand. I dette tilfellet kan du skrive forretningsobjekter som godtar en DALQueryResult som en konstruktørparameter. Deretter bruker du bare det for å bygge det nye objektet.

Her er et eksempel

 _id = $ resultat-> id; $ dette -> _ make = $ result-> make; $ dette -> _ navn = $ resultat-> navn;  offentlig funksjon __get ($ var) switch ($ var) case 'id': return $ this -> _ id; gå i stykker; sak 'make': return $ this -> _ make; gå i stykker; sak 'navn': returner $ dette -> _ navn; gå i stykker; standard: return null; gå i stykker;  offentlig funksjon __toString () return $ this -> _ name; ?>

Deretter skriver du bare et spørsmål for å returnere en rekke av disse objektene i stedet for en rekke generiske DALQueryResult objekter.

Husk at du alltid nevner dine spørsmål veldig spesifikt.

 offentlig funksjon get_models_by_make_name_as_CarModel ($ navn) // Gjenbruk eksisterende forespørsel $ results = $ this-> get_models_by_make_name ($ sql); // se etter resultater hvis (! $ resultater) return $ results;  ellers // array for å holde CarModel-objekter $ object_results = array (); // syklus gjennom og konvertere til CarModel objekter foreach ($ resultater som $ resultat) object_results [] = new CarModel ($ result);  // Return array av CarModel objekter returnerer object_results; 

Å bygge bestemte objekter kan bli svært nyttig når beregninger er nødvendige for å trekke ut meningsfylte data fra felt.


Håper dere alle likte opplæringen! Lykke til.