pear::db binary data Problem

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

  • pear::db binary data Problem

    Hi!

    Ich möchte eine Datei in meiner Datenbank speichern, aber bisher schlugen alle Versuche fehl ... vielleicht weiss jemand hier im Forum, wo mein Fehler ist ...

    Folgendes kleines Code-Beispiel sieht für mich nach DB-Anleitung eigentlich korrekt aus, aber es wird kein Eintrag in der Datenbank gemacht


    PHP-Code:
    require_once 'DB.php'

    $dsn = array( 
        
    'phptype'  => 'odbc'
        
    'username' => 'testuser'
        
    'password' => 'testpass'
        
    'database' => '10.0.0.1:testdb'
    ); 

    $options = array( 
        
    'debug'       => 0
        
    'portability' => DB_PORTABILITY_ALL
    ); 

    $db =& DB::connect($dsn$options); 

    if (!(
    DB::isError($db))) { 

       
    $sth $db->prepare('INSERT INTO dateien ( id, datei ) VALUES (?,&)'); 

                    
    $id 10
       
    $file "/tmp/test.dat"
       
    $data = array($id$file); 

       
    $res =& $db->execute($sth$data); 

       if (!(
    DB::isError($res))) { 
          
    $res->getMessage(); 
       } 

       
    $db->disconnect(); 



  • #2
    bekommst Du keine Fehlermeldung?

    PHP-Code:
    if (!(DB::isError($db))) { 
       ... 
    snip ...
    }

    ersetzen mit:

    if (!(
    DB::isError($db))) { 
       ... 
    snip ...
    } else {
     echo 
    'Fehler!';
     
    // und dann noch Fehlermeldung von PEAR ausgeben

    [Test] MySQL cli Emulator

    Kommentar


    • #3
      opsummerweise ist mir ein kleiner Fehler unterlaufen, so dass ich gar keine Fehlermeldung erhalten habe.

      Anstatt

      PHP-Code:
         if (!(DB::isError($res))) { 
            
      $res->getMessage(); 
         } 
      Muss es natürlich lauten

      PHP-Code:
         if (DB::isError($res)) { 
            echo 
      $res->getMessage(); 
         } 
      Jetzt erhalte ich eine Fehlermeldung:

      DB Error: syntax error

      Wenn ich mir mit $res->getDebugInfo() den SQL-Query anschaue, wurde im Query der Inhalt der Datei eingefügt. Nur von meiner Datenbank erhalte ich zusätzlich den Fehler:

      [MySQL MaxDB][LIBSQLOD SO][MaxDB] Syntax error or access violation;-3014 POS(67) Invalid end of SQL statement]

      Position 67 ist genau dort, wo im SQL-Query der Dateiinhalt anfängt.
      Die MaxDB-Dokumentation hilft mir beim Fehlercode -3014 auch nicht wirklich weiter. Dort steht nur, dass ich den Query korregieren soll.

      Ich habe ein weiteres kleines Beispiel-Programm ohne DB geschrieben, das einfach eine Foto-Datei in der Datenbank speichert und dann wieder anzeigt. Diesmal wird die Datei scheinbar in der DB abgelegt, allerdings kann ich es nicht mehr anzeigen lassen

      PHP-Code:
      $connection odbc_connect"10.0.0.1:TESTDB""USER""PASS" );

      $stmt=odbc_prepare($connection"INSERT INTO dateien (id, typ, datei) VALUES( ?, ?, ?)" );
      $parms=array("1","original","'/tmp/test1.jpg'");

      if (
      odbc_execute($stmt, &$parms)) {

          
      $Query_ID odbc_exec($connection"SELECT datei FROM dateien WHERE id=1 and typ='original'");

          
      odbc_longreadlen $Query_ID0);
          
      odbc_binmode($Query_IDODBC_BINMODE_RETURN);

         
      $Image odbc_result($Query_ID1);
         
          
      Header"Content-type: image/jpeg");
            echo 
      $Image;


      } else echo 
      "=("
      Hoffentlich hat jemand noch einen Tip für mich :?:

      An dem Fakt, dass die Dateien in der Datenbank gespeichert werden sollen, kann ich momentan nichts ändern. Ich hätte es auch lieber so, dass ich nur den Dateinamen speichere.
      Zuletzt geändert von Daywalker13; 22.09.2004, 12:15.

      Kommentar


      • #4
        beim überfliegen fällt mir spontan nur das auf :
        PHP-Code:
        $parms=array("1","original","'/tmp/test1.jpg'"); 
        vielleicht ändern in
        PHP-Code:
        $parms=array("1","original","/tmp/test1.jpg"); 
        es sei denn Du brauchst die ' , dann müßtest Du die escapen also \\'
        [Test] MySQL cli Emulator

        Kommentar


        • #5
          Im PHP Handbuch zu odbc_execute() steht:

          Any parameters in parameter_array which start and end with single quotes will be taken as the name of a file to read and send to the database server as the data for the appropriate placeholder.
          Daher nehme ich an, dass $parms korrekt ist.

          Leider kann ich kein Beispiel finden, wo dies benutzt wird.

          Kommentar


          • #6
            Im PHP Handbuch zu odbc_execute() steht:

            Any parameters in parameter_array which start and end with single quotes will be taken as the name of a file to read and send to the database server as the data for the appropriate placeholder.
            Daher nehme ich an, dass $parms korrekt ist.

            Leider kann ich kein Beispiel finden, wo dies benutzt wird.

            Kommentar


            • #7
              achso, das habe ich falsch verstanden.
              Wird jetzt nichts in die DB geschrieben oder kannst Du es nur nicht wieder anzeigen?
              Wenn nichts geschrieben wird, die Datei existiert auch wirklich '/tmp/test1.jpg' ?
              [Test] MySQL cli Emulator

              Kommentar


              • #8
                Aaahh!!

                OK. Mit dem "odbc" Skript funktioniert es jetzt. Das Problem dort war, dass mir "convert" ein JPEG geliefert hatte, das ich zwar normal in meinem Bildbearbeitungsprogramm öffnen kann, aber das der IE aus irgendeinem Grund nicht anzeigen kann. Mit einem anderen JPEG funktioniert alles wunderbar.

                Mit der DB-Version habe ich auch weiterhin kein Glück.

                Kommentar


                • #9
                  Mit der DB-Version habe ich auch weiterhin kein Glück.
                  Könntest Du bitte nochmal beschreiben was funktioniert bzw. was nicht.
                  Also an welcher Stelle bricht das Script ab, hier ->
                  PHP-Code:
                   $res =& $db->execute($sth$data); 
                  Bzw. bricht nicht ab aber dort wo der Fehler ausgegeben wird.
                  Poste bitte nochmal den Quelltext wenn er sich seit dem ersten Post verändert hat
                  [Test] MySQL cli Emulator

                  Kommentar


                  • #10
                    Am DB-Skript habe ich bisher nichts mehr geändert, abgesehen von der kleinen Fehlerausgabe korrektur (s.o.). Eigentlich müßte es so funktionieren.

                    Nach dem $db->execute() prüfe ich ja, ob das Ergebnis ein Fehler ist, oder nicht. Dort steigt er aus, da als Ergebnis des $db->execute() immer ein Fehler ausgegeben wird.

                    Momentan ist es ein "Syntax Error".

                    Wenn ich anstatt

                    PHP-Code:
                    $res->getMessage(); 
                    folgendes schreibe

                    PHP-Code:
                    echo $res->getDebugInfo(); 
                    bekomme ich den SQL-Query ausgegeben, den DB an die Datenbank schickt. Der Query ist zu lang, um ihn hier zu posten. Aber dort sieht man, dass DB den Inhalt der Datei in den Query eingefügt hat. Nur enthält der Query jetzt scheinbar einen haufen Zeichen, die meine Datenbank nicht akzeptiert und daher sagt, dass der Query ungültig ist.

                    Wenn ich es richtig verstanden habe wird bei odbc_execute() einfach der Dateiname an die Datenbank übergeben, und diese kümmert sich dann um das einlesen der Datei. Genau dies hätte ich auch gerne in DB.

                    Leider habe ich bisher keine Möglichkeit gefunden, die Datei mit DB in der Datenbank zu speichern. Auch das Einlesen der Datei in eine Variable und das Umwandeln eventueller Sonderzeichen, wie Anführungsstriche, bringt keinen Erfolg.

                    Kommentar

                    Lädt...
                    X