MySQL-Error in Klasse

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

  • MySQL-Error in Klasse

    Hallo,

    ich will für ein Projekt meine DB-Klasse erstellen ...
    PHP-Code:
    <?php

    class Database {
        
        private 
    $result = array();
        
        
    /**
         * initialise db connection
         * @param  string     $dbHost     db host
         * @param  string     $dbUser     db user
         * @param  string     $dbPassword db password
         * @param  string     $dbName     db name
         */
        
    public function connect($dbHost$dbUser$dbPassword$dbName) {
            if(!
    $this->con) {
                
    $myconn = @mysql_connect($dbHost$dbUser$dbPassword);
                if(
    $myconn) {
                    
    $seldb = @mysql_select_db($dbName$myconn);
                    if(
    $seldb) {
                        
    $this->con true
                        return 
    true
                    } else {
                        return 
    false
                    }
                } else {
                    return 
    false
                }
            } else {
                return 
    true
            }
        }
       
        public function 
    disconnect() {
            if(
    $this->con) {
                if(@
    mysql_close()) {
                    
    $this->con false
                    return 
    true
                } else {
                    return 
    false
                }
            }
        }
        
        public function 
    tableExists($table) {
            
    $tablesInDb = @mysql_query('SHOW TABLES FROM '.$dbName.' LIKE "'.$table.'"');
            if(
    $tablesInDb) {
                if(
    mysql_num_rows($tablesInDb)==1) {
                    return 
    true
                } else { 
                    return 
    false
                }
            }
        }
    }
    Soweit so gut, aber wenn ich prüfen will, ob eine Tabelle existiert ...
    PHP-Code:
    ...
        
    // Initiate the class
        
    $db = new Database();
        
    $db->connect();

        if ( 
    $db->tableExists('global')) { ... 
    ... bekommt ich immer eine Fehlermeldung genau in dem Funktionsaufruf ...
    Code:
    Call to a member function tableExists() on a non-object
    Eigentlich wollte ich ja MySQLi verwenden, aber da kam auch diese Fehlermeldung und nun dachte ich, steigst du eben wieder auf MySQL zurück.
    Habe mich auch schon fast tot gegoogelt, aber ich finde einfach den Fehler nicht.

    Habt ihr da noch eine Idee, wo der Fehler sein könnte?

  • #2
    mysql wird bald beerdigt. Warum willst du auf ein totes Pferd aufsteigen?

    Kommentar


    • #3
      Zitat von h3ll Beitrag anzeigen
      mysql wird bald beerdigt. Warum willst du auf ein totes Pferd aufsteigen?
      Ich sagte, doch, habe es erst mit MySQLi versucht, aber da kommt der gleiche Fehler.

      Kommentar


      • #4
        Zitat von Lowrider Beitrag anzeigen
        Ich sagte, doch, habe es erst mit MySQLi versucht, aber da kommt der gleiche Fehler.
        Dann solltest du deine Versuche mit mysqli zeigen. Ich seh nicht, warum man für praktisch toten Code eine Unterstützung geben soll. Das ist nur Zeitverschwendung.

        Und deine Fehlermeldung bedeutet, dass du versuchst die Methode auf irgendwas aufzurufen, dass keine Instanz deiner Klasse ist. Das hat mit der Klasse an sich nichts zu tun.

        Der Fehler lässt sich anhand deines Beispiels nicht nachstellen. Das ist eindeutig Fantasiecode.
        Zuletzt geändert von h3ll; 12.11.2015, 19:58.

        Kommentar


        • #5
          Die Klasse ...
          PHP-Code:
          class DB
          {
              private 
          $link null;

              public function 
          __construct() {
                  
          mb_internal_encoding'UTF-8' );
                  
          mb_regex_encoding'UTF-8' );
                  
          mysqli_reportMYSQLI_REPORT_STRICT );
                  try {
                      
          $this->link = new mysqliDB_HOSTDB_USERDB_PASSDB_NAME );
                      
          $this->link->set_charset"utf8" );
                  } catch ( 
          Exception $e ) {
                      die( 
          'Unable to connect to database' );
                  }
              }
              
              public function 
          __destruct() {
                  if( 
          $this->link) {
                      
          $this->disconnect();
                  }
              }

               public function 
          tableExists$name ) {
                   
          $check $this->link->query"SELECT 1 FROM $name);
                   if(
          $check !== false) {
                       if( 
          $check->num_rows ) {
                           return 
          true;
                       } else {
                           return 
          false;
                       }
                   } else {
                       return 
          false;
                   }
               }

          Der Aufruf ...
          PHP-Code:
          //Initiate the class
           
          $db = new DB();

          if ( 
          $db->tableExists('global')) { ... 

          Kommentar


          • #6
            Dieser Code verursacht garantiert nicht den genannten Fehler.

            Du solltest übrigens die Verbindungsdaten (Host, Username, etc.) nicht in Konstanten speichern, sondern im Konstruktor an die Klasse übergeben. Das ist eine ganz schlechte Idee eine Klasse an fixe Konstanten zu binden.

            mb_internal_encoding() und mb_regex_encoding() haben in der Datenbankklasse nichts verloren.
            Zuletzt geändert von h3ll; 12.11.2015, 20:22.

            Kommentar


            • #7
              Zitat von h3ll Beitrag anzeigen
              Dieser Code verursacht garantiert nicht den genannten Fehler.

              Du solltest übrigens die Verbindungsdaten (Host, Username, etc.) nicht in Konstanten speichern, sondern im Konstruktor an die Klasse übergeben. Das ist eine ganz schlechte Idee eine Klasse an fixe Konstanten zu binden.

              mb_internal_encoding() und mb_regex_encoding() haben in der Datenbankklasse nichts verloren.
              Code:
              Call to a member function tableExists() on a non-object in [B]/homepages/[/B]...
              Bekomme immer wieder diese Fehlermeldung der Zeilennummer, wo ich die Funktion aufrufe

              Kommentar


              • #8
                Dann enthält $db an der Stelle kein Objekt. Der Fehler ist jedenfalls nicht im geposteten Code sondern an einer anderen Stelle.

                Kommentar


                • #9
                  Aber er connected doch richtig. Bekomme doch diesbezüglich keine Fehlermeldung.

                  Somit muss doch aber in $db ein object sein
                  PHP-Code:
                  $db = new Database(); 

                  Kommentar


                  • #10
                    Zitat von Lowrider Beitrag anzeigen
                    Aber er connected doch richtig. Bekomme doch diesbezüglich keine Fehlermeldung.

                    Somit muss doch aber in $db ein object sein
                    PHP-Code:
                    $db = new Database(); 
                    Ja, an der anderen Stelle aber nicht. Was dazwischen passiert, verheimlichst du. Dort ist aber der Fehler.

                    Kommentar


                    • #11
                      functions.php ...
                      PHP-Code:
                      // Initiate the class
                          
                      $db = new Database();
                          
                          
                          
                      // Check if installed
                          
                      function cms_is_installed()
                          {
                              
                      $installed True;
                              
                              if (!
                      file_exists('./admin/settings.php')) {
                                  
                      //setting anlegen
                                  
                      $installed False;
                                  
                              } else {
                                  if ( 
                      $db->tableExists('global')) { 
                      Dazwischen fehlt kein Code.

                      Und in der Index.php erfolgt der Aufruf ...
                      PHP-Code:
                      include ('./admin/settings.php');
                          include (
                      './admin/includes/functions.php');
                          
                          if (
                      cms_is_installed()) { 

                      Kommentar


                      • #12
                        Innerhalb deiner Funktion cms_is_installed gibt es keine Variable namens $db.

                        Lies im Handbuch nach, über den Gültigkeitsbereich (Scope) von Variablen: PHP: Variable scope - Manual
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Danke dir vielmals. Das war die Lösung. Dachte, die Variable ist bereits global definiert, wenn ich die außerhalb der Funktion deklariere.

                          Kommentar


                          • #14
                            Zitat von Lowrider Beitrag anzeigen
                            Danke dir vielmals. Das war die Lösung. Dachte, die Variable ist bereits global definiert, wenn ich die außerhalb der Funktion deklariere.
                            Global ist böse. Im Idealfall erstellst du gar keine globalen Variablen. Wenn du Variablen in einer Funktion benötigst, dann übergib sie als Parameter.

                            Kommentar

                            Lädt...
                            X