Avatar billede ralf_l Nybegynder
28. august 2013 - 11:55 Der er 26 kommentarer og
3 løsninger

OOP PHP og MySQLi

Jeg sidder, som i et tidligere nævnt spørgsmål, og vil optimere en gammel hjemmeside, hvor den tidligere webdesigner desværre tabte til en sygdom.

Jeg overvejer meget at bruge OOP i opbygningen.
Men jeg forstår ikke helt ideen med klasser og hvordan det helt fungere. De tutorials jeg har set, er nok okay, men jeg kan bare ikke se det for mig, i forhold til hvad jeg kan bruge det til.
Jeg har rør, leg og lær personlighed. Dvs. at jeg helst skal se hvordan tingene virker, og lege lidt med det for at forstå det.
Mange af de færdige scripts jeg har fundet, er der mange kommentar til, der siger at de ikke er lavet rigtigt i OOP.

Derfor, hvis nogen kan lave/har/ved hvor jeg kan se et eksempler på OOP php, og hvordan de fungere i forbindelse med en, fx brugerliste hvor man kan trykke sig ind på brugerens profil. (Det kan bare være bruger med brugernavn, email og rigtige navn), simpelt og til at forstå.
Samt hvordan OOP php fungere i når man poster ting til databasen. FX som en lille tagwall.

Håber nogen kan vise mig og forklare hvordan det virker.
Avatar billede repox Seniormester
28. august 2013 - 12:54 #1
OOP og brugerens interface er to vidt forskellige ting.

Du kan starte med at prøve at læse min artikel om OOP: http://err0r.dk/artikler/vis/hvad_er_oop

Når du så har læst den, så er det vigtigt at du forstår hvorfor indkapsling, nedarvning og polymorfi (dækkes i min artikel) er smart.

Indkapslingen er smart fordi du kan have flere funktioner (metoder, som de hedder i klasser) der faktisk hedder det samme som metoder i andre klasser.

Nedarvning gør det muligt for dig at genbruge kode i lag på tværs af klasserne.
Ved at kombinere den viden, kan man sammensætte nogle lag af objekter - f.eks. et database abstraktionslag som nedarves til en klasse som henter oplysninger om brugere i din database.

F.eks.:

    /**
    * 'User' er en klasse der har nedarvet en anden klasse som
    * forbinder til databasen.
    * Metoden find() i klassen User gør således det at den går
    * ind og tager brugeren med id nummer 23
    */
    $user = Users::find(23);
   
    // Det kontrolleres lige at vi faktisk har fået et resultat tilbage
    if( $user )
    {
        // Hvis vi har kan echo alle data ud om brugeren
        echo $user->name;       
        echo $user->email   
    }
    else
    {
        // Hvis brugeren nu ikke kunne findes, fortæller vi bare det
        echo "Brugeren eksisterer ikke".
    }


På den måde har du netop elimineret din database logik fra de sider du bruger oplysningerne på.

Men for at det kan virke som det skal, er det vigtigt at have polymorfien på plads. Eksempelvis skal du lige så hurtigt kunne oprette en klasse til en anden tabel - f.eks. beskeder:
$messages = Messages::where('user_id', 23)->get();

Og i løbet af ingen tid har du fået alle beskeder i din tabel 'messages' hvor user_id er 23.
Avatar billede ralf_l Nybegynder
05. september 2013 - 23:18 #2
Hej Repox.

Jeg må ærlig indrømme, at jeg har lidt svært ved at forstå de der Private, Public og Protected.

Jeg må arbejde lidt med det for rigtigt at forstå det.

Dertil vil jeg sige, at det er den bedst skrevet danske artikel, som jeg har læst omkring oop. Selvom jeg ikke forstår det hele, fik den mig til at forstå mere af hvad de andre artikler har prøvet at forklare.

At jeg så ikke lige kan twiste det i mit hoved, så jeg selv kan bygge noget ud af det, er en anden sag. Jeg vil se om der er nogle scripts jeg kan lege med, og se virkningerne af de ændringer jeg måtte lave, sådan lærer jeg bedst.

