Problem bei Zugriff vom Ubuntu-Server via PHP-Scripte auf FBDatenbank(Windows)

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

  • Problem bei Zugriff vom Ubuntu-Server via PHP-Scripte auf FBDatenbank(Windows)

    Hallo
    Ausgangssitution:
    man soll über I-net(URL) PHP-Scipte ausführen die auf eine local vorliegende Datenbank zugreifen.
    Die PhP-Scripte liegen auf einem Ubuntu-Hetzner-Server. Dieser von mir und einem Kollegen vor kurzem auf den aktuellesten Stand gebracht. Die Scipte versuchen über pdo_firebird auf die Datenbank zu zugreifen.
    Die Datenbank liegt momentan noch lokal auf meinem Laptop und soll später wenn alles zuverlässigläuft auf unseren lokalen Server umziehen.

    Wenn ich die Datenbank auf dem Hetzner lagere und von dort aus die angepassten scripte ausführe funktioniert alles. Die Ausgabe erfolgt wie gewünscht.

    Wenn ich die Datenbank von meinem Laptop aus ausführe oder mit IBExpert öffne gibt es auch keine Probleme(ersteres nehme ich an da ich sie hier geschrieben habe, vor knapp einem viertel Jahr).

    Das Problem liegt aber bei der eigentlichen Idee:
    Steuer ich von hier aus über den Mozilla die URL mit den parametern an und gebe als verbindung meine Lokale Datenbank in den scripten(Scripte liegen aufm dem Hetzner) an so scheitert das ganze und schmeist mir folgende Fehlermeldung raus:

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [335544379] unsupported on-disk structure for file C:\FIRMAPLAY_funktioniert.GDB; found 32779.10, support <Missing arg #4 - possibly status vector overflow>.<Missing arg #5 - possibly status vector overflow>' in /var/www/test/getcoworkerlist.php:30 Stack trace: #0 /var/www/test/getcoworkerlist.php(30): PDO->__construct('firebird:dbname...', 'SYSDBA', 'masterkey') #1 {main} thrown in /var/www/test/getcoworkerlist.php on line 30
    Ich hab nun schon versucht den Pfad oder die verbindung zu ändern was man an dem Script durch die Kommentare sieht, aber das führt nur zur gescheiterten Verbindungsherstellung.

    Mein Script:
    PHP-Code:
    <html>
            <head>
                    <title>
                            getcoworkerlist
                    </title>
            </head>
            <body>
                    <?php
                            
    //mittels url wird die variable ï¿½bergeben

                                    /*      type kann folgende Inhalte haben:
                                            offline(Wert 0)
                                            free(Wert 1)
                                            busy(Wert 2)
                                    */
                            
    $aid=$_GET["aid"];
                            
    //$ausnahme_datum= "1900-01-01 00:00:00";

                            
    require_once("befehle.php");
                            
    //require_once("connection.php");

                            //define("DB_HOST", "10.8.0.6");
                            //define("DB_USER", "SYSDBA");
                            //define("DB_PASSWORD", "masterkey");
                            //define("DB_NAME","C:\\Apache2.2\\htdocs\\FIRMAPLAY_funktioniert.GDB");

                            //$database = new PDO("firebird:dbname=" . DB_NAME . ":" . DB_HOST . "","" . DB_USER . "", "" . DB_PASSWORD . "");
                            //$database = new PDO ($str_conn, "SYSDBA", "masterkey");
                            //$str_conn = "firebird:dbname=10.8.0.6:C:\\FIRMAPLAY_funktioniert.gdb;";
                            
    $database = new PDO("firebird:dbname=10.8.0.6:C:\\FIRMAPLAY_funktioniert.GDB","SYSDBA","masterkey");
                            
    $database->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);

                            
    db_abfrage($database);

                            switch(
    $_GET["servicestatus"]){
                                    case 
    "offline":
                                            
    $sql="SELECT * FROM VW_SERVICE WHERE (\"SERVICEAID\"=$aid) AND (\"SERVICESTATUS\"=0)";
                                            break;

                                    case 
    "free":
                                            
    $sql="SELECT * FROM VW_SERVICE WHERE (\"SERVICEAID\"=$aid) AND (\"SERVICESTATUS\"=1)";
                                            break;

                                    case 
    "busy":
                                            
    $sql="SELECT * FROM VW_SERVICE WHERE (\"SERVICEAID\"=$aid) AND (\"SERVICESTATUS\"=2)";

                                    case 
    "freeandbusy":
                                            
    $sql="SELECT * FROM VW_SERVICE WHERE (\"SERVICEAID\"=$aid) AND ((\"SERVICESTATUS\"=1) OR (\"SERVICESTATUS\"=2))";
                                            break;

                                    case 
    "all":
                                            
    $sql="SELECT * FROM VW_SERVICE WHERE (\"SERVICEAID\"=$aid) AND (\"SERVICESTATUS\">=0)";
                                            break;
                            }

                            echo 
    '</br></br>';
                            foreach(
    $database->query($sql) as $key => $entry)
                                    {
                                            echo (
    '"' $entry['ID'] . '", "' $entry['MITARBEITERNAME'] .'", "' $entry['SERVICEIP'] .'"; ');
                                    };
                            
    ?>
            </body>
    </html>
    Laut Recherche und ratschlägen von kollegen soll es an einem Versionsunterschied zwischen Datenbank und Client liegen. Dabei frag ich mich aber warum ich sie dann in den einzelnen Systemen starten kann.
    Auf dem Hetzner läuft aktuell pdo_firebird in der version 2.5. auf meinem Laptop läuft Firebird 2.5. Die datenbank hab ich bis jetzt immer mit Firebird 2.0 in der Datenbank registriert.
    Wichtig wäre vllt auch noch das ich einen OPENVpn Tunnel zwischen dem Server und dem Lokalen Laptop laufen lasse.
    Die funktioniert eigentlich reibungslos.

    Ich wäre sehr dankbar für denkanstöße oder sogar lösungen.

    Beste Grüße
    Zuletzt geändert von ; 12.12.2011, 16:38.

  • #2
    Zitat von Jiraiya Beitrag anzeigen
    ...

    Wenn ich die Datenbank auf dem Hetzner lagere und von dort aus die angepassten scripte ausführe funktioniert alles. Die Ausgabe erfolgt wie gewünscht.
    Welchen DSN verwendest du dort? Irgendwie kommt der, den du im Quelltext angegeben hast, nicht ganz koscher vor.

    Wenn ich die Datenbank von meinem Laptop aus ausführe oder mit IBExpert öffne gibt es auch keine Probleme(ersteres nehme ich an da ich sie hier geschrieben habe, vor knapp einem viertel Jahr).
    Gleiche Fragestellung: Was unterscheidet den hierbei verwendeten DSN vom im Beispiel-Code angebenen?

    Steuer ich von hier aus über den Mozilla die URL mit den parametern an und gebe als verbindung meine Lokale Datenbank in den scripten(Scripte liegen aufm dem Hetzner) an so scheitert das ganze und schmeist mir folgende Fehlermeldung raus: ...
    Mein Script:
    PHP-Code:
    // ...
    $database = new PDO(
        
    "firebird:dbname=10.8.0.6:C:\\FIRMAPLAY_funktioniert.GDB",
        
    "SYSDBA",
        
    "masterkey"
    );
    // ... 
    Bei den Beispiel-DSNs im Handbuch werden dbname= und host= getrennt angegeben (oder gar kein host, aber das nützt dir hier ja nichts). Ich frage mich, was passiert, wenn du einen Phantasie-Pfad angibst, der nicht existiert. Kommt dann die gleiche Exception? Das wäre ein Indiz, dass der Client den Datenbankserver nicht findet.

    Laut Recherche und ratschlägen von kollegen soll es an einem Versionsunterschied zwischen Datenbank und Client liegen.
    So sagt die Fehlermeldung.[0] Aber siehe meine letzte Frage.

    Dabei frag ich mich aber warum ich sie dann in den einzelnen Systemen starten kann.
    Auf dem Hetzner läuft aktuell pdo_firebird in der version 2.5. auf meinem Laptop läuft Firebird 2.5. Die datenbank hab ich bis jetzt immer mit Firebird 2.0 in der Datenbank registriert. ...
    Hmm, der DB-Client auf dem Hetzner-Server hat die gleiche Versionsnummer wie der DB-Server dort (2.5). Beide verstehen sich. Wenn jetzt der Client von dort auf deinen Laptop zugreift und dort einen Server vorfindet, dessen Fileformat er nicht versteht, dann kommt mir das auch komisch vor. Was ich nicht verstehe (ich kenne Firebird nur von der Online-Dokumentation) ist, wieso ein Dateisystem-Pfad zu einer Datei ('C:\...') angegeben werden muss. Der Host und der Name der Datenbank sollten doch reichen ...

    --
    [0] Peinlich: Gerade habe ich auf firebirdfaq.org diese Fehlermeldung gesehen:
    Warning: mysql_connect(): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111) in .../html/firebirdfaq.org/ads/connect.php on line 2 Neuspesna konekcija na server.
    (Hervorhebung von mir)
    Zuletzt geändert von fireweasel; 19.12.2011, 23:04.
    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

    Kommentar


    • #3
      Welchen DSN verwendest du dort? Irgendwie kommt der, den du im Quelltext angegeben hast, nicht ganz koscher vor.
      Ich weiss der wirkte auch komisch. War aber der einzige zumindest soweit funktionierte. Hab aber auch die anderen Formulierungen ausprobiert(sieht man glaub ich am script). Beim Zugriff auf eine Lokale Datenbank die aufm Hetzner liegt hätte ich die DSN wie folgt formuliert:

      PHP-Code:
      $database = new PDO ("firebird: host = localhost; dbname= /var/www/cms/FIRMAPLAY_funktioniert.gdb","SYSDBA""masterkey"); 
      Diesen hab ich eben auch nochmal getestet und der funktioniert. Wenn ich nur den namen der Datenbank angebe, dann verweist die Exception darauf, das es keine erreichbare datenbank ist.

      Gleiche Fragestellung: Was unterscheidet den hierbei verwendeten DSN vom im Beispiel-Code angebenen?
      Auf meinem Laptop hab ich es nochmal anders realisiert. Aber funktioniert auch. Habs eben nochmal getestet. hier das script:

      PHP-Code:
      define("DB_HOST""localhost");
                  
      define("DB_USER""SYSDBA");
                  
      define("DB_PASSWORD""masterkey");
                  
      define("DB_NAME","C:\\Apache2.2\\htdocs\\FIRMAPLAY.GDB");
                  
      $ausnahme_datum"1900-01-01 00:00:00";
                  
      $aid=$_GET["aid"];        
                  require_once(
      "befehle.php");
                  
      $database = new PDO("firebird:dbname=" DB_NAME ";host=" DB_HOST "","" DB_USER """" DB_PASSWORD ""); 
      Wenn ich nach dem Hetznerbeispiel oben meine DSN ausrichte, dann wird der Pfad als Host erkannt auch eigenartig:
      Script:
      PHP-Code:
      $database = new PDO ("firebird: host = 10.8.0.6; dbname= C:\\FIRMAPLAY_funktioniert.gdb","SYSDBA""masterkey"
      Fehlermeldung:
      Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [335544721] Unable to complete network request to host "C".' in /var/www/test/getcoworkerlist.php:32 Stack trace: #0 /var/www/test/getcoworkerlist.php(32): PDO->__construct('firebird: host=...', 'SYSDBA', 'masterkey') #1 {main} thrown in /var/www/test/getcoworkerlist.php on line 32
      Bei den Beispiel-DSNs im Handbuch werden dbname= und host= getrennt angegeben (oder gar kein host, aber das nützt dir hier ja nichts). Ich frage mich, was passiert, wenn du einen Phantasie-Pfad angibst, der nicht existiert. Kommt dann die gleiche Exception? Das wäre ein Indiz, dass der Client den Datenbankserver nicht findet.
      Wenn ich das tue, verändert sich auch die Fehlermeldung in(der Fehler tritt ebenso auf mit einem backslash zwischen bla und FIRMA_funktioniert.GDB):
      PHP-Code:
      $database = new PDO
          
      "firebird:dbname=10.8.0.6:C:\\bla\\FIRMAPLAY_funktioniert.GDB"
          
      "SYSDBA"
          
      "masterkey" 
      ); 
      Fehlermeldung:
      Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [335544344] I/O error during "CreateFile (open)" operation for file "C:\bla\FIRMAPLAY_funktioniert.GDB"' in /var/www/test/getcoworkerlist.php:30 Stack trace: #0 /var/www/test/getcoworkerlist.php(30): PDO->__construct('firebird:dbname...', 'SYSDBA', 'masterkey') #1 {main} thrown in /var/www/test/getcoworkerlist.php on line 30
      Also scheint er den Datenbankserver schonmal zufinden oder?
      Was ich nicht verstehe (ich kenne Firebird nur von der Online-Dokumentation) ist, wieso ein Dateisystem-Pfad zu einer Datei ('C:\...') angegeben werden muss. Der Host und der Name der Datenbank sollten doch reichen ...
      Ich denke persönlich das wird daran liegen das ich kein Alias eingetragen habe.

      Den Beitrag den du gefunden hast, konnte ich nicht mehr erreichen oder wieder finden.

      Danke für deine Antwort.
      Zuletzt geändert von ; 20.12.2011, 10:57.

      Kommentar


      • #4
        Alternativ Lösung

        So ich hab nun eine "Lösung" gefunden. Allerdings war diese Ursprünglich nur als Test gedacht um zusehen, ob es denn so auch geht.
        Ich habe nun die PDO_Firebird Verbindung durch eine direkte Interbase/Firebird Verbindung ersätzt. Eigentlich dachte ich das nun der selbe Fehler erneut auftauchen würde aber nein. Die Verbindung funktioniert und meine Scripte saugen vortrefflich die Daten aus der Datenbank und stellen sie da. Sowohl die Lokalen als auch die Tests über VPN funktionieren.

        Damit hat sich das Thema erstmal soweit erledigt. Meine letzte Bitte an dieser Stelle: Kann mir jemand vllt noch sagen warum es so geht jedoch nicht mit der PDO-Extension? Die versionen sind ja an und für sich die selben geblieben.

        Danke mal wieder im Vorraus.

        Ich wünsche eine guten Rutsch ins neue Jahr.

        Added: Mein PDO funktioniet mittlerweile auch. Der scheinbar hat die installtion der Interbasetreiber geholfen.
        Zuletzt geändert von ; 30.12.2011, 15:35.

        Kommentar

        Lädt...
        X