Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 08:18 Der er 36 kommentarer og
1 løsning

lidt hjælp til en begynder i OOP

Nå men nu starter jeg lige et nyt spørgsmål her.
Tror ik helt jeg har forstået det med OOP helt alligevel :s
Alså hvad jeg ikke har forstået er hvad man skal bruge new til for det første ihvertfald.
Ud over det så har jeg været igang med et lille forsøg på at lave en lille gæstebog i OOP dog er jeg kørt fast nu og vil høre om i kan hjælpe mig på rette vej med en god forklaring der til og lige fortælle om jeg også er helt galt på den eller om jeg har fat i noget af det rigtige...
Nå men først kommer her lidt kode til jer:

Main.php
--------
<?php
require("config.php");//Forbindelsen til databasen
require("class.php");//min oop fil
?>
<form action='' method="post">
Dit navn:<br>
<input name="navn" type="text"><br>
Din besked:<br>
<textarea name="besked" rows=15 cols=50></textarea><br>
<input type="submit" name="gem" Value"gem">
</form>
<?php
if (isset($_REQUEST['gem'])) {
        mysql_query("INSERT INTO gbog (navn, besked) VALUES ('$navn','$besked')");
        }
?>
Se den virker jo egentlig fint nok sådan her, men hvis jeg skal have noget OOP ind i det så er det jeg ikke ved hvor og hvordan det skal gøres og da håber jeg i kan hjælpe mig med at forklare hvor og hvordan.

class.php
------------
<?php
class Gbog{
        var $navn, $besked;

        function skriv($navn,$besked){
                $this->navn=$navn;
                $this->besked=$besked;
        }

        Function vis_gb ($navn,$besked){
                return $this->navn;
                return $this-besked;
        }
Er jeg helt galt på den eller...?
Avatar billede avminarm Juniormester
15. oktober 2004 - 09:11 #1
disse to artikler kan nok hjælpe dig på vej:
http://www.udvikleren.dk/article.php?aid=147&techid=6
http://www.udvikleren.dk/article.php?aid=222&techid=6

Jeg vil dog mene at OOP til en gæstebog er overkill
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 09:16 #2
tja det har du nok ret i det er, men any way man skal vel starte i det småt med at lære det og så udbygge det.
Da jeg skulle lære at bruge php + mySQL byggede jeg en hel masse gæstebøger og nyheds scripts bare for at lære det så skulle da mene jeg har lidt tjek på det med at indsætte ting i en database og hente dem frem igen osv og derfor synes jeg at det nok ville være lettest for mig at lære OOP ved at kombinere det ind i en gæstebog til at starte med...
Avatar billede avminarm Juniormester
15. oktober 2004 - 09:32 #3
det er jeg tilgengæld helt enig i ;o)
Avatar billede Slettet bruger
15. oktober 2004 - 09:34 #4
Du kunne lave en mysql klasse (selvom der er lavet 34923987 i forvejen) som laver din insert, holder styr på forbindelser osv.
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 09:41 #5
æh el_barto... Sorry men jeg tror ik lige jeg er med...
Efter jeg har fået kradset det ned som i ser her inde så er jeg lige som blevet fuldstændig blank om hvordan jeg nu bruger det til noget og hvad jeg skal gøre og hvordan med alt andet så jeg foretrækker i starten at holde det hele så småt og let som overhovedet muligt.
Alså hvordan jeg nu får mine indtastede data ind i min gæstebog kunne jeg egentlig godt tænke mig at vide som næste skridt.
Da jeg ikke ved hvordan ville jeg jo skyde på noget i den her stil:
mysql_query("INSERT INTO gbog ($this->navn,$this->besked ) VALUES ('$this->navn','$this->besked')"); men det ser sgu alt for besværlig ud.
Så kan i give en god forklaring for jeg vil egentlig meget gerne lære det her da det ser ud som om det bliver meget brugbart ved større sider
Avatar billede drbean Nybegynder
15. oktober 2004 - 09:44 #6
Nogen gode standard klasser som du kan starte med at lave er fx en MySQL klasse. Denne klasse skal så indeholde din SQL forbindelse og Query osv. Denne klasse kan du også bruge senere hen.

Hvad ang. din gæste bog skal du have nogen funktioner til at sætte entrys ind i databasen og til at hente ud, og muligvis til at slette.

En god ide er at bruge id'er fra databasen til at hente ud fra, og ændre via.