Men skide god artikel.
Avatar billede ralf_l Nybegynder
05. september 2013 - 23:18 #3
Du må gerne poste et svar.
06. september 2013 - 11:40 #4
ralf_I, vi har aftalt andetsteds, at jeg skulle komme ind her.  Men hvorvidt jeg kan tilføje noget meningsfuldt til hvad der allerede er sagt er så et spørgsmål.  Jeg har selv haft anledning til at arbejde med OOP i et antal programmeringssprog.  Jeg læste så repox's artikel.  Den var mig en god repetition, og faktisk fik jeg hold på et par ting der har ligget mig lidt tungt.  På grund af mit tidligere arbejde med OOP fandt jeg artiklen rimelig nem at gå til.  Jeg kan godt forestille mig, at den er en stor mundfuld for de der er nye til OOP.  Men sådan er det jo med alt nyt.  (Jeg så engang i Anders And Georg Georgløs' nevø sidde og læse i en bog der hed 'Atomspaltning for begyndere.'  Det findes naturligvis ikke.)

Men jeg kan huske, hvordan jeg i begyndelsen havde svært ved at holde klasser og objekter ude fra hinanden, og jeg kan huske det eksempel jeg 'braistormede' mig frem til:  Tag et bibliotek med 10.000 forskellige bøger.  Hvad har alle disse bøger i fællesskab?  Faktisk en hel del.  De har alle sammet et indhold, de har en forfatter, de har en titel, o.s.v.  Og man kan gøre noget med bøgerne, man kan udlåne dem (fordi det er et bibliotek), man kan returnere dem, o.s.v.  Så vi har her en klasse 'bog' med (mindst) tre egenskaber 'forfatter', 'titel', og 'indhold' og med (mindst) to metoder 'udlån' og 'retur'.  I 'pseudokode' ser det således ud:

class Bog
{
    $forfatter;
    $titel;
    $indhold;

    function udlån()
    {
        ...
    }

    function return()
    {
        ....
    }
}

Den enkelte bog, såsom Carit Etlar's Gøngehøvdingen, er så et objekt.  Hvis vi i virkelighedens verden skal 'konstruere' en ny bog, skal vi først finde en forfatter til at skrive bogen, og derefter skal bogen trykkes og indbindes.  Men i vores eksempel konstruerer vi nye bøger, objekter, nemt og smertefrit ved at insætte en konstruktør i klassen:

class Bog
{
    $forfatter;
    $titel;
    $indhold;

  function construct($forfatter, $titel, $indhold)
    {
        $this->forfatter = $forfatter;
        $this->titel = $titel;
        $this->indhold = $indhold;
    }

    function udlån()
    {
        ...
    }

    function return()
    {
        ....
    }
}

Så konstruerer du en ny bog, et objekt, ved en kode såsom denne:

$gøngebog = new Bog('Carit Etlar', 'Gøngehøvdingen', 'Det var en mørk og stormfuld nat...');

Hvis du er lige så 'grøn' i OOP som jeg var engang vil dette måske være til nytte.
Avatar billede arne_v Ekspert
08. september 2013 - 04:57 #5
Jeg har ikke noget problem med at lade:
* indkapsling
* arv
* polymorfi
definere OOP (der er andre definitioner, men de er ikke noedvendigvis bedre).

Men jeg synes ikke at afsnittene om de tre giver et fyldestgoerende billede af dem.
Avatar billede arne_v Ekspert
08. september 2013 - 05:01 #6
Pointen i indkapsling via brug af private metoder og felter er at det giver fleksibilitet til at aendre koden uden at paavirke anden kode. Saalaenge en klasse udstiller de samme offentlige metoder (med samme funktionalitet), saa kan man lave totalt om paa klassen uden at paavirke anden kode. Det goer det nemmere at vedligeholde kode, idet man kan aendre nogen ting uden at bekymre sig om hvorvidt det giver problemer et andety sted i applikationen.
Avatar billede arne_v Ekspert
08. september 2013 - 05:03 #7
Med hensyn til arv er bedste praksis idag er kun at bruge abstrakte basis klasser og interfaces - ikke konkrete basis klasser.
Avatar billede arne_v Ekspert
08. september 2013 - 05:10 #8
To klasser X og Y som har samme metode M, saaledes at man kan bruge samme kode paa objekter af begge klasser, er ikke polymorfisme men dynamisk typecheck.

