Avatar billede znopie Nybegynder
05. august 2010 - 17:49 Der er 7 kommentarer

Hent database fra class

Hej Eksperter,

Jeg vil prøve noget nyt, og har derfor besluttet mig for at lave en blog i noget class, men kan ikke rigtig få det til at fungere. Hvorfor kan jeg ikke helte fra min classe med dette script?

<?php /* START */

class blog
{
    private $mysqli;

    private function connect()
    {
        $this->mysqli = new mysqli('localhost', 'user', 'pass', 'database');
    }

    public function getPost()
    {
        $this->connect();
        $getPost = $this->mysqli->query("SELECT * FROM posts") OR DIE($mysqli->error);
        if($getPost->num_rows!=0){return "No results!";} else { return mysqli_fetch_row($getPost); }
    }

}

$blog = new blog();
echo "<h1>Results:</h1>";
print_r( $blog->getPost );

/* END */ ?>

og kan den laves på en anden måde, så jeg kan skrive while($show = mysqli_fetch_row($blog->getPost)){$show['overskrift']}
Avatar billede w13 Novice
05. august 2010 - 18:04 #1
Hvad siger fejlmeddelelsen? :)
Avatar billede w13 Novice
05. august 2010 - 18:11 #2
I øvrigt ville jeg nok gøre sådan her:

<?php /* START */

class blog
{
    private $mysqli;

    public function __construct()
    {
        $this->mysqli = new mysqli('localhost', 'user', 'pass', 'database');
    }

    public function getPost()
    {
        $getPost = $this->mysqli->query("SELECT * FROM posts") OR DIE($mysqli->error);
        if($getPost->num_rows!=0){return "No results!";} else { return mysqli_fetch_row($getPost); }
    }

}

$blog = new blog();
echo "<h1>Results:</h1>";
print_r( $blog->getPost );

/* END */ ?>


__construct bliver automatisk kørt, når du laver new Blog(), så den skal ikke forbinde til databasen hver gang du vil hente noget ud, kun første gang.
Avatar billede w13 Novice
05. august 2010 - 18:14 #3
Og:

if($getPost->num_rows!=0){return "No results!";}[i]

skal vel være:

[i]if($getPost->num_rows==0){return "No results!";}
Avatar billede znopie Nybegynder
05. august 2010 - 19:30 #4
Får intet ud af den. Der kommer hverken tekst eller nogen fejl :/
Avatar billede repox Seniormester
06. august 2010 - 13:31 #5
Jeg bryder mig ikke synderligt meget om idéen om at lægge andet end initialiseringer ind i __construct().

En __construct() kan hurtig blive uoverskuelig hvis laver mysql forbindelser, curl forbindelser, åbne konfigurationsfiler og så videre i den. Min holdning er at man laver nogle seperate funktioner som giver det naturlige overblik over det skal ske ved instantiering af objektet.

Udover det vil det også være ønskeligt hvis du fokuserede mere på hvordan mysqli arbejder frem for mysql, Der er nogle ret store forskelle i måden at arbejde med det på, så bare det at kigge på dokumentationen for mysqli ville have løst nogle af de problemer du har skabt for dig selv.

MEn her er mit forslag (utestet) til en kode som kunne give dig det du har behov for.

<?php /* START */

class blog
{
    private $mysqli = null;
    public $error = null;
   
    public function __construct()
    {
        $this->mysqli_connect();
    }

    private function mysqli_connect()
    {
        $this->mysqli = new mysqli('localhost', 'user', 'pass', 'database');
    }

    public function getPosts()
    {
        $this->connect();
       
        $sql = "SELECT * FROM posts";
        $query = $this->mysqli->query();
       
        if( !$query ) // hvis sql fejler
        {
            $this->error = $this->mysqli->error);
            return false;
        }
       
        if($query->num_rows == 0)
            return array(); // returner et tomt array istedet for at køre mere kode
           
        return $query->fetch_all(MYSQLI_ASSOC);           
    }

}

$blog = new blog();
$posts = $blog->getPosts();
if( !$blog )
{
    echo "Der skete desværre en databasefejl - vi arbejder på at løse problemet";
    mail("dig_selv@example.org", "Fejl fra ".__FILE__, "SQL sagde:\n".$blog->error); // Send en mail til dig selv med fejlen eller gem det i en logfil
}
else
{
    echo "<h1>Results</h1>";
    if( count($posts) == 0 )
        "Der er ikke nogen indlæg";
    else
    {
        foreach($posts as $post)
        {
            echo $post["overskrift"];
            //bla blah
        }
    }
}


/* END */ ?>
Avatar billede znopie Nybegynder
13. august 2010 - 12:46 #6
Tak, læg et svar repox :)
Avatar billede repox Seniormester
13. august 2010 - 13:01 #7
Det fik du her.
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