Du har også en konstruktør, dette er en funktion i klasse som bliver kørt når du opretter objeketet. Konstruktøren skal hedde det samme som din klasse. Du kalder fx din klasse Gbog, så funktionen skal hedde:
function Gbog()
Tingende i denne klasse kunne fx være oprettelse af objektet fra MySQL klassen.
Du må endelig skrive hvis der er mere du vil have at vide. Jeg har også nogen eksempler på klasser.
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 09:45 #7
Vil dog dertil lige tilføje at jeg har læst de fleste af de artikler på nettet om OOP efterhånden tror jeg.
Har søgt på google osv og læst og læst, men da det geniale ved php er at man jo næsten kan skrive den samme ting på en million forskellige måder er der jo heller ik én som skriver det på samme måde derfor synes jeg at blive mere forviret af at læse og læse hele tiden.
Derfor vil jeg bare gerne hjælpes igang med det jeg har af kode som jeg egentlig forstår og så arbejd ud fra det så jeg kan "lære" det om jeg så må sige.
Avatar billede drbean Nybegynder
15. oktober 2004 - 09:49 #8
En SQL klasse behøver ikke være så besværlig. Her er et eksempel.

<?php
class CMySQL
{
    private $sUsername;
    private $sPassword;
    private $sServer;
    private $sDatabase;
    private $rQuery;
    private $sSQL;
    private $sLink;

    function CMySQL()
    {
        $this->sUsername = "USERNAME";
        $this->sPassword = "PASSWORD";
        $this->sServer = "SERVER";
        $this->sDatabase = "DATABASE";
        $this->rQuery = NULL;
        $this->sLink = mysql_connect($this->sServer,$this->sUsername,$this->sPassword);
        mysql_select_db($this->sDatabase,$this->sLink);
    }
   
    function Query($SQL)
    {
        $this->sSQL = $SQL;
        $this->rQuery = mysql_query($this->sSQL,$this->sLink);   
    }
   
    function Fetch()
    {
        $aRes = mysql_fetch_row($this->rQuery);
        return $aRes;
    }

    function FetchArray()
    {
        $aRes = mysql_fetch_array($this->rQuery);
        return $aRes;
    }
   
    function NumRows()
    {
        return mysql_num_rows($this->rQuery);
    }
   
    function Escape($sString)
    {
        return mysql_real_escape_string($sString);
    }
   
    function Extrack()
    {
        return extract($this->rQuery);
   
    }
   
    function GetString()
    {   
        return $this->rQuery ;
    }
   
    function FetchRows()
    {
        while($rows[] = mysql_fetch_assoc($this->rQuery))
        array_pop($rows);
        return $rows;       
    }
}
?>
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 09:50 #9
ser i jeg sidder her med hæftet "Start på php 5" og da er der også et lille afsnit om OOP og et "Stort projekt" til sidst hvor de benytter det. Dog bliver jeg også ret forviret af at læse dette.
Alså hvis jeg forstår dig (drbean) rigtig så skal jeg lave noget i stil med det her:

Class Test{
var $noge_variabler...;
function test(){
og her inde i min function som skal hedde det samme som min class skal jeg så have alle andre function som jeg så skal bruge eller hvad for til sidst så at afslutte det hele }
For det er ik lige frem sådan de gør her i hæftet.
De siger også at Class'en skal skrives stort og det gør de heller ik.
Tror det er en del fejl i den...
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 09:54 #10
øh ik for at være dum vel men...
Jeg sgu bange for jeg er helt tabt af det der nu -piv-
Hvorfor skal det være så svært...
eller bare mig som er dum?
Avatar billede drbean Nybegynder
15. oktober 2004 - 09:55 #11
En måde som du kan bruge ovenstående klasse på i din klasse er her:
<?php
require_once("CMySQL.php");
class Gbog{
        var $navn, $besked;

        function Gbog()
        {
            $oSQL = new CMySQL();
        }

        function skriv($navn,$besked){
                $SQl = "INSERT INTO gbog ('navn','besked' ) VALUES ('".$navn."','".$besked."')";
                $oSQL->Query($SQL);
        }

        function vis_gb (){
                $SQL = "SELECT bla bla bla";
                $oSQL->Query($SQL);
                return $oSQL->FetchArray();
        }
}
?>
Avatar billede drbean Nybegynder
15. oktober 2004 - 09:56 #12
Når du så skal indsætte noget i databasen kan du gøre følgende:

$oBog = new Gbog();
$oBog->skriv($navn, $besked);
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 09:58 #13
hvad er det helt præcis man bruger new til?
Avatar billede drbean Nybegynder
15. oktober 2004 - 09:59 #14
Man laver en instans af objektet. Ellers kan du ikke bruge din klasse. Forstil dig det som en variable med en masse funktioner i (her er det alle dine funktioner fra klassen). Som du kan se i eks. bruger jeg $oBog->skriv, skriv kommer fra din klasse
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 10:04 #15
selvom jeg er blevet meget mere forvirret lige pt end klogere :o/ så vil jeg lige sætte mig hen og læse det grundig igennem hvad du har skrevet og så prøve at arbejde med det selvom jeg er MEGA meget forvirret nu... Synes det er liiiidt for meget på en gang...
Havde håbet på at 2 - 5 linjer kunne gøre det til at starte med så jeg forstod grundprincippet og selv kunne udvide det når jeg forstod det, men alligevel så tak for det ind til nu... Skal nok vende tilbage...
Håber ik i bliver træt af mig, men ik alting jeg forstår så hurtig :s
sorry... Men vil heller ik give op :)
Avatar billede drbean Nybegynder
15. oktober 2004 - 10:08 #16
Hæng i... Der er en del at forstå i starten, men når du først finder ideen i det, går det hurtigt med at lære. Du spørger bare hvis der er noget
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 10:11 #17
Bare rolig jeg skal nok hænge i.
I starten fattede jeg heller ik en meter af det med at indsætte noget i en tabel og slette noget i en tabel osv, men nu kan jeg det sgu snart med lukkede øjne så håber da også jeg kan lære det her.
Ved ik om det er en trøst, men det her forstår jeg ihvertfald godt:
function CMySQL()
    {
        $this->sUsername = "USERNAME";
        $this->sPassword = "PASSWORD";
        $this->sServer = "SERVER";
        $this->sDatabase = "DATABASE";
        $this->rQuery = NULL;
        $this->sLink = mysql_connect($this->sServer,$this->sUsername,$this->sPassword);
        mysql_select_db($this->sDatabase,$this->sLink);
    }

Synes egentlig bare at det er alt for meget at skrive når man egentlig kan skrive det meget kortere ;)
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 10:26 #18
Ok nu tror jeg godt nok jeg er helt galt på den...
Kan i lige hjælpe mig på rette vej og helst med så lidt kode som muligt tak.
Alså jeg har stadig min class.php

<?php
class Gbog{
        var $navn, $besked;

        function skriv($navn,$besked){
                $this->navn=$navn;
                $this->besked=$besked;
        }

        Function vis_gb ($navn,$besked){
                $vis=mysql_query("SELECT * FROM gbog");
                while ($result = mysql_fetch_array($vis)){
                extract($result);
                $this->navn=$navn;
                $this->besked=$besked;
        }}

Da ved jeg så bare ik hvilken function jeg skal kalde for gbog ?
og så hvis vi springer functionen skriv over i første omgang og går videre ned til min vis_gb
Så har jeg sat den lille kode sammen der som sikkert er forkert ik?
og så har jeg lavet en vis.php som ser sådan her ud:

<?php
require("config.php");
require("class.php");

echo "
Fra: $this->navn<br>
besked: $this->besked<br>";
?>

Men som i nok kan regne ud er det helt hen i skoven og det virker jo bare slet ik. Hvor gør jeg hvad forkert?
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 10:32 #19
how vent lige lidt.
Tror det er gået et lille lys op for mig ;)
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 10:37 #20
detsvære så var det lys ikke så stort alligevel, men tror jeg nu mere er på den rigtige vej.
Tjek lige den her ud:

Class.php
----------
<?php
class Gbog {
        var $navn, $besked;

        Function vis_gb ($navn,$besked){
                $vis=mysql_query("SELECT * FROM gbog");
                while ($result = mysql_fetch_array($vis)){
                extract($result);
                $this->navn=$navn;
                $this->besked=$besked;
                return $this->navn;
                return $this->besked;
        }}}

vis.php
----------
<?php
require("config.php");
require("class.php");

$navn= new Gbog("navn");
$besked= new Gbog("besked");

echo "
Fra: ".$navn->vis_gb."<br>
besked: ".$besked->vis_gb."";
?>

Men øh... Den skriver bare ikke noget..
Men er jeg rigtig på den?
Avatar billede drbean Nybegynder
15. oktober 2004 - 10:43 #21
næsten...
$navn = new Gbog("navn") kan du desværre ikke gøre...