Et interface eller an abstract bases klasse Z med en metode M, to klasser X og Y som implementerer eller arver fra Z, saaledes at man kan bruge samme kode paa objekter af begge klasser, er polymorfisme.
Avatar billede ralf_l Nybegynder
10. september 2013 - 21:06 #9
Hey Arne og Christian, sorry jeg først svare nu her.

@Arne_v. Tak for dine kommentar, jeg antager at de var rettet imod artiklen. For en newbee som mig var det lidt for faglige kommentar. Jeg regner dog med at forstår dem bedre efterhånden som jeg arbejder med oop. Dine kommentar er gemt i en lille mappe jeg har sammen med artiklen.

@Christian_belgien det er en super god måde at stille det op på. Jeg har de sidste dage leget lidt med det, og har samlet nogle spørgsmål, der har givet anlæg til nye tanker og flere spørgsmål. Det er derfor der først nu kommer et svar på dit indlæg. (Lang tekst og 5 spørgsmål følger):

Noget af det mine to hjerneceller slås mest med, er at se hvor meget der skal være i klasserne og hvordan funktionerne bygges bedst op.

Hvis vi tager udgangspunkt i at lave et forum ala phpBB.
i sådan et forum har man Kategorier der indholder underkategorier, der igen indholder emner, som så kommenteres.
Hvis jeg skulle lave det, vil jeg lave en klasse med følgende funktioner:

class Forum{
  function add_Cat(){
  ....
  }
  function add_SubCat(){
  ....
  }
  function add_Topic(){
  ....
  }
  function add_Comment(){
  ....
  }
  function delete_Cat(){
  ....
  }
  function delete_SubCat(){
  ....
  }
  function delete_Topic(){
  ....
  }
  function delete_Comment(){
  ....
  }
  function edit_Cat(){
  ....
  }
  function edit_SubCat(){
  ....
  }
  function edit_Topic(){
  ....
  }
  function edit_Comment(){
  ....
  }
}


1) Er det helt skidt, eller hvordan vil i gøre?

Jeg har også set nogen lave tre funktion med mange if sætninger:
function Forum_add($type, $vari1, $vari2, $vari3...)
  if($type == 'cat'){
    $title = $vari1;
    $dis = $vari2;
    $user = $vari3;
  }elseif($type == 'subcat'){
    $title = '$vari1';
    $dis = $vari2;
    $user = $vari3;
  }....osv
}
function Forum_delete($type, $vari1, $vari2, $vari3...)
  if($type == 'cat'){
    $title = $vari1;
    $dis = $vari2;
.... osv
}
Er det helt hen i vejret?

__________________________


2) Laver man flere konstruktør i en klasse alt fx til Cat og SubCat funktionerne?
Og henter man aller variabler fra konstruktøren ud i variabler i klassen udenfor funktionerne?

__________________________


3) Jeg ser også at nogen ligger forms i funktioner, fx:
  function forms($type,...,...,...){
      if($type == XXXX){
        <form>.....</form>
      }elseif($type == YYYY){
        <form>....</form>
      }elseif......
  }
Er det en god ide, eller er det dumt?

__________________________


4) Et andet eksempel er en clase der hedder bruger.
Hvis man nu laver en klasse der hedder bruger, og i den funktioner til at oprette, ændre og slette brugere. Vil man så også i denne klasse lave funktioner til at lave blandt andet bruger lister?

__________________________


5) Hvis en Mester nu har jobs på flere byggepladser. Disse pladser oprettes, ændres og slettes funktioner i en klasse kaldt "pladser".
Han har også en masse arbejdsredskaber og mandskab. Disse oprettes, slettes og ændres i funktioner klasserne "redskaber" og "mandskab".
Laver man så en "blandings" klasse til at lave funktioner til at tilføje redskaber og mandskab til pladserne samt til at lave lister af pladserne og de redskaber der er på pladsen?
Hvis det gav nogen mening :)

__________________________


Det kan godt være det er dumme spørgsmål, men jeg begynder at tænke alle mulige senarier, trods det jeg nok ikke lige fra start skal bruge disse funktioner.
Avatar billede arne_v Ekspert
11. september 2013 - 01:18 #10
re 1)

