Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQLI Abfragen in einer Klasse kapseln

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQLI Abfragen in einer Klasse kapseln

    Guten Tag zusammen!

    Ich habe in diesem Board in den letzten Wochen sehr viele Informationen gesucht und auch gefunden, dafür zuerst mal vielen Dank an alle.

    Nun zu meinem Problem:
    In den letzten Wochen habe ich als Aufgabe für eine Ausarbeitung an der Uni die Erstellung einer Onlineumfrage mit PHP und MySQL erhalten.
    Dazu habe ich mich in PHP und MySQL eingelesen und angefangen die Webseite zu programmieren. Mit den klassischen mysql Abfragen habe ich das alles hinbekommen.

    Nun meinte mein Prof jedoch, nutzen sie mysqli, kapseln sie alle Datenbankzugriffe in einer Klasse und nutzen sie die objektorientierte Schnittstelle zum Zugriff auf die Datenbank.

    Ich hatte meine Seite zuvor in dieser Art aufgebaut:
    PHP-Code:
    mysql_connect("localhost","root","");
    mysql_select_db("akadumfrage");
    // ...
    $fragenliste mysql_query("SELECT * FROM tbl_Fragen ORDER BY FrageID");
    while(
    $fragen mysql_fetch_array($fragenliste)) {
    // Fragen ausgeben

    Nun soll ich diese Abfrage ja in einer Klasse kapseln, was bei mir dann so aussieht:
    PHP-Code:
    class db_zugriff extends mysqli
    {
      private 
    $mysql;
      
      
    //Datenbankverbindung herstellen
      
    public function __construct()
      {
        
    $this->mysql = new mysqli('localhost''root''''akadumfrage');
        if (
    mysql_query("SELECT 1")) { echo 'its connected'; } else { echo 'not connected'; }  
      }

      public function 
    liste_fragen() {
          
    $result $this->mysql->query('SELECT * FROM tbl_Fragen ORDER BY FrageID');
          return 
    $this->mysql->$result
      }
    }
    //...
    while($row fetch_assoc($db->liste_fragen()))
    { echo 
    $row['Fragetext']."<br>"; } 
    Leider funktioniert das ganze nicht und es erscheint folgende Meldung:
    Fatal error: Call to undefined function fetch_assoc() in C:\xampp\htdocs\akadumfrage-neu\inc\umfrage.php on line 41
    Zeile 41 ist die Zeile, in welcher mit fatch_assoc auf die Abfrage zugegriffen werden soll.

    Bei folgendem Gedanken stecke ich dabei fest: da die Klasse db_zugriff von mysqli erbt, erbt sie nicht die mysqli_result Funktionen und demnach kann ich auf diese nicht zugreifen.

    Leider finde ich zu dem Thema relativ wenig im Internet und in meinem PHP- Buch (PHP5 MySQL5 von Matthias Kannengiesser) steht zu diesem Thema auch nichts (zumindest finde ich leider nichts).

    Habt Ihr eine Idee, wie ich die MySQLi-Abfragen möglichst einfach Kapseln kann?

    Vielen Dank im Voraus

  • #2
    http://php.net/manual/de/mysqli-result.fetch-assoc.php

    Kommentar


    • #3
      //Datenbankverbindung herstellen
      Schön wärs.
      extends mysqli
      und
      $this->mysql = new mysqli('localhost', 'root', '', 'akadumfrage');
      sind zwei Sachen, die nicht zusammengehören.

      Kommentar


      • #4
        Du solltest von "extends" erstmal die Finger lassen. Mit Vererbung kannst Du Dich dann beschäftigen, wenn Du eine "normale" Klasse erstellt hast.

        Ansonsten bist Du mit dem Beispiel-Code auf dem Weg zu einer Master-Klasse, die alles beinhaltet. Deine Liste von Fragen gehört nicht in eine DB-Klasse.
        In einer DB-Klasse sind allgemeine Abfragen enthalten, die dann wiederum andere Klassen benutzen können, um spezielle Datensätze auszulesen.
        Beispiele für Funktionen in einer DB-Klasse wären: getAll(), getRow(), getOne()...
        Übergeben wird jeweils ein Query und zurückgegeben wird dann ein Array oder bei getOne() z.B. ein einzelner String.

        Kommentar


        • #5
          Vielen Dank euch 3 erstmal!

          Mein Fehler ist glaub ich die Aufgabenstellung von meinem Prof. nicht ganz korrekt verstanden zu haben und dann in eine Richtung gelaufen bin, die in einer Sackgasse endet.

          Ich muss mich da nochmal tiefer einlesen und das Thema anders angehen.

          Kommentar


          • #6
            Hallo nochmal!

            Ich habe nun das geschafft was ich wollte. Hatte da am Anfang doch einige Denkfehler drin!

            Hier noch für alle interessierten, meine Lösung:

            PHP-Code:
            class db_zugriff{
                private 
            $connection NULL;
                
                public function 
            connect($host$user$pass,$database) {
                    
            $this->connection = new mysqli($host,$user,$pass,$database);
                }
                
                public function 
            disconnect() {
                    if (
            is_resource($this->connection)) {
                        
            mysqli_close($this->connection);
                    }
                }
                
            //get-Methoden
                
            public function getresult($sql){
                    
            $result $this->connection->query($sql);
                    return 
            $result;
                }

                public function 
            getlistefragen(){
                    
            $result $this->getresult("SELECT * FROM tbl_Fragen ORDER BY FrageID");
                    return 
            $result;
                }
            }
            //...
            $fragenliste $mysqli->getlistefragen();
            while(
            $fragen $fragenliste->fetch_array()) {
            //...

            Kommentar


            • #7
              Das ist leider keine gescheite Lösung.
              Du hast immer noch eine "Master-Klasse" für alles.
              getlistefragen() gehört nicht in eine DB-Klasse.

              Und Du gibst auch kein Array zurück, sondern das mysqli-result. Das führt dazu, dass Du außerhalb der DB-Klasse mysqli-Funktionen wie fetch_array() benutzen musst.
              In der Aufgabenbeschreibung war von kapseln und Schnittstelle die Rede. Beides ist bei Dir nicht der Fall.

              Kommentar

              Lädt...
              X