26. marts 2004 - 09:02Der 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;
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;
- 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
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*
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) {
$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(); ?>
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
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();
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()
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!
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!
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.