Først skal du have et objekt. Dette objekt indeholder så alle dine funktioner.
fx
$oBog = new Gbog();
Bagefter kan du kalde funkctionen vis_gb.
fx
$oBog->vis_gb($navn,$besked)
det er vigtig du har begge parametre med.

og lige en anden ting. Du kan kun retunere en ting. Enten en streng, variable eller fx et array. Så jeg vil nok anbefale et array.
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 10:47 #22
æh nu er jeg lidt forvirret (igen -suk-)
nå men som det ser ud kommer jeg da i nærheden af noget af det rigtige.
Kan du ik lige prøve at sætte det hele sammen så i mit script så jeg kan se helt præcis hvad du mener for jeg tror jeg er ved at have fat i troden her ;)
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 10:58 #23
jeg laver lige en sammenfatning af hvad jeg egentlig har forstået :)

Alså man starter med at lave en Class som man kan kalde hvad man vil.
Inde i den Class skal det være nogle variabler som man definer med var $en_variable;
Så laver man nogle functioner som man har brug for.
Sidst men ikke mindst slutter man så sin Class af igen.

Så går man ind på sin side hvor man skal bruge det og starter med at include eller require sin Class fil ind.
og så tror jeg næsten at det er der jeg er stået af.
Men har jeg forstået noget af det rigtig?
Avatar billede drbean Nybegynder
15. oktober 2004 - 10:59 #24
Det er ikke testet, men prøv at køre dette:

<?php
class Gbog {
        var $navn, $besked;

        Function vis_gb ($navn,$besked){
                $vis=mysql_query("SELECT * FROM gbog");
              $result = mysql_fetch_array($vis);
                return mysql_fetch_array($result);
               
        }}

vis.php
----------

<?php
require("config.php");
require("class.php");

$oBog = new Gbog();
$aArray = $oBog->vis_gb($navn,$besked );

var_dump($aArray);

?>
Avatar billede drbean Nybegynder
15. oktober 2004 - 11:00 #25
Det har du forstået rigtig
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 11:14 #26
endelig har jeg forstået noget rigtig.
hvis det ik er for meget... Kan man så ik få en hurtig forklaring på hvornår man bruger return?
og hvorfor bruger du $oBog og $aArray hvorfor ik bare $bog og $array?
og så har jeg lige slået var_dump op i manualen, men blev ik rigtig klogere på dens funtion...?
Men når jeg har forstået det sidste her tror jeg at jeg har fangen princippet og så vil jeg prøve at lave sådan at man også kan sætte noget ind og slette osv så har jeg sikkert resten af dagen til at gå he he...
Nå men den siger til mig:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:\apache\htdocs\class.php on line 8
NULL
Linie 8 er så return mysql_fetch_array($result);
Men den besked får man da som regel kun hvis array'et er tomt...?
Avatar billede drbean Nybegynder
15. oktober 2004 - 11:24 #27
$oBog bruger jeg for at kunne se at bog er et objket
det samme med $aArray, a står for array

var_dump udskriver bare alt i arrayet. Du kan køre en for løkke eller en for each.

return bruges når du vil returnere noget til selve koden du kalder den fra. Det kan være TRUE eller FALSE, eller et variable. TRUE/FALSE kan være hvis du vil se om en variable indeholder noget specielt, eller fx hvis en bruger skal logge ind. Ellers kan man lave nogen Get funktioner til at hente variabler tilbage. fx
function GetNavn()
{
  return $this->navn;
}
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 11:26 #28
åh ok.
Det tror jeg jeg fik fat i he he...
Men øh... Har du en ide om hvad der går galt siden den melder den fejl?
Avatar billede drbean Nybegynder
15. oktober 2004 - 11:46 #29
Prøv at skrive dette i din phpmyadmin SELECT * FROM gbog
hvad sker der
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 11:52 #30
mærkeligt.

Viser poster 0 - 0 (1 total, Forepørgsel tog 0.0062 sek)
SQL-forespørgsel:
SELECT *
FROM gbog LIMIT 0 , 30

