Announcement

Collapse
No announcement yet.

Binäre Daten von einer Tabelle in eine ander schreiben

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

  • Binäre Daten von einer Tabelle in eine ander schreiben

    Hallo zusammen,

    ich stehe gerade vor folgender Herrausforderung.

    In einem Warenwirtschaftsystem gibt es 3 Mandanten die alle auf die gleichen Artikeldaten zugreifen sollen. Um nicht bei jedem Mandaten
    die Arikel zu pflegen, hab ich in PHP ein Script geschrieben welches die Daten aus dem "Mastermandanten" in die anderen Datenbänke synchronisiert.

    Das klappt alles auch ganz toll bis auf die Bilddaten. Die Bilder sind binär in der Datenbank gespeichert. Der Feldtyp ist varbinary(MAX).

    Der Code-Teil für die Bilder sieht dann so aus:

    PHP Code:
            $SQLsrv->targetDB 'DATABASE0';
            
    $blobkey        'AR'.$artikelnrDB0;
            
    $sqlBildDB0     "select blobkey, ordnung, CAST('bild' AS VARBINARY(MAX)) as bild from dbo.bild where blobkey = '$blobkey'";
            
    $BildinDB0      $SQLsrv->fetch_all($sqlBildDB0);
            
    $SQLsrv->targetDB   'DATABASE2';
            foreach(
    $BildinDB0 as $valueBild)
            {
                
    $blobkeyinDB0       $valueBild['blobkey'];
                
    $bildordnung        $valueBild['ordnung'];
                
    $bild               $valueBild['bild'];

                
    $sqlBildDB2         "select blobkey from dbo.bild where blobkey = '$blobkeyinDB0' and ordnung = '$bildordnung'";
                
    $BildinDB2          $SQLsrv->fetch_one($sqlBildDB2);
                
    $bildkeyDB2         $BildinDB1['blobkey'];
                if(!empty(
    $bildkeyDB2))
                {
                    
    $sqlBild "update dbo.bild set bild = '$bild'  where blobkey = '$blobkeyinDB0' and ordnung = '$bildordnung'";
                    
    //echo $sqlBild.'<br>';
                    
    $resupdateBild $SQLsrv->execute_sqlsrv($sqlBild);
                }
                else
                {
                    echo 
    $sqlBild "insert into dbo.bild
                                        (Blobkey,    Kennung, Bild, Ordnung, Beschreibung, Zusatz, Datum, Dateiname,    Kennzeichen1)
                                            values
                                        ('
    $blobkeyinDB0', '', '$bild', '$bildordnung', '', '', '', '', '')
                                    "
    ;
                    
    //echo $sqlBild.'<br>';
                    
    $resinsertBild $SQLsrv->execute_sqlsrv($sqlBild);
                }
            } 
    Das Feld blobkey ist die Veknüpfung zur Artikelnummer, das Feld Ordnung ist der Zähler wenn es mehr als ein Bild zum Artikel gibt. Das feld bild
    sind die binären Bilddaten.

    Mein Problem ist jetzt, das die Bilder in der Warenwirtschaft (in den aktualisierten Datenbänken) nach dem ausführen des Scriptes nicht angezeigt werden können weil
    die Formate fehlerhaft sind. Irgendwie zersäge ich die Daten zwischen dem auslesen und dem reinschreiben.

    Hat jemand eine Idee?

    Gruss Nevada

  • Elias Ohm
    replied
    Fraglich ist, in welchem Bereich die Freelancer sich auskennen wollen.
    Hier ist der Fall doch mehr als offensichtlich.
    Bei beiden Inserts (also sowohl das Insert als auch das Update) konvertieren die binären Daten noch im PHP zu einem String der dann in deinem einen Fall (update) als Teil der Query übertragen wird oder übertragen werden soll, im anderen Fall (insert) wird zwar eine Bind-Variable genutzt die geeignet ist binäre Daten zu übertragen, jedoch wird hier durch die Anführungszeichen das BLOB ebenfalls zuvor von PHP in einen String umgewandelt.

    - Entweder schmeißt natürlich php beim Impliziten Konvertieren der Binärdaten zu (UTF-16 z.B. beträfe aber auch UTF-8) einen Fehler (An error occurred translating the query string to UTF-16: No mapping for the Unicode character exists in the target multi-byte code page.)
    - Oder php's iconv konvertiert teilweise (ohne die theoretisch entstehenden ungültigen Zeichen) oder gibt ein FALSE zurück (abhänhgig von der PHP Version) und übergibt diesen (unvollständigen) Textwert oder ein nach Text konvertiertes FALSE an die Datenbank die hier aber zu Recht binäre Daten erwartet und sich weigert automatisch irgendwie zu konvertieren wie es ja auch PHP tut (Die implizite Konvertierung vom varchar-Datentyp in varbinary(max) ist nicht zulässig. Verwenden Sie die CONVERT-Funktion, um diese Abfrage auszuführen.). [mit der CONVERT Funktion könnte man den String zwar wieder nach Binär konvertieren, aber die Daten sind dann natürlich kapuut]

    Also in einem solchen Fall Bind-Variablen nutzen und natürlich nicht die Binärdaten im PHP explizit oder implizit in einen String konvertieren.
    (Es sei denn man will aus welchen Gründen auch immer unbedingt zwischendurch einen Text haben, dann kann man natürlich konvertieren aber man muss dann eine Darstellung wie BASE64 oder HEX verwenden was die in MSSQL nicht vorhandenen einfach zu handhabenden Konvertierungsmethoden erschweren)

    Leave a comment:


  • Nevada208
    replied
    Je länger ich heir rumbastel desto weniger weiss ich was ich mache...

    Ich lese binäre Daten aus einem Feld mit dem Feldtyp varbinary(max) - ein Bild JPG

    Die selben Daten will ich in eine Feld mit den gleichen Eigenschaften speichern

    Die Struktur beider Tabellen sind identisch.

    Ich verstehe nicht was ich hier in was konvertieren soll ??

    Egal was ich mache irgendeine Fehlermeldung kommt immer....

    Leave a comment:


  • Christian Marquardt
    replied
    Da haben die ja schön schauen können.
    Irgendwo hast du ein Problem mit deiner Codierung. Entweder die Datenbank oder die HTML-Seite oder der Transport.
    Etwas ist da auf UTF-16. Ob beabsichtigt oder nicht. Das musst du nun in Einklang bringen durch entsprechende Konvertierungen

    Leave a comment:


  • Nevada208
    replied
    nein die waren mit teamviewer auf meinem Rechner

    Leave a comment:


  • Christian Marquardt
    replied
    du warst also schon mal innerhalb der 2 Tage bei o.a. Fehler.
    Der erste Parameter ist der zu konvertierende String der 2. der Zeichensatz in den konvertiert werden soll

    Selbst 2 Freelancer bei freelancer.de haben es nicht hinbekommen ...
    Also 2 bezahlt konnten das nicht lösen?
    Die hast du auch nur so mit Häppchen ohne weitere Infos versorgt?

    Leave a comment:


  • Nevada208
    replied
    ganz so einfach mache ich mir es nicht. Bevor ich hier gepostet habe hab ich schon 2 Tage rumprobiert.
    Selbst 2 Freelancer bei freelancer.de haben es nicht hinbekommen ...

    Leave a comment:


  • Christian Marquardt
    replied
    Du bist seit 2007 am PHP programmieren und kannst anhand des Manuals nicht erkennen, welcher der 2 Parameter wohin kommt?
    Dir ist es nicht möglich, nur das 1. oder 2. Beispiel nachzuvollziehen?
    Du hast dir nur 6 Minuten gegeben um da mal reinzuschauen einen selbständigen Versuch zu machen?

    Leave a comment:


  • Nevada208
    replied
    Danke Christian, aber ich habe zu wenig Erfahrung das mir Diene Lösungsansätze helfen.

    Ich brauch da mehr konkrete Unterstützung.... was genau muss in der Funktion geändert werden....?

    Leave a comment:


  • Christian Marquardt
    replied
    http://bfy.tw/7l4x


    http://php.net/manual/de/function.mb...t-encoding.php
    Zuletzt editiert von Christian Marquardt; 18.09.2016, 13:41.

    Leave a comment:


  • Nevada208
    replied
    Hatte ich auch schon gefunden. Ich hab in der PHP.ini den Wert

    default_charset = "UTF-8" gesetzt.

    Die Variable $bild so convertiert

    $bild = iconv('','UTF-8',$value['Bild']);

    Jetzt habe ich eine andere Fehlermldung:

    Die implizite Konvertierung vom varchar-Datentyp in varbinary(max) ist nicht zulässig. Verwenden Sie die CONVERT-Funktion, um diese Abfrage auszuführen.

    Leave a comment:


  • Christian Marquardt
    replied
    http://stackoverflow.com/questions/9...ng-codeigniter

    Leave a comment:


  • Nevada208
    replied
    Ich habe mich wieder mit diesem Thema beschäftigt, komme aber nicht weiter.
    Die Funktion die die Daten kopieren soll sieht so aus:

    PHP Code:
    function copybild($database)
    {
        
    $SQLsrv = NEW SQLsrv();
        
    $SQLsrv->targetDB   'DATABASE0';
        
    $sql                "select blobkey, Bild, Kennung, Ordnung, Beschreibung, Zusatz, Dateiname, Kennzeichen1 from bild";
        
    $res                $SQLsrv->fetch_all$sql );

        
    $SQLsrv->targetDB   $database;
        
    $sqldel             "delete from bild";
        
    $resdel             $SQLsrv->execute_sqlsrv$sqldel );

        foreach(
    $res as $value)
        {
            
    $blobkey        $value['blobkey'];
            
    $kennung        $value['Kennung'];
            
    $bild           $value['Bild'];
            
    $ordnung        $value['Ordnung'];
            
    $beschreibung   $value['Beschreibung'];
            
    $zusatz         $value['Zusatz'];
            
    $dateiname      $value['Dateiname'];
            
    $kennzeichen1   $value['Kennzeichen1'];

            
    $sqlinto        "INSERT INTO Bild
                              (blobkey, Kennung, Bild, Ordnung, Beschreibung, Zusatz, Dateiname, Kennzeichen1)
                                values
                              ('
    $blobkey', '$kennung', '$bild', '$ordnung', '$beschreibung', '$zusatz', '$dateiname', '$kennzeichen1')";
            
    $sqlinto '<br>';
            
    $resinto        $SQLsrv->execute_sqlsrv($sqlinto);
        }

    Die variable $database bestimmt in welche DB das Bild gespeichert werden soll.
    Leider funktioniert es nicht.

    Meldung: An error occurred translating the query string to UTF-16: No mapping for the Unicode character exists in the target multi-byte code page.

    Was mache ich falsch?

    Gruß

    Leave a comment:


  • Christian Marquardt
    replied
    http://stackoverflow.com/questions/2...lob-from-mysql

    Leave a comment:

Working...
X