Avatar billede rthuls Nybegynder
26. marts 2004 - 09:02 Der er 13 kommentarer og
3 løsninger

Hjælp til MySQL Class

Jeg har fundet nedenstående class som eftersigende skulle gøre database arbejdet meget nemmere. Problemet er bare at jeg aldrig har arbejdet med classes før, så jeg aner ikke hvordan jeg skal bruge den.

Kan I komme med et eksempel på hvordan man bruger hver af de forskellige funktioner?

<?php
class MySQL {
    var $Host = '';
    var $User = '';
    var $Pass = '';
    var $DB = '';
    var $link_id;
    var $Result;
    var $Record = array();
    var $Rows;
   
    function Config($Host, $User, $Pass, $DB) {
        $this->Host = $Host;
        $this->User = $User;
        $this->Pass = $Pass;
        $this->DB = $DB;
        return true;
    }
   
    function Connect(){
        $this->link_id = mysql_connect($this->Host, $this->User, $this->Pass) or $this->Error(mysql_error());
        return $this->link_id;
    }
   
    function SelectDB(){
        mysql_select_db($this->DB) or $this->Error(mysql_error());
        return true;
    }
   
    function Query($sql) {
        $this->Result = mysql_query($sql) or $this->Error(mysql_error());
        return $this->Result;
    }
   
    function FetchArray(){
        $this->Record = mysql_fetch_array($this->Result);
        $this->Clean;
        return $this->Record;
    }
   
    function Clean(){
        foreach($this->Record as $Key => $Val){
            $this->Record[$Key] = stripslashes($Val);
        }
        return $this->Record;
    }

   
    function TotalRows(){
        $this->Rows = mysql_num_rows($this->Result);
        return $this->Rows;
    }
   
    function Close(){
        mysql_close($this->link_id);
        return true;
    }
   
    function Error($Text) {
        echo '<div align="left">';
        echo '<h2>MySQL Error</h2>';
        echo '<hr width="40%">';
        echo $Text;
        echo '</div>';
        exit;
    }
   
    function MySQL() {
        $this->Connect();
        $this->SelectDB();
    }
}

$DB = new MySQL();

?>
Avatar billede muddi Praktikant
26. marts 2004 - 09:23 #1
Det her fungerede for mig, men jeg ville umiddelbart tro, at du skal bruge
$DB->Config() metoden til at angive $Host, $User, $Pass og $DB ... det kan jeg bare ikke få til at virke, da connect()-metoden bliver kaldt fra constructoren (MySQL-metoden). Constructoren er en "funktion" der bliver kørt som den første, så snart du opretter et nyt MySQL-objekt af klassen MySQL - altså så snart du bruger koden.
$DB = new MySQL();
Jeg kigger lidt mere på det, og kommer måske med et andet svar ;)

<?php
class MySQL {
    var $Host = 'localhost';
    var $User = 'brugernavn';
    var $Pass = 'adgangskode';
    var $DB = 'databasenavn';
    var $link_id;
    var $Result;
    var $Record = array();
    var $Rows;
   
    function Config($Host, $User, $Pass, $DB) {
        $this->Host = $Host;
        $this->User = $User;
        $this->Pass = $Pass;
        $this->DB = $DB;
        return true;
    }
   
    function Connect(){
        $this->link_id = mysql_connect($this->Host, $this->User, $this->Pass) or $this->Error(mysql_error());
        return $this->link_id;
    }
   
    function SelectDB(){
        mysql_select_db($this->DB) or $this->Error(mysql_error());
        return true;
    }
   
    function Query($sql) {
        $this->Result = mysql_query($sql) or $this->Error(mysql_error());
        return $this->Result;
    }
   
    function FetchArray(){
        $this->Record = mysql_fetch_array($this->Result);
        $this->Clean;
        return $this->Record;
    }
   
    function Clean(){
        foreach($this->Record as $Key => $Val){
            $this->Record[$Key] = stripslashes($Val);
        }
        return $this->Record;
    }

   
    function TotalRows(){
        $this->Rows = mysql_num_rows($this->Result);
        return $this->Rows;
    }
   
    function Close(){
        mysql_close($this->link_id);
        return true;
    }
   