Men jeg kan da se at det er noget i den.
står da id 1 besked: test navn Mega-Hawk
Sgu da underligt
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 11:58 #31
Ej sorry drbean, men nu hænger det her mig sgu langt ud af halsen efterhånden :s
Først forstår jeg det og så gør jeg ik og så forstår jeg lidt og så bliver jeg igen forvirret osv så tror bare jeg vil lægge det fra mig et par timer eller en dags tid og så vil jeg prøve igen.
Alså lære det vil jeg sgu, men du kender det vel os hvis det hele bare hænger en LAAAANGT ud af halsen...
Så hvis du vil have point så bare kom med et svar og så får du dem (og du fortjener dem virkelig os) og så starter jeg bare på en frisk når jeg er mere klar i hovedet...
Har virkelig stiret mig blind på det lige pt...
Avatar billede drbean Nybegynder
15. oktober 2004 - 12:56 #32
Det er ok... Point er jeg lige glad med. Du skriver bare når du få mod igen
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 12:59 #33
alså det skal i da have her inde.
I er ligeglade med point's og i har en herre stor tolmodighed.
Er stoppet med at stille spørgsmål på webcafe.dk for de er sgu blevet træt af at jeg ikke lærer så hurtig.
Når jeg får mod igen (sikkert i morgen) så tror jeg lige jeg vil prøve at starte lidt mere stille og roligt med det hele.
Alså så vil jeg lave en MEGET simpel Class og bare lave noget i stil med at den skriver mit navn eller sådan noget før jeg går over til database med det.
Men så lukker jeg da bare her, men regner stærkt med at vende tilbage i morgen for jeg NÆGTER at give op hi hi
Avatar billede Slettet bruger
15. oktober 2004 - 15:55 #34
Der er et par detaljer om din klasse (og din kodestil), som jeg vil kommentere:

1) Det hjælper på overskueligheden, hvis du laver en fornuftig opstilling af koden, så der f.eks. ikke lige pludselig står }}}. Det tager lidt længere tid at skrive, men den tid bliver hurtigt hentet hjem igen ved fejlsøgning.

2) Hvis din funktion i klassen skal hente alle rækkerne, så skal den ikke bruge return før den er færdig med at hente alle rækkerne og har samlet dem.

Jeg ville nok lave det i denne stil:

<?php
class Gbog {
  var $navn, $besked;

  var $query=false;

  function vis_gb(){

    // Dette kunne udelades, da du nok ikke ville kalde en gæstebog mange gange på en side.
    if($this->query!==false){
      mysql_free_result($this->query);
    }

    $vis=mysql_query("SELECT * FROM gbog");
    $this->query=$vis;
    if($vis===false){
      return false;
    } else {
      return true;
    }
  }

  function hentpunkt(){
    if($this->query===false){
      return false;
    } else {
      if($row=mysql_fetch_assoc($this->query)){
        return $row;
      } else {
        mysql_free_result($this->query);
        $this->query=false;
        return false;
      }
    }
  }
}


Klassen bruges på denne måde:

$minbog = new Gbog();
if ($minbog->vis_gb()){
  while ($row=$minbog->hentpunkt()){
    // udskriv rækken som sædvanligt
  }
} else {
  echo "Gæstebogen er ikke tilgængelig."
}
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 16:39 #35
:o( damn jeg er forvirret nu.
hvor === hvorfor ik bare == ?
kan slet ik se mig ud af mere hvornår $this->noget skal bruges / hvordan den skal bruges... er totalt forvirret nu...
Sorry gutter
Avatar billede Slettet bruger
15. oktober 2004 - 16:51 #36
$this->noget bruges når man inde en metode vil bruge en anden metode eller attribut i samme objekt. Det kan vist godt være, at man ikke altid behøver $this->noget men kan nøjes med noget() eller $noget, men da der er nogle situationer, hvor man skal bruge $this->noget og det også vil virke i de situationer, hvor det ikke er nødvendigt, så kan man lige så godt bruge det altid.

Det er dog ikke nødvendigt, når man bare benytter variable, der er interne i en metode - som f.eks. $vis - Den er bare en normal variabel i en funktion, som resten af verden ikke kender til.

Forresten: metode er bare det, man kalder funktioner i objekter, og attributter er variablerne i et objekt.
Avatar billede mega-hawk Nybegynder
15. oktober 2004 - 16:56 #37
ret frustrende at det kan være så svært at forstå.
Synes da jeg har lært en del php efterhånden.
Har da lært at hente data fra en tabel og sætte ind, slette osv...
Har lært alle de der forskellige if sætninger og case osv, men her synes jeg det er meget nyt ellers er det fordi jeg ikke kan se noget logik i det (endnu)
Jeg vil lige læse en del artikler (som jeg har læst før) men på den ene eller anden måde vil jeg sgu lære det.
Nå men som sagt vil jeg lige læse nu og så starter jeg ganske enkelt ud med at lave et eller andet smart hvor jeg kan skrive mit navn i et felt og så får jeg den skrevet ud på skærmen igen eller noget i den stil...
Kan vel ik være så svært...?
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