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

  • 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;
       }
    }
    ?>


  • #2
    PHP-Code:
    error_reporting(E_ALL); 
    "Funktioniert nicht" .. ist keine sinnvolle Fehlerbeschreibung.

    Was passiert denn?

    Und ohne dem schonmal vorweg:
    PHP-Code:
    //Aufruf
    MySQL::GetTables($_GET['dbpage'] * 20,20// <- 2 Parameter

    // Definition
     
    public function GetTables() // <- keine Parameter 
    Desweiteren rufst du die Funktion statisch auf, aber der Aufruf sollte über eine Instance erfolgen, da ansonsten $con innerhalb der Methode auch nicht definiert ist.
    $con muss auch mit $this->con angesprochen werden, wenn du auf das private property zugreifen willst, anderenfalls ist es eine nciht initialisierte lokale Variable innerhalb der Methode
    PHP-Code:
    $myMySQLInstance MySQL::Connect();

    $myTablesArray $myMySQLInstance->GetTables(); 

    Naja, schalte mal das Error Reporting ein und das wird dir das dann schon alles um die Ohren hauen

    Kommentar


    • #3
      Hallo,

      Sorry Fehler bekomme ich - habe ich vergessen hier einzufügen -> mein Fehler...


      Danke für die Tipps! habe es versucht, leider nicht hin bekommen.
      Erhalte folgende Fehlermeldung (Vielleicht mache ich ja noch immer etwas falsch):
      Fatal error: Uncaught Error: Call to a member function GetTables() on null in /home/.sites/755/site8560765/web/testx.php:9 Stack trace: #0 {main} thrown in /home/.sites/755/site8560765/web/testx.php on line 9

      Testx.php Datei:
      PHP-Code:
      <?php 
      require_once('DatabaseManager.php');
      $myMySQLInstance MySQL::Connect();
      ?>

      <h1>Name</h1>
          <?PHP

            
      foreach($myMySQLInstance->GetTables() as $table){
              echo 
      '
                      '
      .$table.'<br>
                    '
      ;
            }
          
      ?>
        </tbody>
      </table>
      DatabaseManager.php Datei:
      PHP-Code:
      <?PHP
        
      class MySQL{
          private static 
      $con;

          public function 
      Connect(){
            
      $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;
          }

        }
      ?>
      Habe mich noch weitergespielt und viel gegoogelt...
      Es funktioniert wenn ich die Datenbank folgendermaßen aufrufe:
      PHP-Code:
      self::$con= new mysqli("HOST""USER""PASSWORD""DB") or die('Error'); 
      Und die Datenbankverbindung in Getables() wie folgt aufrufe:
      PHP-Code:
      $showtablequery_result MySQL::$con->query($showtablequery); 
      Und auch die Variable als privat und statisch deklariere
      PHP-Code:
      private static $connection
      Ist das so überhaupt ein guter brauchbarer Weg? Was sagt hier eure Erfahrung?

      Kommentar


      • #4
        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(){
        // ...
        }
        }
        ?>

        Kommentar


        • #5
          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

          Kommentar


          • #6
            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.
            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              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>

              Kommentar


              • #8
                PHP-Code:
                foreach(MySQL::GetTables() 
                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  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.

                  Kommentar


                  • #10
                    Habt vielen Dank alle zusammen für die Geduld und rasche Hilfe.

                    Es funktioniert jetzt bei mir

                    Kommentar


                    • #11
                      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.

                      Kommentar


                      • #12
                        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.

                        Kommentar


                        • #13
                          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?

                          Kommentar


                          • #14
                            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.

                            Kommentar


                            • #15
                              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.

                              Kommentar

                              Lädt...
                              X