Forum klassen har en addCat metode og Cat klassen har en addSubCat metode o.s.v.
Avatar billede arne_v Ekspert
11. september 2013 - 01:20 #11
re 1)

Et saadant test paa type er tegn paa at den er helt gal med det objekt orienterede.

Formentligt skal det erstattes af noget polymorfisme.
Avatar billede arne_v Ekspert
11. september 2013 - 01:21 #12
re 4)

Bruger og brugerliste er to forskellige klasser.
Avatar billede arne_v Ekspert
11. september 2013 - 01:22 #13
re 5)

Klassen Mester skal vel indeholde:
- liste af Plads
- liste af Redskab
- liste af Ansat
Avatar billede arne_v Ekspert
11. september 2013 - 01:25 #14
Man kan godt lave flere konstruktoerer i samme klasse og i nogen sprog er det almindeligt brugt, men PHP har default vaerdier for argumenter saa behovet er markant mindre i PHP.
Avatar billede ralf_l Nybegynder
11. september 2013 - 11:38 #15
Super svar arne_v.

Hvad så med at lave forms i funktioner, er det dumt eller smart?
Avatar billede ralf_l Nybegynder
11. september 2013 - 11:43 #16
@Arne super gode svar.

Hvis man så skal udskrive det her forum på sin side.
Hvordan gør man så det.
Laver man så en printCat funktion i klassen Forum.
En printSubCat function i klassen Cat osv..
Eller laver man en klasse specielt til det?
Avatar billede arne_v Ekspert
11. september 2013 - 15:45 #17
Baade med hensyn til forms og udskriv, saa har du brug for at opdele din kode i.

Minimum maa vaere:

* en backend del som udelukkende indeholder PHP og ikke et eneste HTML tag med funktionalitet for at:
- hente en liste af data der skal vises
- opdatere/tilfoeje data

* en view del som mest indeholder HTML og enten en lille smule PHP kode til at indsaette data server side elle noget JavaScript til at indsaette data client side

* en controller del som udelukkende indeholder PHP og ikke et eneste HTML tag som modtager requests, kalder backend og slutter med at kalde view
Avatar billede ralf_l Nybegynder
11. september 2013 - 16:09 #18
Se nu bliver det spændende... Hvordan gør man så det?
Kan du komme med et simpelt eksempel på hvordan det gøres?
12. september 2013 - 14:43 #19
ralf_I, det her er baseret på princippet om hjælp til selvhjælp.  At lære OOP, ligesom alle andre områder af programmering (og alle andre komplicerede områder af hvilket som helst fag) kræver en betydelig egen indsats, hvad enten det nu er i form af formel undervisning eller omfattende selvstudier.  Det kan så hjælpe i studierne at kunne stille spørgsmål om specifikke problemer der driller.  Det kommer mig for, at du nu prøver at få det hele serveret ved at trække dette spørgsmål i langdrag.  Jeg foreslår, at du afslutter spørgsmålet (bed om svar fra hvor du blev hjulpet mest) og så gå igang med selv at følge svarene op.  Du kan så komme tilbage med enkelt spørgsmål til specifikke punkter, hvor du forklarer hvor langt du selv er kommet, hvad der driller, og hvad du selv har gjort for at løse det.

Som en udbredelse af #17 (arne_v, jeg håber jeg har forstået dig rigtigt):  Gå på google og søg efter 'Model View Controller'.  Der er adskillige tutorials der er gode at få forstand med.  Et eksempel:  Lad os sige, at du indsamler meteologiske data, temperatur, nedbør, solskinstimer, o.s.v. per dag.  Så vil du vise resultaterne på din hjemmeside.  Du kan så vælge at vise resultaterne i form af af kurve diagrammer, i form af søjlediagrammer, i tabeller, eller på en række af andre måder.  Så er en god måde at dele programmet op på, at du har en Model, 'en backend del ... for at hente en liste af data der skal vises...'  Andre dele af programmet er så flere forskellige 'Views', såsom 'kurvediagram_view', 'tabel_view', o.s.v., der formatterer og viser tallene.  Hvis hjemmeside brugeren vælger for kurvediagram, så sender Model dataerne til Kurvediagram_View, o.s.v.  Det kræver naturligvis en tredje program del, en Controller, 'som modtager requests, kalder backend og slutter med at kalde view'.  Hvis hjemmeside brugerens vælger at se solskinstimer i august som kurvediagram, og modtager controleren dette valg, og så kalder controlleren modellen for at få de pågældende data, og derefter kalder controlleren den rigtige view og passerer dataerne.
Avatar billede ralf_l Nybegynder
12. september 2013 - 16:04 #20
@Christian, det er jeg lidt ked af du skriver.

