Avatar billede jmorten Nybegynder
29. december 2010 - 21:16 Der er 14 kommentarer og
2 løsninger

Problemer med klasse

Jeg har lavet følgende klasse til at oprette forbindelse til mysql:

<?php
class Mysql {
    private $connection;
    public static $instance;

    public function  __construct($host, $username, $password, $database, $newLink = false) {

    $this->connection = mysql_connect($host, $username, $password, $newLink);

        if (!$this->connection){
            throw new Exception("Could not connect to the server...");
        }

        if(!mysql_select_db($database, $this->connection)){
            throw new Exception("Could not connect to the database...");
        }
    }

    public static function instance(){

        if(!isset(Mysql::$instance)){
            Mysql::$instance = new Mysql(MYSQL_HOSTNAME, MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_DATABASE);
        }

        return Mysql::$instance;
    }

    public function selectDataObject($query){
        return mysql_fetch_object(mysql_query($query, $this->connection));
    }

    public function selectDataArray($query){
        return mysql_fetch_assoc(mysql_query($query, $this->connection));
    }

    public function  __destruct() {

        if(!mysql_close($this->connection)){
            throw new Exception("Could not close the connection to the server...");
        }

    }
}
?>

Nu vil jeg gerne udskrive det:
try {
$Database = Mysql::instance();
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

while($Data = $Database->selectDataObject("SELECT * FROM categories ORDER BY Name"))
{
echo $Data->ID;
}

Den finder også noget data fra databasen men udskriver bare det samme uendeligt, altså løkken stopper ikke.. :S
Avatar billede arne_v Ekspert
29. december 2010 - 21:22 #1
Da du bliver ved med at udføre den samme query igen og igen bliverder jo ved med at være data.
Avatar billede jmorten Nybegynder
29. december 2010 - 21:31 #2
Men selv om jeg udførere den udenfor løkken laver den samme nummer, den burde jo retunere det i funktionen fra klassen ikke ??!
Avatar billede arne_v Ekspert
29. december 2010 - 22:21 #3
Hvis du ingen løkke har så udskriver den ikke uendeligt.
Avatar billede arne_v Ekspert
29. december 2010 - 22:22 #4
Ikke relevant for dit problem men brug af singleton til at holde database connection er ikke godt.
Avatar billede jmorten Nybegynder
29. december 2010 - 22:35 #5
Hvis jeg sætter den udenfor løkken udskriver den kun et row, var lige hurtig nok i teksten før, hvorfor er det en skidt ide at holde connectionen i singelton ?
Avatar billede arne_v Ekspert
29. december 2010 - 23:31 #6
Hvis du får brug for at have 2 connections samtidigt, så har du et problem.
Avatar billede repox Seniormester
30. december 2010 - 09:00 #7
#6
Især efter MySQLi er kommet ;)

#0
Problemet er at du starter forfra hver gang din løkke eksekveres.
Når du kører denne:
$Database->selectDataObject("SELECT * FROM categories ORDER BY Name");

Kører du metoden her:
public function selectDataObject($query){
        return mysql_fetch_object(mysql_query($query, $this->connection));
    }

Og det er faktisk her problemet opstår.

Når metoden selectDataObject($query) køres, så eksekverer du  mysql_query() i din funktion hver gang. Det gør - meget naturligt - at din forespørgsel til databasen startes forfra hver gang og vil give dig det samme resultat (første række) uanset hvor mange gange du kører metoden.
Avatar billede jmorten Nybegynder
30. december 2010 - 10:17 #8
Ja okay, men altså når jeg så sætter den udenfor løkken vises der stadig kun den første række, hvad kan der være galt?
Avatar billede repox Seniormester
30. december 2010 - 10:21 #9
Det har jeg faktisk lige forklaret dig?!? Hver gang du kører
$Database->selectDataObject("SELECT * FROM categories ORDER BY Name");

starter du din forespørgsel forfra...
Avatar billede jmorten Nybegynder
30. december 2010 - 10:24 #10
argh jeg har den nu.., læg lige et svar begge...
Avatar billede repox Seniormester
30. december 2010 - 10:25 #11
Der kom et svar fra mig her
Avatar billede jmorten Nybegynder
30. december 2010 - 10:27 #12
ang. singelton er det så bedre at tilgå klassen flere gange end at have samme instance på klassen, eller skal jeg have en seperat instance klasse der styrer klasserne og connections ?
Avatar billede jmorten Nybegynder
30. december 2010 - 10:42 #13
Jeg gjorde følgende så virkede det:

    public function query($query)
    {
        if($this->query = mysql_query($query, $this->connection))
        {
            return true;
        }else{
            throw new Exception("Could not send the query string...");
        }
    }

Og så lavede jeg om på selectDataObject() og selectDataArray()..
Avatar billede jmorten Nybegynder
30. december 2010 - 14:11 #14
Arne smid et svar også..
Avatar billede arne_v Ekspert
30. december 2010 - 15:17 #15
kommer her
Avatar billede arne_v Ekspert
30. december 2010 - 15:18 #16
Hvis du mener at din klasse leverer noget værdi udover hvad mysqli gør, så behold din egen klasse, men lav en ny instans hver gang du skal lave noget med databasen. Det virker både med en forbindelse og med flere forbindelser.
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