    function Error($Text) {
        echo '<div align="left">';
        echo '<h2>MySQL Error</h2>';
        echo '<hr width="40%">';
        echo $Text;
        echo '</div>';
        exit;
    }
   
    function MySQL() {
        $this->Connect();
        $this->SelectDB();
    }
}

$DB = new MySQL();
$DB->Connect();
$DB->Query("SELECT page_title FROM tbl_pages");
$DB->Clean();
while($n = $DB->FetchArray())
{
    print $n['page_title'];
}
$DB->Close();
?>
Avatar billede muddi Praktikant
26. marts 2004 - 09:28 #2
Her kommer mit andet forslag. Nu har jeg fjernet metoden Config() og i stedet flyttet dens indhold ned i constructoren "MySQL".


<?php
class MySQL {
    var $Host = '';
    var $User = '';
    var $Pass = '';
    var $DB = '';
    var $link_id;
    var $Result;
    var $Record = array();
    var $Rows;
   
    function Connect(){
        $this->link_id = mysql_connect($this->Host, $this->User, $this->Pass) or $this->Error(mysql_error());
        return $this->link_id;
    }
   
    function SelectDB(){
        mysql_select_db($this->DB) or $this->Error(mysql_error());
        return true;
    }
   
    function Query($sql) {
        $this->Result = mysql_query($sql) or $this->Error(mysql_error());
        return $this->Result;
    }
   
    function FetchArray(){
        $this->Record = mysql_fetch_array($this->Result);
        $this->Clean;
        return $this->Record;
    }
   
    function Clean(){
        foreach($this->Record as $Key => $Val){
            $this->Record[$Key] = stripslashes($Val);
        }
        return $this->Record;
    }

   
    function TotalRows(){
        $this->Rows = mysql_num_rows($this->Result);
        return $this->Rows;
    }
   
    function Close(){
        mysql_close($this->link_id);
        return true;
    }
   
    function Error($Text) {
        echo '<div align="left">';
        echo '<h2>MySQL Error</h2>';
        echo '<hr width="40%">';
        echo $Text;
        echo '</div>';
        exit;
    }
   
    function MySQL($Host, $User, $Pass, $DB) {
        $this->Host = $Host;
        $this->User = $User;
        $this->Pass = $Pass;
        $this->DB = $DB;

        $this->Connect();
        $this->SelectDB();
    }
}

$DB = new MySQL("localhost", "brugernavn", "adgangskode", "database");
$DB->Connect();
$DB->Query("SELECT page_title FROM tbl_pages");
$DB->Clean();
while($n = $DB->FetchArray())
{
    print $n['page_title'];
}
$DB->Close();
?>
Avatar billede muddi Praktikant
26. marts 2004 - 09:31 #3
Her er lige lidt ordforklaring:

- I en klasse hedder en funktion en metode.
- Hvis der findes en metode med samme navn som klassen (her MySQL), så kaldes denne funktion en constructor
- Constructoren køres med det samme når et objekt oprettes
- Constructoren er derfor et godt sted at tildele værdier til variable
- Ordet this refererer til klassen selv
- Variable i en klasse kaldes properties
- Properties bliver som regel initialiseret øverst i klassen
Avatar billede muddi Praktikant
26. marts 2004 - 09:35 #4
Når jeg kommer tilbage fra jobsamtale skal jeg nok lige skrive nogen kommentarer til hver eneste metode i klassen, så du kan få et overblik over hvilke metoder der gør hvad ;)
Ønsk mig held og lykke med jobbet *G*
Avatar billede rthuls Nybegynder
26. marts 2004 - 10:18 #5
Hej muddi
Held og lykke med jobsamtalen!!

Jeg kan ikke teste det før jeg får fri fra arbejde, men du skal endelig bare blive ved med at uddybe :o) Jeg vil meget gerne lære mere om classes
Avatar billede tefcke Nybegynder
26. marts 2004 - 13:51 #6
muddi > i din constructor kalder du Connect() metoden, så du behøver ikke gøre det udefra som du gjorde her:

$DB = new MySQL("localhost", "brugernavn", "adgangskode", "database");
$DB->Connect();
$DB->Query("SELECT page_title FROM tbl_pages");
$DB->Clean();
while($n = $DB->FetchArray())
{
    print $n['page_title'];
}
$DB->Close();

Du ser ud til at vide lidt om klasser, så det er sikkert bare en tanketorsk ;)
Avatar billede muddi Praktikant
26. marts 2004 - 14:37 #7
tefke >> Jo, det var bare en tanketorsk. Man behøver heller ikke at kalde Clean-metoden. Da den bliver kaldt fra Query-metoden :) Havde lidt travlt tidligere!

Jeg poster lige et svar igen ;) Denne gang med en masse kommentarer til hver metode.
Håber det kan give dig en ide om hvad der sker :)

btw, så er jeg næsten sikker på at få mit drømmejob! Får svaret på mandag *S*


<?php
class MySQL {
    // Her initialiseres alle objekt egenskaberne (object properties)
    var $Host = ''; // servernavn
    var $User = ''; // MySQL-brugernavn
    var $Pass = ''; // MySQL-password
    var $DB = '';  // database
    var $link_id;  // ID for forbindelsen fra mysql_connect()
    var $Result;    // Resultatet der modtages fra din forespørges med
    var $Record = array();    // Array med indholdet fra $Result
    var $Rows;      // Det antal resultater der var
   
/* Connect-metoden opretter forbindelse og gemmer forbindelses-id'et i
* egenskaben $link_id som så returneres til den kaldende metode.
*/
    function Connect(){
        $this->link_id = mysql_connect($this->Host, $this->User, $this->Pass) or $this->Error(mysql_error());
        return $this->link_id;
    }

/* SelectDB-metoden vælger den database du vil arbejde med.
* Man kunne også bruge mysql_query("USE databasenavn")
* men php's indbyggede funktion anbefales mysql_select_db() anbefales.
*/   
    function SelectDB(){
        mysql_select_db($this->DB) or $this->Error(mysql_error());
        return true;
    }

/* Query-metoden bruges til at sende dine forespørgsler til databasen.
* Metoden returnerer en "resource". Hvis noget går galt sættes Error-egenskaben
* til at indeholde fejlmeddelelsen fra MySQL.
*/   
    function Query($sql) {
        $this->Result = mysql_query($sql) or $this->Error(mysql_error());
        return $this->Result;
    }

/* FetchArray-metoden bruges til at trække information ud af den "resource" vi får
* fra Query-metoden. Inden du modtager arrayet med resultater bliver slashes fjernet
* med metoden Clean.
*/   
    function FetchArray(){
        $this->Record = mysql_fetch_array($this->Result);
        $this->Clean;
        return $this->Record;
    }

/* Denne metode kræver ikke meget forklaring. Den fjerner slashes fra outputtet.
* Slashes er tilføjet med php-funktionen addslashes(), da dataene blev gemt i databasen.
* De skal selvfølgelig ikke vises for brugeren ;)
*/   
    function Clean(){
        foreach($this->Record as $Key => $Val){
            $this->Record[$Key] = stripslashes($Val);
        }
        return $this->Record;
    }

/* Denne metode indkapsler faktisk bare php-funktionen mysql_num_rows()
* og angiver antallet af resultater vi har modtaget. Den kan være nødvendig
* hvis du f.eks. vil lave et gennemløb af data med for-løkken.
*/   
    function TotalRows(){
        $this->Rows = mysql_num_rows($this->Result);
        return $this->Rows;
    }

/* Metoden Close lukker den forbindelse vi oprettede med Connect-metoden.
* Derfor skal du først kalde denne funktion når du er færdig med at bruge objektet.
* I PHP 5 vil det være hensigtsmæssigt at flytte denne opgave til destructor-metoden!
*/   
    function Close(){
        mysql_close($this->link_id);
        return true;
    }

/* Error-metoden udskriver fejlmeddelelser fra MySQL. Det er en metode,
* og burde i PHP 5 være private!
*/   
    function Error($Text) {
        echo '<div align="left">';
        echo '<h2>MySQL Error</h2>';
        echo '<hr width="40%">';
        echo $Text;
        echo '</div>';
        exit;
    }

/* Denne metode er constructoren da den har samme navn som klassen.
* Constructoren kaldes med det samme objektet instantieres.
* Læg mærke til at der er ændringer angående constructors i PHP, men at
* denne måde at bruge den på stadig vil være gyldig!
* Hvis constructoren forventer at modtage nogle egenskaber, så skal
* disse egenskaber angives ved oprettelsen af objektet!
* F.eks. $DB = new MySQL("localhost", ...)
*/   
    function MySQL($Host, $User, $Pass, $DB) {

        $this->Host = $Host;
        $this->User = $User;
        $this->Pass = $Pass;
        $this->DB = $DB;

        $this->Connect();
        $this->SelectDB();
    }
}

