Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Klasse / Funktionen verwenden

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Klasse / Funktionen verwenden

    Ich hatte mir gegen redundanten Quelltext eine Klasse mit MySQL-Funktionen geschrieben.

    Ursprünglich wurde die Klasse "includiert" aber nachdem daraufhin die Funktion nicht gefunden wurde ("Call to a member function connect() on a non object in ...") habe ich die Klasse zum probieren kurzerhand mit in meine eigentliche Datei gepackt.

    Code:
    <?php
    include('./konfiguration/config.php');
    
    class sql
     {
     function connect($host,$db,$benutzer,$passwort)
      {
      global $verbindung;
      $verbindung = mysql_connect($host,$benutzer,$passwort);
      $select = mysql_select_db($db,$verbindung);
      if($select) {return true;} else {return false;}
      }
     }
    
    
    if(!$sql->connect(MYSQL_HOST,MYSQL_DB,MYSQL_BENUTZER,MYSQL_PASSWORT))
     {
     die('Fehler bei dem Versuch, Verbindung zur Datenbank herzustellen!');
     }
     else
     {
     echo 'Verbindung hergestellt';
     }
    ?>
    MYSQL_HOST usw. werden in './konfiguration/config.php' definiert und lassen sich per echo auch ausgeben.

    Jetzt bekomm ich ständig die Fehlermeldungen:
    1) "Undefined variable: sql in ... on line 16"
    2) "Call to a member function connect() on a non-object in ... on line 16"

    Die selbe Klasse/Funktion habe ich bereits öfters mit dem gleichen Aufruf verwendet!?? Kann mir jemand helfen?
    "Je größer die Insel des Wissens, desto länger die Küste der Verzweiflung!"

  • #2
    Bevor du eine Klasse benutzen kanns musst du erst ein Objekt dieser Klasse erzeugen.
    PHP-Code:
    <?php
    include('./konfiguration/config.php');

    class 
    sql
     
    {
     function 
    connect($host,$db,$benutzer,$passwort)
      {
      global 
    $verbindung;
      
    $verbindung mysql_connect($host,$benutzer,$passwort);
      
    $select mysql_select_db($db,$verbindung);
      if(
    $select) {return true;} else {return false;}
      }
     }

    $sql = new sql();
    if(!
    $sql->connect(MYSQL_HOST,MYSQL_DB,MYSQL_BENUTZER,MYSQL_PASSWORT))
     {
     die(
    'Fehler bei dem Versuch, Verbindung zur Datenbank herzustellen!');
     }
     else
     {
     echo 
    'Verbindung hergestellt';
     }
    ?>

    Kommentar


    • #3
      OMG! Blamed!!! Nu klar ... hast Recht. Danke!
      "Je größer die Insel des Wissens, desto länger die Küste der Verzweiflung!"

      Kommentar


      • #4
        Deine Klasse braucht auch kein global! Dafür sind Klassen ja da.
        Außerdem würde ich die Fehlerbehandlung IN der Klasse machen da du sonst auch wieder überall diese Fehlerbehebung machen musst.

        PHP-Code:
        <?php
        include('./konfiguration/config.php');

        class 
        Sql {
            private 
        $verbindung;

            public function 
        connect($host$db$benutzer$passwort) {
                
        $this->verbindung = @mysql_connect($host$benutzer$passwort);
                if (
        $this->verbindung === false) {
                    
        trigger_error('Fehler beim Herstellen einer Verbindung zur Datenbank!');
                    return 
        false;
                }
                
        $select = @mysql_select_db($db$this->verbindung);
                if(
        $select === false) {
                    
        trigger_error('Fehler beim Auswählen der Datenbank!');
                    return 
        false;
                }
                return 
        true;
            }
        }

        $sql = new Sql();
        $sql->connect(MYSQL_HOSTMYSQL_DBMYSQL_BENUTZERMYSQL_PASSWORT);
        Bei Klassennamen verwendet man oft einen Großbuchstaben am Anfang!

        Kommentar


        • #5
          Zwecks global ... die Funktion ist schon älter (weiß also nicht mehr genau wie es war!) aber ich hatte damals Probleme beim beenden meiner Verbindung wenn ich
          Code:
          global $verbindung;
          nicht mit im Quelltext hatte!
          Das Beenden erfolgte über eine weitere Funktion:
          Code:
          function close()
           {
           global $verbindung;
           if(mysql_close($verbindung)) {return true;} else {return false;}
           }
          Das mit dem sofortigen auswerten werde ich mir zu Herzen nehmen! ^^

          Frage: Wozu "$this->verbindung"?
          "Je größer die Insel des Wissens, desto länger die Küste der Verzweiflung!"

          Kommentar


          • #6
            Schau doch im Manual nach, da steht beschrieben wie Klassen funktionieren!

            $this->verbindung ist eine "globale" Variable innerhalb der Klasse. Genau das was du mit global $verbindung versuchst zu machen.

            Die Methode zum schließen der Verbindung könnte dann so aussehen.

            PHP-Code:
            <?php
            public function close() {
                if (
            $this->verbindung !== null) {
                    return 
            mysql_close($this->verbindung);
                }
            }

            Kommentar


            • #7
              Zitat von Flor1an
              Außerdem würde ich die Fehlerbehandlung IN der Klasse machen da du sonst auch wieder überall diese Fehlerbehebung machen musst.
              Das liegt zwar nahe, im Rahmen des Themas Zusicherungen (assertions) habe ich aber auch des öfteren Gegenteiliges gelesen:

              Wenn die Parameter explizit überprüft werden, muss das vom Aufrufer erledigt werden, weil die Methode nie Parameter zu sehen bekommen darf, die ihre Vorbedingungen verletzen.
              Dort am Bsp. Wurzelziehen
              Wenn der Benutzer eine negative Zahl eingibt, muss der aufrufende Quelltext dafür sorgen, dass sie nicht an sqrt übergeben wird. Der aufrufende Quelltext hat viele Möglichkeiten: Er kann das Programm abbrechen, eine Warnung ausgeben und eine neue Zahl einlesen oder die Zahl mit -1 multiplizieren und "i" an das Ergebnis von sqrt anhängen. Was auch immer getan wird, es ist definitiv nicht die Aufgabe von sqrt.
              aus: Der pragmatische Programmierer

              Ein interessanter Ansatz finde ich. Klingt auch logisch. Ist aber eine mächtige Umstellung, das muß man sich immer wieder ins Gedächtnis rufen.
              [COLOR="#F5F5FF"]--[/COLOR]
              [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
              [COLOR="#F5F5FF"]
              --[/COLOR]

              Kommentar


              • #8
                Das ist schon richtig. Hab gestern erst eine Klausur über Vor- und Nachbedingungen von Funktionen geschrieben Der pragmatische Programmierer hab ich noch nicht ganz fertig, gammelt seit Weihnachten noch im Regal.

                Auf jeden Fall ist die Frage wie du deine Vor- und Nachbedingungen für deine eigenen Funktionen definierst. Man kann natürlich nur true/false bei connect() zurückgeben. Funktioniert genauso dann muss deine Applikation die Fehlerbehandlung machen. Wenn allerdings diese immer gleich aussieht, dann würde es ebenfalls gegen das DRY Prinzip verstoßen Hier wieder aus Der pragmatischer Programmierer.

                Bei meiner DB Klasse wird connect() nur intern aufgerufen! Und zwar erst wenn wirklich eine Verbindung hergestellt werden MUSS. Meistens also beim ersten Query oder beim ersten mysql_real_escape_string(). Daher wird die Fehlerbehandlung von der Klasse übernommen da ich nicht bei jedem Query die Fehlerbehandlung für !mysql_connect() übernehmen möchte.

                Kommentar

                Lädt...
                X