Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Tabellen aus Datenbank auslesen funktioniert nicht

Einklappen

Neue Werbung 2019

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

  • SebZi
    hat ein Thema erstellt PHP Tabellen aus Datenbank auslesen funktioniert nicht.

    PHP Tabellen aus Datenbank auslesen funktioniert nicht

    Hallo!

    Ich versuche mich derzeit mit PHP.
    Ich möchte gerne mich mit der Datenbank verbinden (dürfte auch klappen) aber irgendwie erhalte ich keine Daten aus der Datenbank.

    Ich möchte die Verbindung zur Datenbank einmal erstellen und dann in verschiedenen Funktionen abrufen.
    Wenn ich die Verbindung direkt in der Funktion aufbaue funktioniert alles.

    Kann mir jemand weiterhelfen?

    Vielen Dank!

    Die Test.php Datei:

    PHP-Code:
    <?php 

    require_once('DatabaseManager.php');
    MySQL::Connect();
    ?>

    <h1>Name</h1>
        <?PHP

          
    foreach(MySQL::GetTables($_GET['dbpage'] * 20,20) as $table){
            echo 
    '
                    '
    .$table.'<br>
                  '
    ;
          }
        
    ?>
      </tbody>
    </table>
    Die DatabaseManager.php Datei
    PHP-Code:
    <?PHP
    class MySQL{
        private 
    $con;

          public function 
    Connect(){
            
    $con = new mysqli("HOST""user""password""database") or die('Error');
        }

        public function 
    GetTables(){
           
    $tables = array();
           
    $showtablequery "SHOW TABLES";

           
    $showtablequery_result $con->query($showtablequery);
           while(
    $row $showtablequery_result->fetch_row()) 
          {
              
    $tables[] = $row[0];
          }
          
    sort($tables);
          return 
    $tables;
       }
    }
    ?>

  • jspit
    antwortet
    Zitat von hellbringer Beitrag anzeigen
    query() ist aber eine Methode, die sich auf die Verbindung bezieht. Dein showTables() bezieht sich hingegen auf eine Datenbank.
    Riecht etwas nach Haarspalterei für den Fall hier der Erweiterung einer Klasse MySQLi die ja nur die Verbindung zu MySQL-Datenbanken zulässt.

    PDO zu erweitern halte ich für sinnvoller.
    Und zwar so, um bei den Beispiel hier zu bleiben, das eine Methode die z.B. alle Tabellennamen liefert eben unabhängig von der Verbindung zu SQLite, MySQL oder PostgreSQL benutzt werden kann.

    Es wird immer wieder der Spruch gebracht jede Klasse sollte nur eine Aufgabe erledigen. Aber jede Aufgabe besteht aber in der Regel aus mehreren Teilaufgaben. Soll also eine große Aufgabe möglichst in viele Teilaufgaben mit entsprechenden Klassen und die wiederum in x Klassen gesplittet werden? Halte solche Klassen-Konglomerate mit zum Teil mehreren hundert Dateien weder für übersichtlich noch für effektiv.
    Das Gegenteil davon ist die sog. Gottklasse, die eine Vielzahl von Themen anspricht.
    Eine Klasse sollte sich einer Thematik widmen und in diesen Zusammenhang auch mal mehrere Aufgaben erledigen dürfen.

    Einen Kommentar schreiben:


  • hellbringer
    antwortet
    Zitat von protestix Beitrag anzeigen
    Irgendwie versteh ich dich nicht.
    Ich mache doch das gleiche wie die mysqli Klasse, lediglich habe ich eine Methode hinzugefügt
    Noch mal
    Klasse
    PHP-Code:
    class mysqliExtended extends mysqli {
    ... 
    // Rest wie oben

    Aufruf der Instanz mit der hinzugefügten Methode
    PHP-Code:
    $mysqliext = new mysqliExtended('localhost''root''');
    $mysqliext->select_db('test');
    Var_dump($mysqliext->showTables()); 
    Der Bezug wie du es schreibst ist doch auf die Verbindung, wie bei mysqli auch.
    Bin da etwas verwirrt.
    Mag in dem speziellen Fall so funktionieren. Für so Kleinscheiß eine extra Ableitung zu machen ist aber auch schon ziemlich absurd. Deine showTables() Funktion ist auch unnötig aufgeblasen. Sowas ist doch nur ein Einzeiler:

    PHP-Code:
    $mysqli = new mysqli('localhost''root''''test');
    $tables array_column($mysqli->query('SHOW TABLES')->fetch_all(MYSQLI_NUM), 0); 

    Einen Kommentar schreiben:


  • protestix
    antwortet
    Irgendwie versteh ich dich nicht.
    Ich mache doch das gleiche wie die mysqli Klasse, lediglich habe ich eine Methode hinzugefügt
    Noch mal
    Klasse
    PHP-Code:
    class mysqliExtended extends mysqli {
    ...  
    // Rest wie oben

    Aufruf der Instanz mit der hinzugefügten Methode
    PHP-Code:
    $mysqliext = new mysqliExtended('localhost''root''');
    $mysqliext->select_db('test');
    Var_dump($mysqliext->showTables()); 
    Der Bezug wie du es schreibst ist doch auf die Verbindung, wie bei mysqli auch.
    Bin da etwas verwirrt.

    Einen Kommentar schreiben:


  • hellbringer
    antwortet
    Zitat von protestix Beitrag anzeigen
    Wenn man so will ist nach deiner Definition ja schon mysqli eine Gottklasse, was ist dann erst PDO?
    query() ist aber eine Methode, die sich auf die Verbindung bezieht. Dein showTables() bezieht sich hingegen auf eine Datenbank.

    Zitat von protestix Beitrag anzeigen
    Aber davon abgesehen, auch mal von der etwas unglücklichen Benennung.
    Ist das denn nicht vorteilhafter ggü. dem was in ersten Post versucht wurde?
    Statt etwas schlechtes durch etwas weniger schlechtes zu ersetzen, wäre es zielführender gleich das Gute zu verwenden.

    Einen Kommentar schreiben:


  • protestix
    antwortet
    Zitat von hellbringer Beitrag anzeigen
    Du möchtest Aktionen in einer Datenbank machen (1. Aufgabe = 1. Klasse)
    PHP-Code:
    $mysqli->query("SHOW TABLES"
    Zitat von hellbringer Beitrag anzeigen
    und brauchst dafür eine Verbindung zur Datenbank (2. Aufgabe = 2. Klasse).
    PHP-Code:
    $mysqli = new mysqli("localhost""root""""test"
    Wenn man so will ist nach deiner Definition ja schon mysqli eine Gottklasse, was ist dann erst PDO?

    Aber davon abgesehen, auch mal von der etwas unglücklichen Benennung.
    Ist das denn nicht vorteilhafter ggü. dem was in ersten Post versucht wurde?

    Einen Kommentar schreiben:


  • hellbringer
    antwortet
    Der Fehler ist schon in der Benennung. Ein extends sollte immer mit einm "ist ein(e)" ersetzbar sein.

    In deinem Fall wäre das Klasse Datenbank (myDB) ist eine Datenbankverbindung (mysqli), was aber falsch ist. Eine Datenbank ist keine Verbindung.

    Du möchtest Aktionen in einer Datenbank machen (1. Aufgabe = 1. Klasse) und brauchst dafür eine Verbindung zur Datenbank (2. Aufgabe = 2. Klasse). Also sind hier mindestest 2 (getrennte) Klassen notwendig. Wenn alles eine Klasse macht, wird sie zur Gottklasse.

    Einen Kommentar schreiben:


  • protestix
    antwortet
    Mal `ne allgemeine Frage dazu.

    Mysqli ist ja schon eine Klasse, ist es da nicht besser diese zu erweitern?

    Mal als Beispiel dazu

    PHP-Code:
    class myDB extends mysqli {

        public function __construct(
                $host = 'localhost',
                $user = null,
                $pass = null,
                $db = null,
                $port = null,
                $socket = null) {

            @parent::__construct($host, $user, $pass, $db, $port, $socket);

            if ( $this->connect_errno != 0 ) {
                throw new Exception($this->connect_error, $this->connect_errno);
            }
        }

        public function showTables(){

            $result = @parent::query("SHOW TABLES");

            if ( $this->errno != 0 ) {
              throw new Exception($this->error, $this->errno);
            }

            $tableName[] = null;

            while ( $row = $result->fetch_row() ) {
                     $tableName[] = $row[0];
            }

            return (array)$tableName;
        }

    }


    //Einfaches Anwendungsbeispiel:

    $db = new myDB('localhost', 'root', '', 'test');

    ?>
    <!DOCTYPE html>
    <html lang="de">
    <head>
      <meta charset="utf-8">
      <title>Beispiel</title>
    </head>
    <body>
    <p><?= implode(", "$db->showTables()); ?></p>

    </body>
    </html>
    Wie ist die übliche Vorgehensweise, da man ja oft hier sieht das es ohne extends gemacht wird.

    Meine präferierte Lösung sieht jedoch so aus, die ich aber nicht zur Diskussion stellen will. Hier hat ja jeder seine eigenen Vorstellungen, warum er es so oder anders löst.
    PHP-Code:

    $mysqli = new mysqli("localhost", "root", "", "test") or die('Error');


    if ($result = $mysqli->query("SHOW TABLES")) {
        $dbTableName[] = null;
        while ($row = $result->fetch_row()) {
                 $dbTableName[] = $row[0];
        }
    }
    $htmlPlain = implode(" - ",$dbTableName);
    $htmlList = implode("<li>",$dbTableName);
    $htmlOption = '<option value="0" selected> Bitte auswählen' . implode("</option><option>",$dbTableName) . "</option>" ;


    ?>



    <!DOCTYPE html>
    <html lang="de">
    <head>
      <title>Beispiel</title>
    </head>

    <body>
        <h3>Ausgabebeispiele</h3>
        <select>
            <?=$htmlOption?>
        </select>
        <p><?= $htmlPlain?></p>
        <ol>
            <?= $htmlList?>
        </ol>

    </body>
    </html>
    Kontextwechsel und evtl. Fehlerbehandlung mal aussen vor gelassen.

    Einen Kommentar schreiben:


  • SebZi
    antwortet
    Habt vielen Dank alle zusammen für die Geduld und rasche Hilfe.

    Es funktioniert jetzt bei mir

    Einen Kommentar schreiben:


  • hellbringer
    antwortet
    MySQL::GetTables() ist ein statischer Aufruf. Du solltest alles was statisch ist vermeiden. Statische Methoden sind nur sehr selten notwendig. Hier gehören sie jedenfalls nicht hin.

    Einen Kommentar schreiben:


  • hausl
    antwortet
    PHP-Code:
    foreach(MySQL::GetTables() 

    Einen Kommentar schreiben:


  • SebZi
    antwortet
    Nein sollte nicht mehr drinnen sein -> Habe quasi den Code von oben mal kopiert.

    PHP-Code:
    <?PHP
      
    class MySQL{
        private 
    $con;

       public function 
    __construct()
       {
           
    $this->Connect();
       }

        public function 
    Connect(){
          
    $this->con = new mysqli("HOST""USER""PW""DB") or die('Error');
        }

        public function 
    GetTables() {
            
    $tables = array();
            
    $showtablequery "SHOW TABLES";

           
    $showtablequery_result $this->con->query($showtablequery);
           while(
    $row $showtablequery_result->fetch_row()) 
           {
               
    $tables[] = $row[0];
          }
          
    sort($tables);
          return 
    $tables;
        }

    }
    ?>
    und

    PHP-Code:
    <?php 
    require_once('DatabaseManager.php');
    $myMySQLInstance = new MySQL();
    $myMySQLInstance->connect();
    ?>

    <h1>Name</h1>
        <?PHP

          
    foreach(MySQL::GetTables() as $table){
            echo 
    '
                    '
    .$table.'<br>
                  '
    ;
          }
        
    ?>
      </tbody>
    </table>

    Einen Kommentar schreiben:


  • hausl
    antwortet
    Nein du hast falschen Programmcode.

    Using $this when not in object context
    Hast du immer noch den statischen Mist im Code? Wurde oben doch schon gesagt das du den rausnehmen sollst.

    Einen Kommentar schreiben:


  • SebZi
    antwortet
    Danke für die Infos.
    Hab es schon ausprobiert - mit dem Code von dir.
    Leider erhalte ich noch immer folgenden Fehler:
    Fatal error: Uncaught Error: Using $this when not in object context in /home/.sites/755/site8560765/web/DatabaseManager.php:21 Stack trace: #0 /home/.sites/755/site8560765/web/testx.php(12): MySQL::GetTables() #1 {main} thrown in /home/.sites/755/site8560765/web/DatabaseManager.php on line 21

    Line 21 wäre:
    PHP-Code:
    $showtablequery_result $this->con->query($showtablequery); 
    Habe ich eventuell falsche Server Einstellungen?
    Aktuell verwende ich PHP 7.2

    Einen Kommentar schreiben:


  • Gnom42
    antwortet
    Hier nochmal was zu den Grundlagen OOP in PHP:
    http://php.net/manual/de/language.oop5.basic.php

    Das alles statisch zu machen ist meines Erachtens Käse.

    Meinen Hinweis hast du aber wohl falsch verstanden

    PHP-Code:
    <?PHP
      
    class MySQL{
        
    // nicht statisch
        
    private $con;

        public function 
    Connect(){
          
    // hier dann aber bitte auch auf die korrekte Weise zugreifen mit $this->con
          // "$con" wäre nur eine lokale Variable
          
    $this->con = new mysqli("HOST""USER""PASSWORD""DB") or die('Error');
        }

        public function 
    GetTables() {
            
    $tables = array();
            
    $showtablequery "SHOW TABLES";

           
    $showtablequery_result $this->con->query($showtablequery);
           while(
    $row $showtablequery_result->fetch_row()) 
           {
               
    $tables[] = $row[0];
          }
          
    sort($tables);
          return 
    $tables;
        }

    }
    ?>
    Ich hab dann leider auch einen kleinen Flüchtigkeitsfehler gemacht ...

    PHP-Code:
    <?php 
    require_once('DatabaseManager.php');
    // erst das Object mit "new" erzeugen
    $myMySQLInstance = new MySQL();
    // dann die connect Methode der Instanz aufrufen
    $myMySQLInstance->connect();
    ?>

    // ...

    Mann kann das Connect aber auch mit in einen Konstruktor verpacken, dann passiert das beim erstellen der Instanz quasi gleich mit


    PHP-Code:
    <?php
     
    class MySQL{
        private 
    $con;

       
    // wird immer aus geführt wenn eine neue Instanz mit "new" erzeugt wird
       
    public function __construct()
       {
           
    $this->Connect();
       }

        public function 
    Connect(){
          
    // ... 
        
    }


        public function 
    GetTables(){
    // ...
    }
    }
    ?>

    Einen Kommentar schreiben:

Lädt...
X