Det med at jeg vil have alt serveret er lige præcis ikke det jeg vil. Jeg vil bare have et eksempel, på noget simpelt, bare så man kan se strukturen og virkemåden, så kan jeg selv lege og eksperimenter med det så jeg til sidst kan begynde at lave de ting jeg faktisk skal lave.

Hvad ang selvstudier, så er jeg lige blevet færdig med en videregående uddannelse på 3,5 år, hvor 75% af studiet var selvstudie og gruppe arbejde. I den forbindelse har jeg læst en masse rigtige gode ting selv, men forståelsen for mit vedkommende, kom mange gange først da jeg så tingene virke, eller fik det diskuteret igennem med gruppen eller personer, som bedre forstod hvad de havde læst, og hvor jeg kunne stille de spørgsmål jeg måtte have. Efterhånden som tingene blev snakket igennem, kunne jeg trække paralleller til det jeg har læst, og derved forstået det bedre.

Tror mig, jeg har både googlet og youtube'et (eller hvad man skal kalde det), og fundet nogle ok tutorials og videoer. Desværre kan jeg ikke selv se hvorvidt de er gode, dårlige, eller ikke up-to-date, da mange af dem er gamle.

Derfor spørger jeg som jeg gør. Jeg har allerede lavet en masse klasser, funktioner og fået noget struktur i det jeg tidligere har arbejdet med.

Det med ikke at blander HTML og PHP i filerne, er nyt for mig og det har jeg svært ved at gennemskue hvordan fungere. Derfor spørger jeg til et eksempel.
Indtil videre har de fleste side jeg har set, i min søgen på php og oop, ikke behandlet OOP med MVC. Derfor er det meget nyt for mig, og jeg vil gerne forstå det. Derudover synes jeg der bliver beskrevet mange forskellige framework typer, og nogen steder har jeg læst en hel artikel, der påstår at være MVC, bare for at læse at det ikke er MVC i de kommentar der kommer efterfølgende.

Jeg forstår godt pointen i hvordan MVC bør virke, men derfra og til selv at kunne sætte mig ned og banke noget sammen, der er lidt langt for mig, da jeg som sagt ikke er god ud fra teorier, men derimod ud fra erfaringer og leg med det jeg arbejder med.
Jeg kan heller ikke bygge en motor til min bil, men jeg kan efterhånden skifte alle dele i den, fordi jeg har haft en motor jeg har kunne lege med.

Desværre har spørgsmålet været langt mere omfattende end først antaget, og derfor er der ikke så mange point at uddele, og det er måske forkert.

Jeg vil gerne undskylde hvis min indlæringsevner ikke passer ind i den måde Eksperten.dks bruger gerne vil hjælpe folk.
Jeg sætter stor pris på det i har lært mig indtil videre. Det er super dejligt at i trods alt gider at hjælpe os der er lidt grønne.

Christian, Arne og Repox, 1K tak for jeres hjælp, det er meget værdsat og i må ikke se det overstående som noget negativt rettet mod jer. Det er ikke sådan ment, bare et forsvar af hvorfor jeg skriver spørgsmålene som jeg gør. I må gerne poste svar.

