$taeller_db_hits = mysql_fetch_array(mysql_query("select count(ip) as tael_ip from where ip = '$this->ip' and url = '$this->url' ")); $tael = $taeller_db_hits['tael_ip']; print("<br>Du har set denne side $tael gange"); }
function updateDB(){
mysql_query("insert into site_watcher (ip, tid, url) values('$this->ip' , '$this->tid' , '$this->url') "); print("databasen er blevet opdateret"); }
} //Class Sitewatcher lukkes
$a = new DB("root","site_watcher"); $a-> MySQL(); $b = new Sitewatcher(); $b-> updateDB(); $b-> show_hits();
?>
Som i kan se laver min constructor DB en $this->user og en $this->database. Det er $this->database som jeg gerne vil bruge i min updateDB sql sætning som ligger i klassen, sitewatcher, men hvordan henter jeg variblen ned? Kan det overhovedet lade sig gøre?
Med version 7 af TeamShare tager Lector næste skridt og bygger en platform for AI-agenter, der i højere grad kan følge medarbejderen gennem hele arbejdsprocessen.
Jeg er ikke sikker på at jeg forstår dig.. Men updateDB skal jo have db-klassen, det kan du enten gøre ved at give den som parameter.
$b->updateDB($a); // $a = new DB(..);
og så bruger du bare $a i updateDB().
Alternativ kan du give den med når du opretter Sitewatcher. $b = new Sitewatcher($a); så retter du i klassen, så din konstruktør ser således ud: class Sitewatcher { var $url; var $ip; var $tid; var $db;
Undsyld mester, men jeg er ikke lige hel sikker på at jeg forstår dig:) Kan du ikke skære det mere ud i pap? Har sat og jongleret med den her kode i lidt tid nu og jeg føler at koden spiller mig et pus?!
$taeller_db_hits = mysql_fetch_array(mysql_query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url' ")); $tael = $taeller_db_hits['tael_ip']; print("<br>Du har set denne side $tael gange");
$a = new DB("root","site_watcher"); $a-> MySQL(); print("Databasen som er i brug:<b> ". $a->database."</b><br>"); $b = new Sitewatcher(); $b-> updateDB($a->database); $b-> show_hits($a->database);
og hvis man er doven, så kan man jo: <? $a = new DB("root","site_watcher"); $a-> MySQL(); print("Databasen som er i brug:<b> ". $a->database."</b><br>"); $b = new Sitewatcher($a); $b-> updateDB(); $b-> show_hits();
Det kræver jo så, at din sitewatcher-klasse gemme $a som en klasse.variabel, det var det jeg forsøgte at gøre før :)
function MySQL() { $conn = mysql_connect("localhost","$this->user"); mysql_select_db("$this->database",$conn); }
function query($sql) { $res = mysql_query($sql) or die(..); return new DBResult($res); } }//Class DB lukkes
Nu er så alle dine mysql-pakket ind i DB klassen (og DBResult) og du kan i princippet skifte til en anden database, uden at skulle ændre andre steder en lige DB-klassen.
Din sitewatcher klasse skal jo så gøre brug af dette:
class ..
function show_hits($database) { $res = $database->query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url' "); $taeller_db_hits = $res->fetchRow(); $tael = $taeller_db_hits['tael_ip']; print("<br>Du har set denne side $tael gange");
Jeg har lavet en klasse som er resultatet af en query. Og så har jeg lavet en metode ekstra i DB som kan udføre et sql statement og returnere et resultat-objekt.
function show_hits($database) { $res = $database->query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url' "); $taeller_db_hits = $res->fetchRow(); $tael = $taeller_db_hits['tael_ip']; print("<br>Du har set denne side $tael gange");
function show_hits() { $res = $this->database->query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url' "); $taeller_db_hits = $res->fetchRow(); $tael = $taeller_db_hits['tael_ip']; print("<br>Du har set denne side $tael gange"); }
du skal bare kalde methoden med $obj->show_hits();
$res = $this->database->query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url' "); $taeller_db_hits = $res->fetchRow(); $tael = $taeller_db_hits['tael_ip']; print("<br>Du har set denne side $tael gange");
Altså jeg forstår godt den klasse du har lavet som hedder DBresult, men jeg forstår bare ikke hvordan du kalder de to funktioner!? Altså jeg regner med at det sker i:
function show_hits() {
$res = $this->database->query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url'"); $taeller_db_hits = $res->fetchRow(); $tael = $taeller_db_hits['tael_ip']; print("<br>Du har set denne side $tael gange");
}
Men du kalder den bare med $this->database->query (Kalder du så query i DBresult? Fatter ikke lige hel hvordan det hænger sammen.
Jeg lidt ked af, hvis jeg har forvirret dig mere end hjulpet :-|.
Lad os se på: $this->database->query(..);
$this->database er din $db-klasse (den blev tildelt i konstruktøren; "$this->database = $database;").. Så nu har vi fat i den. På denne klasse kalder du så methoden query(..) (Dvs vi arbjeder "i" DB-klassen).
Da query() returnerer et DBResult objektet, bliver $res tildelt dette objekt. $taeller_db_hits = $res->fetchRow(); henter så en række fra resultatet.(Dvs DBResult->fetchRow() kaldes).
prøv evt med denne linje istedet for den gamle: $res = $this->database->query("select count(ip) as tael_ip from tabel-navn where ip = '{$this->ip}' and url = '{$this->url}'");
Jamen jeg kan godt se det smarte. Det er bare måden man kalder de methods på. Det er dem jeg ikke lige kan se det smarte i:) Hvorfor skriver du fx $this->database->query(...); Altså jeg kan ikke se hvorfor $this->database skal med!!
Ja. Du har DB gemt i sitewatcher-objektet. Så får at få fat i det (inde fra site_watcher) så skal du skrive $this->database. Nu skal du så bare kalde hvad du har lyst til af metoder i DB.. Hvis du syntes det er lidt langt, kan du sagents gøre:
$d = $this->database; // kopiere din DB-objekt over i $d $d->query("SELECT ..");
det vil være det samme som (borset fra kopieringen) $this->database->query("SELECT ..");
Det kan jo så skyldes flere ting.. Lad os se på det :-)
function show_hits() { $res = $this->database->query("select count(ip) as tael_ip from site_watcher where ip = '{$this->ip}' and url = '{$this->url}'");
$taeller_db_hits = $res->fetchRow(); print "<pre>Taeller_db_hits indeholder:<br>"; print_r($taeller_db_hits); // Skriver indeholdet ud af $taeller_db_hits; print "</pre>"; $tael = $taeller_db_hits['tael_ip']; print("<br>Du har set denne side $tael gange"); }
Nu skriver den lidt ekstra output ud, hvad står der?
og den sidste linje tildeler $this->database med det argument du giver den. Derfor skriver du så i de andre metoder $this->database for at få fat i "databasen"
function show_hits() { $res = $this->database->query("select count(ip) as tael_ip from site_watcher where ip = '{$this->ip}' and url = '{$this->url}'");
$taeller_db_hits = $res->fetchRow(); $tael = $taeller_db_hits[0]; print("<br>Du har set denne side $tael gange"); }
Det du så før er indholdet af rækken fra databasen. Som du kan se er nøglen 0 og værdien 7.. Så jeg har bare erstattet $tael = $taeller_db_hits['tael_ip']; med $tael = $taeller_db_hits[0];
Puha min tankegang holder ikke lige til det her. Altså jeg forstår det godt men så igen så sys jeg det virker lidt pløret!!
Undskyld jeg spørger, men hvordan finder query() så ud af at den skal bruge $this->database som database? er det fordi at den har jeg sat i DB klassen via mothoden MySQL()?
Lad mig forsøge at lave et eksempel: Forstil dig at klasser en små sorte kasser.
Vi har en kasse database. Den ved nogle ting (fx. hvordan kommer den i kontakt med database) .. og du kan trykke på een knap der hedder query. Hvad der sker i klassen er du ligeglad med, du vil bare evt have noget output. query bruger måske nogle interne ting i kassen, og i princippet kan du lave query helt om uden at du skal rette andre steder..
Man for at trykke på query skal du have kassen, så de interne ting der er i kassen følger altid med når du bruger query. (Fx. der er svært at trykke tænd på en radio, hvis du ikke har en radio :) )
Nu har du en anden kasse, sitewatcher. Den kan ligeledes nogle ting.
Det er også en kasse.. hvordan den virker er vi egenlig også ligeglad med. Men hvis vi kigger nærmere på den, så ved vi, at denne kasse bruger en anden kasse..
Forstil dig, at du er til fest. Der sidder en dj (lad os være lidt firkantet og kalde ham en musik-kasse. :)) .. Når du vil høre en sang, så er du egenlig kun interesseret i at høre musikken.. Om han trykker tænd på sin radio og spiller musikken derfra, er ligemeget.. Men nu da han har en radio, så kan han. Så denne kasse består af bl.a en anden kasse, radioen.
Det er sådan set nøjagtigt det samme der sker i din kode.. Sitewatcher har en "database-kasse" som den kan bruge.
Ligemeget hvem der har en radio kan vedkommende bruge den.. Det svarer til: LIgemeget hvilken klasse der har en $database-objekt, så kan de bruge den.
Jeg aner ikke om det hjælper på forståelsen, men det var da muntert at prøve :)
da Sitewatcher ser sådan ud Sitewatcher($database) og $this->database = $database og visa versa så er
$a = DB("root","site_watcher")
Nu er database sådan $database = DB("root" , "site_watcher");
og da $this->database = $database så kan jeg godt skrive
$this->database->query(..) da jeg på den måde har inkluderet $DB() i Sitewatcher
Altså jeg har puttet databasen-kassen "DB" ind i Site-kassen "Sitewatcher" ved at sige Sitewatcher($a); og kan derfor kalde query(..) ved at bruge $this->database->query da $this->database bliver lavet i DB klassen?
Ved ikke lige om det første dur, da du sikker tolker det forkert:) Men det jeg vil frem til er at det kan finde hinanden fordi du har inkluderet $a i new Sitewatcher.
Så hvis man ikke skriver {} så vil php kun evaluerer $this, og så kommer der til at stå Object->url.. For at undgå det kan man enten bruge ..."insert into site_watcher (ip, tid, url) values('{$this->ip}' , ... elller: ..."insert into site_watcher (ip, tid, url) values('" . $this->ip . "' , ...
Forestil dig at du gerne vil skrive <-etnavn-> det kan du gøre med print "<-$navn->";
Her skal php bedømme hvad variablen hedder. Det kan jo i princippet hedde $navn, $navn-, $navn->.
Man har så sagt, at variabler er normalt kun karakter, så den første gælder (den stopper når den første ikke-karakter). Dette jo bare et problem, ved $this->url, så der hjælper {} php med at finde ud af hvad der er variable-navn og hvad der er tekst.
Det samme gælder også for f.x $str = "$_GET['id']"; vil ikke virke efter hensigten, med mindre man bruger {}.
$this->database er en datamembers (for at bruge dine ord, der er desværre mange navne for den slags) der er intet problem i at en datamember er et andet objekt.
Heh grunden til at jeg ikke skrev tilbage var jeg at skulle ned til min bedstemor og bedstefar og spise og det blev sent før jeg kom hjem igen.
Jeg har ledt lidt på nettet men jeg kan ikke finde ud af hvad en klasse hedder før man laver
new xx;
Og hvad hedder det når man så laver
new xx;
Laver man så bare en ny klasse? Er det så her det bliver Objekt Orienteret? for jeg går ud fra at hvis man bare laver en klasse fx
class Hello {
var $hej;
function Hej($hej) { $this->hej = $hej; print $this->hej; } }
Så er det ikke OO. Eller er det hel forkert? :) Jeg føler faktisk at jeg har lært noget her og at jeg kan huske det dagen efter!! Dennismp du skal mange tak!!
nu har du et objekt ($x) du kan arbejde med, som er en instans af klassen Hello.
Du kan sige at klassen er ligesom skabelonen og objekterne er det du arbejder (normalt) med.
OO er ligeså meget en tankegang/struktur end bestemte kommandoer i dit script. Hvis samler funktioner der arbejder i samme område (fx tilgang til en database) i en klasse og får nogle fordele heraf - så er det OO. Men OO er ikke firkantet defineret, så det er svært at sige præcist hvornår noget bliver OO.
Ja i princippet.. (Nogle vil måske argumentere for at det er OO, bare grimt. Andre vil sige at det ikke er OO)..
F.eks <?php class HerErMinHjemmeSide { function doStuff() { .. her laves så alt. ... 400 linjer senere print "</html>"; } } $obj = new HerErMinHjemmeside(); $obj->doStuff();
Een klasse er ikke nok til at din kode er OO. Men hvis du generelt bruger klasser og forstår at udnytte dem så er det OO.
OO er ideen at man knytter logisk sammenhørende funktionalitet sammen i klasser.
Abstrakt eksempel igen :-)
Forstil dig legoklodser.. Der har du jo nogle forskellige klodser du kan arbejde med. Du kan lave et hus - der har du en dør..
Men i princippet kan du også bruge ler til at lave huset. Du tager en klump og former den. Men det bliver temmelig svært at tage døren ud og genbruge den andre steder, da den hænger sammen med resten af huset (måske har dit andet lerhus ikke samme størrelse, den er måske 0.4 cm højere). Lego har jo de dersens dupper som gør at du kan skifte ud som du har lyst til, da de har samme størrelse og gør een ting.. (Ler er een stor masse, legoklodser er mange små, der hver har en funktion.)
OO er at dele et problem (fx at lave en hjemmeside) op i små klodser som du så kan bygge en løsning til problemet.
Hehe abstakte eksempler, men gode!! Jeg forstår det godt!! Altså jeg har set personer som fx bare laver en klasse og siger at det er OOP, men jeg kan ikke rigtig sige til dem at det er det altså ikke når jeg ikke en gang selv kan finde ud af at lave klasser osv. Men jeg er da på vej til at forstå det nu:) Så vil jeg sige at den stykke kode du har hjulpet mig med er lidt mere OOP end bare HerErMinHjemmeSide klasse=)
mange af de nye ting i PHP5 er lige netop OO-delen - så det er nok noget man ser mere og mere til (kunne man håbe). Du kan jo lige lege med det du har lært, så kan vi altid skrive en 50 indlæg om et andet emne :-)
dennismp, jeg kan se hvor uvidende jeg har været. Ikke alene fatter jeg ikke min uvidenhed i et så simpelt projekt, men jeg vil dog sige at OOP delen i php gav mig et spark i den rigtige retning. Jeg arbejder lige nu med C++, OOP, mutex og tråde, og har skiftet min Win platform ud med en permanent gentoo linux, jaaa jeg nørder meget rundt. Jeg har i dag meget, MEGET stor respekt for OOP delen. Min intense lege med OOP i C++ har dog fået mig til at snøfte lidt når jeg nu prøver mig frem med php. Mangler stadig meget, kan jeg se. Men jeg vil lige sige tak for din hjælp. Det har været sjovt at læse dette gamle indlæg igennem og se at man er blevet mere moden på flere områder.
Synes godt om
Ny brugerNybegynder
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.