$DB = new MySQL("localhost", "brugernavn", "adgangskode", "database");
$DB->Query("SELECT page_title FROM tbl_pages");
while($n = $DB->FetchArray())
{
    print $n['page_title']."<br />\n";
}
// Nedenstående vil kunnne flyttes til destructoren i PHP 5,
// og er egentlig heller ikke nødvendig i PHP 4,
// da forbindelsen lukkes automatisk når scriptet er afviklet!
$DB->Close();
?>
Avatar billede muddi Praktikant
26. marts 2004 - 15:14 #8
Denne linie i kommentarerne til Constructoren
* Læg mærke til at der er ændringer angående constructors i PHP, men at
Skulle have været
* Læg mærke til at der er ændringer angående constructors i PHP 5, men at
Avatar billede tefcke Nybegynder
26. marts 2004 - 16:14 #9
Hmmm, i funktionene FetchArray() ser du ud som om metoden clean() kaldes, men den bliver kaldt forkert. php tror det er en klasse variabel:
$this->Clean;
skal ændres til.
$this->Clean();
Avatar billede rthuls Nybegynder
26. marts 2004 - 16:50 #10
Det er rigtigt at noget galt med metoden clean(), men hvis jeg ændre:
$this->Clean;
til
$this->Clean();
får jeg denne fejlmeddelse:
Warning: Invalid argument supplied for foreach() on line 54

Hvor linie 54 er:
foreach($this->Record as $Key => $Val){
i metoden metoden clean()
Avatar billede muddi Praktikant
26. marts 2004 - 17:31 #11
den fejl får jeg også... jeg kan ikke lige lure hvorfor den kommer. Tefcke har du et bud?
Avatar billede tefcke Nybegynder
26. marts 2004 - 22:03 #12
Ja jeg har :)

Når du har udtrukket det sidste resultat sæt fra en query, så hopper while løkken op og laver endnu et tjek for at se om der er mere i resultat sættet. Der kaldes metoden FetchArray(), og i den metode sker følgende:
$this->Record = mysql_fetch_array($this->Result);

Det fejler, da der ikke er mere data i resultat sættet. Derefter bliver clean() metoden kaldt på $this->Record som ikke indenholder en record, og så er det i clean() metoden det går galt, fordi foreach forventer et array.

Løsningen er at ændre clean() metoden til:
    function Clean(){
        if ( is_array($this->Record) ) {
            foreach($this->Record as $Key => $Val){
                $this->Record[$Key] = stripslashes($Val);
            }
        }
        return $this->Record;
    }

Så der lige tjekkes om $this->Record rent faktisk er et array!
Avatar billede rthuls Nybegynder
27. marts 2004 - 11:48 #13
Helt perfekt!
tefcke hvis du også ligger et svar, så deler jeg nogle point ud.
Avatar billede tefcke Nybegynder
27. marts 2004 - 12:07 #14
Nej, det gør ikke noget, muddi har lavet et godt stykke arbejde, han fortjerne rub og stub ;)
Avatar billede rthuls Nybegynder
27. marts 2004 - 12:14 #15
Ok...
I skal i hvert fald begge have mange tak for hjælpen!
Avatar billede muddi Praktikant
27. marts 2004 - 19:23 #16
Dejligt at kunne hjælpe. Hvis du er interesseret i objektorienteret php, så kan jeg røbe at der er rigtig mange forbedringer i php 5. Det virker faktisk som om det er noget af det eneste der egentlig er ændret siden version 4 ;) Tak for point!
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