Hvis pointene ikke matcher spørgsmålet. Så sig til, jeg er jo ny herinde, så må jeg jo uddele lidt flere point til hver af jer.
13. september 2013 - 08:18 #21
Hvis #20 (blandt andet) var en invitation til at oprette svar, så er her et fra mig.  (Du vil uden tvivl forvente svar også fra anden side.)
Avatar billede ralf_l Nybegynder
13. september 2013 - 15:48 #22
Det var en invitation til at sende et svar. Og igen, tak for hjælpen indtil videre.
Avatar billede arne_v Ekspert
14. september 2013 - 04:43 #23
Maaske kunne jeg bixe et eller andet i weekenden.
Avatar billede ralf_l Nybegynder
15. september 2013 - 00:59 #24
Hey Arne, det er super venligt af dig, men gør det kun hvis du har tid. Jeg har nemlig fundet lidt at lege med, jeg kan dog ikke spørger om hjælp ved personen der har lavet det, for jeg får fejl mails tilbage når jeg mailer ham/hende.

Om ikke andet må du gerne smide et svar. :)
Avatar billede arne_v Ekspert
16. september 2013 - 05:07 #25
blev ikke faerdig - konen ville i IKEA

men jeg haaber at blive faerdig snart

og et svar
Avatar billede repox Seniormester
16. september 2013 - 21:49 #26
Den tråd her gik i glemmebogen :-\

Arne, jeg kigger lige nærmere på dine kommentarer til min artikel - det er altid godt med feedback :-)
Avatar billede ralf_l Nybegynder
16. september 2013 - 23:16 #27
Tak for hjælpen alle 3. I gør det rigtigt godt, forsæt endelig med det.
Avatar billede arne_v Ekspert
25. september 2013 - 04:41 #28
Foesrt vil jeg lige bemaerke at jeg hverken programmerer i PHP, HTML eller JavaScript, saa ..............


Server side
-----------

domainmodel.php:


<?php
class T1 {
    private $f1;
    private $f2;
    public function __construct($f1, $f2) {
        $this->f1 = $f1;
        $this->f2 = $f2;
    }
    public function getF1() {
        return $this->f1;
    }
    public function getF2() {
        return $this->f2;
    }
    public function setF2($f2) {
        $this->f2 = $f2;
    }
}

?>


dataaccesslayer.php:


<?php
require_once 'domainmodel.php';

class DataAccessLayer {
    private function getConnection() {
        $con = new mysqli('localhost', 'root', '', 'Test');
        if(mysqli_connect_errno()) throw new Exception(mysqli_connect_error());
        return $con;
    }
    private function getStatement($con, $sql) {
        if($stmt = $con->prepare($sql)) {
            return $stmt;
        } else {
            throw new Exception($con->error);
        }
    }
    public function getOne($f1) {
        $con = $this->getConnection();
        $stmt = $this->getStatement($con, 'SELECT f1,f2 FROM t1 WHERE f1 = ?');
        $stmt->bind_param('i', $f1);
        $stmt->execute();
        $rs = $stmt->get_result();
        if($row = $rs->fetch_array()) {
            $t1 = new T1($row['f1'], $row['f2']);
        } else {
            return null;
        }
        $stmt->close();
        $con->close();
        return $t1;
    }
    public function getAll() {
        $res = array();
        $con = $this->getConnection();
        $stmt = $this->getStatement($con, 'SELECT f1,f2 FROM t1');
        $stmt->execute();
        $stmt->bind_result($f1, $f2);
        while($stmt->fetch()) {
            $res[] = new T1($f1, $f2);
        }
        $stmt->close();
        $con->close();
        return $res;
    }
    public function save($t1) {
        $con = $this->getConnection();
        $stmt = $this->getStatement($con, 'INSERT INTO t1 VALUES(?, ?)');
        $stmt->bind_param('is', $t1->getF1(), $t1->getF2());
        if(!$stmt->execute()) {
            throw new Exception($stmt->error);
        }
        $stmt->close();
        $con->close();
    }
}

?>


model.php:


<?php
require_once 'dataaccesslayer.php';

class Model {
    private $dal;
    public function __construct() {
        $this->dal = new DataAccessLayer();
    }
    public function getOne($f1) {
        return $this->dal->getOne($f1);
    }
    public function getAll() {
        return $this->dal->getAll();
    }
    public function save($t1) {
        return $this->dal->save($t1);
    }
}

?>


view.php:


<html>
<head>
<title>Data</title>
</head>
<body>
<h1>Data</h1>
<table border="1">
<tr>
<th>F1</th>
<th>F2</th>
</tr>
<?php foreach($data as $item) {?>
<tr>
<td><?php echo $item->getF1()?></td>
<td><?php echo $item->getF2()?></td>
</tr>
<?php }?>
</table>
</body>
</html>


controller.php:


<?php
require_once 'model.php';

$model = new Model();
$data = $model->getAll();

require_once 'view.php';

?>


client side
-----------

domainmodel.php:


<?php
class T1 {
    private $f1;
    private $f2;
    public function __construct($f1, $f2) {
        $this->f1 = $f1;
        $this->f2 = $f2;
    }
    public function getF1() {
        return $this->f1;
    }
    public function getF2() {
        return $this->f2;
    }
    public function setF2($f2) {
        $this->f2 = $f2;
    }
}

?>


dataaccesslayer.php:


<?php
require_once 'domainmodel.php';

class DataAccessLayer {
    private function getConnection() {
        $con = new mysqli('localhost', 'root', '', 'Test');
        if(mysqli_connect_errno()) throw new Exception(mysqli_connect_error());
        return $con;
    }
    private function getStatement($con, $sql) {
        if($stmt = $con->prepare($sql)) {
            return $stmt;
        } else {
            throw new Exception($con->error);
        }
    }
    public function getOne($f1) {
        $con = $this->getConnection();
        $stmt = $this->getStatement($con, 'SELECT f1,f2 FROM t1 WHERE f1 = ?');
        $stmt->bind_param('i', $f1);
        $stmt->execute();
        $rs = $stmt->get_result();
        if($row = $rs->fetch_array()) {
            $t1 = new T1($row['f1'], $row['f2']);
        } else {
            return null;
        }
        $stmt->close();
        $con->close();
        return $t1;
    }
    public function getAll() {
        $res = array();
        $con = $this->getConnection();
        $stmt = $this->getStatement($con, 'SELECT f1,f2 FROM t1');
        $stmt->execute();
        $stmt->bind_result($f1, $f2);
        while($stmt->fetch()) {
            $res[] = new T1($f1, $f2);
        }
        $stmt->close();
        $con->close();
        return $res;
    }
    public function save($t1) {
        $con = $this->getConnection();
        $stmt = $this->getStatement($con, 'INSERT INTO t1 VALUES(?, ?)');
        $stmt->bind_param('is', $t1->getF1(), $t1->getF2());
        if(!$stmt->execute()) {
            throw new Exception($stmt->error);
        }
        $stmt->close();
        $con->close();
    }
}

?>


service.php:


<?php
require_once 'dataaccesslayer.php';

$dal = new DataAccessLayer();

$method = $_SERVER['REQUEST_METHOD'];
$path = isset($_SERVER['PATH_INFO']) ? explode('/', $_SERVER['PATH_INFO']) : array();

if($method==="GET" && sizeof($path) > 1) {
    echo json_encode($dal->getOne($path[1]));
} else if($method==="GET") {
    echo json_encode($dal->getAll());
} else if($method==="POST") {
    // TODO
}

?>



page.html:


<html>
<head>
<title>Data</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">
</script>
<script>
$.getJSON('service.php', function(data) {
var tbl = "<tr><th>F1</th><th>F2</th></tr>";
for(var i = 0; i < data.length; i++) {
    tbl = tbl + "<tr><td>" + data[i].f1 + "</td><td>" + data[i].f2 + "</td></tr>";
}
$("#data").html(tbl);
});
</script>
</head>
<body>
<h1>Data</h1>
<table border="1" id="data">
<tr>
<th>F1</th>
<th>F2</th>
</tr>
</table>
</body>
</html>
Avatar billede ralf_l Nybegynder
07. oktober 2013 - 16:33 #29
Lækkert Arne... Rigtigt mange gange tak, det var virkelig fedt du gad, og det er bestemt ikke spildt arbejde.

Det er en rigtig god hjælp, og jeg er ked af, at jeg ikke har set det tidligere. Men har været på ferie og været optaget af andet efter jeg kom hjem.

Det er udskrevet og gemt i min lille hjemmelavet manual :)
Så må vi se hvad jeg få opbygget :o)
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