pear::db binary data Problem

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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

    Comment


    • #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.
      Last edited by Daywalker13; 22-09-2004, 11:15.

      Comment


      • #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

        Comment


        • #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.

          Comment


          • #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.

            Comment


            • #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

              Comment


              • #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.

                Comment


                • #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

                  Comment


                  • #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.

                    Comment

                    Working...
                    X