Problem beim ableiten einer Datenbankzugriffsklasse

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

  • Problem beim ableiten einer Datenbankzugriffsklasse

    Hi ich weiß eigentlich soll man nicht so viel Quellcode posten aber leider ist dass der Rest in dem der Fehler sitzt und ich hab keine Ahnung welche Stelle davon der Fehler sitzt .

    Ich hab den Quellecode nach einem Buch geschrieben bzw nachgelesen wie man eine Klasse ableitet scheine da aber noch was falsch verstanden zu haben.

    habe php 5.0.4 auf mit einem apache2 als apachemodul

    PHP-Code:
    // ELTERN KLASSE
    class c_db_access
    {

        protected 
    $connection NULL;
        protected 
    $result NULL;
        protected 
    $db_con NULL;

        
    //! Der Standart Konstruktor.
        /*!
          Der Standartkonstruktor stellt eine Verbindung zur Datenbank her.
        */
        
    public function __construct$db_con_string  ) {
            
    $this->db_con $db_con_string;
            
    $this->connect$db_con_string  );
          }

          public function 
    connect$db_con_string  ) {
            
    $this->connection pg_connect $db_con_string );
             if (!
    is_resource($this->connection)) {
                 echo 
    "Verbindung zur Datenbank Fehlgeschlagen";
            }
            else{
                if(
    $_SESSION['DEBUG'] == TRUE){
                echo 
    "Verbindung zur Datenbank erstellt !<br>";
            }
        }
      } 
    // ende function

      
    public function abfrage$sql_abf ) {

        if (
    is_resource($this->connection)) {
          if (
    is_resource($this->result)) {
            
    pg_free_result($this->result);
          }
          
    $this->result pg_query$this->connection  $sql_abf );

        }
      } 
    // ende function


    // ende der Klasse


    // KIND KLASSE
    class c_db_logsys extends c_db_access {

        
    // Konstrukor
        
    function __construct $db_con_string ) {
           
    parent :: __construct ($db_con_string);
       }

        public function 
    user_log$loginname $erfolg $versuch ){


            if( 
    is_resource$this->connection )){
                echo 
    "Connection zum loggen steht !<br>";
            }
            else{
                echo 
    "Connection zum loggen steht nicht !<br>";
            }

        }
    // ende der Klasse 
    Ich bekomme immer nur die Meldung "Connection zum loggen steht nicht !" und die Abfrage wird auch nicht ausgeführt .

    allerdings kann ich aus der Kindklasse den Parameter protected $dbcon ausgeben lassen und er wird auch korrekt ausgegeben.

    Die erste Klasse sollte fehlerfrei sein , mit der Arbeite ich schon ne weile ohne größere Probleme , nur jetzt das Ableiten bringt mich etwas aus dem Konzept . Irgendwie scheine ich das noch nicht richtig verstanden zu haben oder so .

    Die Variablen result und connection scheinen nämlich leer zu bleiben . Also die Verbindung scheint nicht erstellt zu werden.
    Zuletzt geändert von sono; 08.09.2005, 19:56.

  • #2
    n paar echos in beiden Konstruktoren um zu gucken ob sie aufgerufen werden...ansonsten, sieht es eigentlich richtig aus, zumindest auf den ersten Blick *überleg*

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      den Debuggcode habe ich schon größtenteils rausgemacht sonst wäre das 3mal so lang .

      Das Problem ist , dass ich weiß , dass die Konstruktoren aufgerufen wurden.
      Schlieslich konnte ich ja auch schon den Connection string als protected variable speichern und dann in der Subklasse ausgeben lassen .

      Ich hab jetzt mal nen Upgrade von php5.04 auf php5.0.5 gemacht.

      Die Anzahl der Fehlermeldungen hat sich plötzlich etwas veringert ???

      Ich war so oder so die ganze Zeit am Kämpfen , da mein Code plötzlich in den Komischsten Grüden nicht mehr Funktioniert hat , keine Ahnung was ich da wieder alles für Käfer gezüchtet habe .

      Zb. Umstellung von php4 Prod auf php5 OO . SQL Anweisungen haben mit der selben PHP Version ohne Klasse Funktioniert , in meiner Klassen nicht mehr .
      Allerdings nur die Hälfte denn einige gingen ohne Probleme, und das SQL hab ich vorher extra über pgadmin3 getestet weil ich dachte das ich langsam verkalke.

      Hoffe dass mein Problem die alte PHP Version war. Muss mal meinen ganzen Code Testen.

      Nachtrag : Geht alles mit der Neuen Version auch nicht . Ist also mein Code.
      Zuletzt geändert von sono; 08.09.2005, 22:57.

      Kommentar


      • #4
        Original geschrieben von sono
        den Debuggcode habe ich schon größtenteils rausgemacht sonst wäre das 3mal so lang .
        scheinbar war das noch zu wenig...wie wäre es wenn du überprüfst, ob der DB connect statt findet. Vielleicht wird einfach nichts in der Variable gespeichert, weil der connect nichts zurück gibt...

        Die Anzahl der Fehlermeldungen hat sich plötzlich etwas veringert ???
        normal Einstellung E_ALL & ~ (E_NOTICE | E_WARNING), und es sollte bei dir sein E_ALL | E_STRICT

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          error_reporting(E_ALL); hab ich am Anfang des Quellcodes stehen.
          und in der php ini
          error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

          Ich denke das Problem gefunden zu haben.

          Das mit dem Connect habe ich fast als erstes schon geprüft. Wie gesagt die Verbindung wird erstellt .

          PHP-Code:
           if (!is_resource($this->connection)) {
                       echo 
          "Verbindung zur Datenbank Fehlgeschlagen";
           }
           else{
                      if(
          $_SESSION['DEBUG'] == TRUE){
                      echo 
          "Verbindung zur Datenbank erstellt !<br>";


          Ich hab jetzt rausgefunden , dass eine Verbindung die ich mit pg_connect aufmachen in meiner Klassen einfach beendet wird , wenn ich insert und update Anweisungen übergebe. Allerdings nicht bei jeder Anweisungen sondern nur bei bestimmten , bei denen aber immer.

          Die Anweisungen haben ich mir ausgeben lassen und von Hand in die Datenbank eingegeben da gingen Sie einwandfrei.

          Da ist plötzlich die Connectionid und das Result weg und die Datenbankabfrag schlägt darum logischerweise auch fehl .

          Ich habe jetzt meine Verbindung in der Klasse von pg_connect auf pg_pconnect geändert und siehe da. Die ganzen Fehlermeldungen die mir ausgegeben haben , dass kein Result existieren würden scheinen sich alle erledigt zu haben.

          Ich bin allerdings noch am Testen , da ich dass noch nicht 100% sagen kann ob jetzt alles wieder so geht wie ich dachte , dass es gehen müsste .

          Nicht Steinigen jetzt , aber wenn PHP die Verbindung bei einer Abfrage verliert , ist dass dann ein bug in PHP ?
          Oder kann das sein , dass mehrere Objekte der Klasse gleichzeitig aud die Datenbank zugreifen , und wenn bei einer der Destruktor ausgelöst wird, wird die komplette Verbindunge gekillt und die andere Objekte schauen in die Röhre ?
          Eigentlich nicht, wenn ich die Connectionids ausgeben lasse hab ich verschiedene Werte , oder hat das damit erst mal nichts zu tun ?
          Zuletzt geändert von sono; 09.09.2005, 07:51.

          Kommentar


          • #6
            Original geschrieben von sono
            Oder kann das sein , dass mehrere Objekte der Klasse gleichzeitig aud die Datenbank zugreifen , und wenn bei einer der Destruktor ausgelöst wird, wird die komplette Verbindunge gekillt und die andere Objekte schauen in die Röhre ?
            Eigentlich nicht, wenn ich die Connectionids ausgeben lasse hab ich verschiedene Werte , oder hat das damit erst mal nichts zu tun ?
            Bei PHP kann es eigentlich überhaupt nicht sein dass mehrere Objekte aus dem gleichen Script irgendwas gleichzeitig tun.

            Wenn du verschiedene Connection-IDs hast (ich denke du meinst Resource IDs), dann hast du mehrere Verbindungen zur DB geöffnet. Da würde ich mal mit der Fehlersuche beginnen.
            hopka.net!

            Kommentar


            • #7
              Bei PHP kann es eigentlich überhaupt nicht sein dass mehrere Objekte aus dem gleichen Script irgendwas gleichzeitig tun.
              Sorry falsch ausgedrückt,
              Also ich erstelle Objekt 1 , dann erstelle ich Objekt 2 . von ner Klasse mit pg_connect.

              Ich habe gelesen , dass bei pg_connect eine Identische Verbindung die bereits existiert einfach verwendet wird.
              Würde jetzt also Objekt 2 mit seinem Destruktor die Verbindunge trennen , so dass ab alle Abfragen des 1ten Objektes ins leere laufen ?

              Aber eigentlich kille ich die Objekte nicht , die sollten bis zum Ende des Scriptes existieren weshalb der Destruktor aller Klassen wohl erst am Ende des Scriptes ausgelöst werden sollte.

              Wenn du verschiedene Connection-IDs hast (ich denke du meinst Resource IDs), dann hast du mehrere Verbindungen zur DB geöffnet. Da würde ich mal mit der Fehlersuche beginnen.
              Ich glaube das habe ich zu voreilig gepostet , das scheint erst jetzt bei den persistenten Verbindungen zur Datenbank so zu sein .

              Kommentar


              • #8
                Original geschrieben von sono
                Ich glaube das habe ich zu voreilig gepostet , das scheint erst jetzt bei den persistenten Verbindungen zur Datenbank so zu sein .
                nein, das ist auch beim normalen Connect so, deshalb stimmt deine Theorie theoretisch...nur das ich bei dir keinen Destruktor sehe, der die Datenbankverbindung schließt :\

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar


                • #9
                  Wie schon erwähnt habe ich der Höflichkeit halber alles was mir nicht wirklcih wichtig erschien aus dem Code entfernt vor dem posten.

                  Schlieslich hat keine Mensch lust sich ein paar 100 Zeilen code durchzulesen wenn davon nur 10 oder 20 relevant sind, aber wem erzähle ich das hier .

                  PHP-Code:
                  public function __destruct() {
                      
                  $this->disconnect();
                  }

                    public function 
                  disconnect() {
                      if (
                  is_resource($this->connection)) {
                        
                  pg_close($this->connection);
                        if(
                  $_SESSION['DEBUG'] == TRUE){
                              echo 
                  "Verbindung Beendet !<br>";
                        }
                      }
                    } 
                  // ende function 
                  Sind die Zeilen die für den Destruktor verantwortlich sind.

                  Also nach dem Handbuch von php werden die Persistenten Verbindungen von pg_close nicht beendet .
                  Mit den persistenten Verbindungen scheint auch alles zu gehen.

                  Ich habe eine Theorie , vielleicht könnte mir die Jemand bestätigen.

                  Ich habe eine index.php , welche nach einer Pageid Dynamische Module läd welchen wiederum abhängig einer weiteren Variable Aktionen auslösen.

                  Diese Aktionen sind alle in Funktionen untergebracht .

                  Also angenommen ich habe 2 Funktionen.

                  Angenommen wir sind in Funktion 1

                  1. ich erstelle ein Objekt und greife auf die Datenbank zu .
                  2. Ich führe Funktion1 Funktion2 aus
                  3. Funktion 2 erstellt ein Objekt und greift auf die DB zu.
                  4. Funktion 2 ist zuende , das Objekt wird zerstört und der Destruktor kappt die Verbidung zur Datenbank
                  5. Objekt der Funktion 1 hat nun keine Verbindung zur Datenbank mehr ???

                  Und das hier dürfte meine Vermutung bestätigen.

                  pg_connect() öffnet eine Verbindung zu der PostgreSQL Datenbank, die durch den connection_string bezeichnet wird.

                  Falls ein zweiter Aufruf von pg_connect() mit demselben connection_string gemacht wird, wird die Verbindungskennung der bereits geöffneten Verbindung zurückgegeben, es sei denn, Sie übergeben die Konstante PGSQL_CONNECT_FORCE_NEW im Parameter connect_type.
                  Damit sollte das Problem geklärt sein .

                  Kommentar


                  • #10
                    Die Verbindung wird bei persistenten Verbindungen nicht beendet. Das ist ein Feature, was deine Klasse am Laufen hält, aber es gibt auch andere Features, die vielleicht nicht so schön sind.
                    Bevor du wild mit persistenten Verbindungen um dich schlägst, solltest du dir lieber angucken was sie genau machen und eventuell eine neue Verbindung bei jedem neuen Objekt erzwingen, siehe PHP-Manual, Parameter: Connection-Type

                    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                    Wie man Fragen richtig stellt

                    Kommentar


                    • #11
                      Ich bin gerade dabei das ganze Projekt so umzuschreiben , dass nur noch ein Objekt erstellt wird , welchens dann von jeder Funktion verwendet wird .

                      In der Art :

                      index.php : $dbobj = new db_con ;
                      index.php : require_once( "module.php ") ;
                      modul.php : function inmodul() { global $dbobj ; }

                      Dann benötige ich auch keine Persistente Verbindung mehr .

                      War das ne Geburt .

                      Zuletzt geändert von sono; 09.09.2005, 15:09.

                      Kommentar


                      • #12
                        mit global?
                        Naja, wenn du meinst das das die Lösung ist -.- *wo immer es geht auf global verzichtet*

                        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                        Wie man Fragen richtig stellt

                        Kommentar


                        • #13
                          Bin für einen bessern Vorschlag immer offen.

                          Sollte ich das Objekt deiner Meinung nach lieber als Parameter an die Funktion übergeben ?

                          Global ist bis jetzt das einzige was ich kenne um in Funktionen auf Variablen zuzugreifen die Auserhalb der Funktion Existieren .

                          Ich könnte das Objekt der Datenbankklasse natürlich auch in die Session hauen , aber da bin ich mir nicht sicher ob ich das sollte .

                          Ansonsten noch per Parameter .

                          Ich kenne die Problematik der Register Globals, aber wo liegt das Problem wenn ich eine existierende Variable bei Register Globals OFF die nirgends als Paramter ans Script übergeben werden kann per global in eine Funktion hole ?

                          Selbst wenn einer per POST oder GET etwas an das Script übergeben würde , würde spätestens im Script die Variable wieder überschrieben werden , selbst wenn doch mal irgendwo Register Globals on wäre , oder nicht ?

                          Aber wie gesagt wenn man das anderst besser macht dann würde mich das auf jeden Fall interessieren .

                          Kommentar


                          • #14
                            wie du schon sagtest, Parameter

                            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                            Wie man Fragen richtig stellt

                            Kommentar


                            • #15
                              Hm , dann aber als Referenz .

                              Sonst dürfte ich vermutlich , dasselbe Problem heraufbeschwören welches ich gerade in mühevoller Kleinarbeit aus dem Code bügle .

                              Ich hab mich jetzt mal noch tiefer in die persistenten Verbindungen eingelesen, ich werde meine Klassen wohl persistent lassen .
                              ( 95 % des Outputs meines Programmes werden später aus einer Datenbank kommen. )
                              Die Probleme die Auftreten können sehe ich im Moment bei meinem Projekt noch nicht .

                              Ich werde aber die ganzen Module und Funktion so anpassen , dass das Programm auch ohne persistente Verbindung laufen kann .

                              Danke für eure ( hauptsächlich deine ) Hielfe , das mich wieder um einiges nach vorne gebracht .

                              Gruß Sono
                              Zuletzt geändert von sono; 09.09.2005, 21:25.

                              Kommentar

                              Lädt...
                              X