SfondoImpossibile recuperare i dati varbinary da MSSQL
Ambiente di sviluppo:
PHP 7.0.3 con Apache 2.4.16 su Windows 10 x 64
SQL Server 2014 standard
Il sever ha FileStream abilitato su colonne di file corrispondenti.
provato ad installare sqlsvr
driver, ma non riuscito a causa della mancanza di supporto per PHP7
SQL server di accesso da ODBC utilizzando il driver Codice SQL Server
PHP per inserire i dati delle immagini in MSSQL
$link = @new \PDO("odbc:Driver={SQL Server};Server=$server;Database=$db", $user, $password);
$stmt = $link->prepare("INSERT INTO [Attachment] (AttID, Seq , ModuleCde, AppID, StaffID , FileName , [File]) VALUES (NEWID() , ? , ? , ? , ? , ? , ?)");
$stmt->bindValue(1,$_POST["Seq"],PDO::PARAM_INT);
$stmt->bindValue(2,$_POST["ModuleCde"],PDO::PARAM_STR);
$stmt->bindValue(3,$_POST["AppID"],PDO::PARAM_STR);
$stmt->bindValue(4,$_SESSION["StaffID"],PDO::PARAM_STR);
$stmt->bindValue(5,$_FILES["file"]["name"][$_POST["Seq"]],PDO::PARAM_STR);
$stmt->bindValue(6,file_get_contents($_FILES["file"]["tmp_name"][$_POST["Seq"]]),PDO::PARAM_STR);
$stmt->execute();
Codice PHP per salvare i dati delle immagini da MSSQL
$link = @new \PDO("odbc:Driver={SQL Server};Server=$server;Database=$db", $user, $password);
$stmt = $link->prepare("SELECT DATALENGTH([File]) AS [Size] , CONVERT(NVARCHAR(MAX),[File],2) AS [File] FROM [Attachment] WHERE [ModuleCde] = ? AND [AppID] = ? AND [Seq] = ? AND [StaffID] = ?");
$stmt->bindValue(1,$_GET["ModuleCde"],PDO::PARAM_STR);
$stmt->bindValue(2,$_GET["AppID"],PDO::PARAM_STR);
$stmt->bindValue(3,$_GET["Seq"],PDO::PARAM_STR);
$stmt->bindValue(4,$_SESSION["StaffID"],PDO::PARAM_STR);
$stmt->execute();
$stmt->bindColumn(2,$img,PDO::PARAM_LOB, 0);
$stmt->fetch(PDO::FETCH_ASSOC);
file_put_contents("file" , $img);
Il file viene caricato correttamente nel server SQL. Aprire la directory DATA
di SQL Server, tutti i file caricati e può essere aperta da Paint.
Ma il recupero del file dal codice di salvataggio dell'immagine precedente è danneggiato. Nel file mancano alcuni byte dall'originale.
Metodo cercato
fwrite(fopen("file","w+") , strtolower("0x".str_replace("\0","",$img)));
e anche il metodo indicato in questo collegamento.
Php with MSSQL display raw data from varbinary field
Ma entrambi non hanno fortuna, il file sembra anche essere danneggiato.
Qualsiasi aiuto è apprezzato.
Modifica 2016-02-25
Modificato l'istruzione SQL come il seguente, ma il file di output è ancora danneggiato.
$link->prepare("SELECT DATALENGTH([File]) AS [Size] , [File] FROM [Attachment] WHERE [ModuleCde] = ? AND [AppID] = ? AND [Seq] = ? AND [StaffID] = ?");
Ora sto cercando di cambiare diversi driver ODBC di SQL Server per vedere se il file può produrre con successo.
Modifica 2016-08-09
Con il driver MSSQL DOP aggiornato per PHP 7. Tutto ha funzionato di nuovo con un fascino.
Ora, non abbiamo più bisogno di convert
i dati varbinary utilizzando questo nuovo driver.
piangerò !! Ho avuto problemi con php pdo e dati varbinary provenienti da server mssql ... La tua risposta mi ha aiutato molto !! Posso inviare un e-abbraccio? : D Ora ... dove posso saperne di più su questo? Qual è il nome di questa "tecnica"? o qualcosa del genere, quindi posso google di più e ottenere più conoscenze – Frondor
Sono felice che questo ti aiuti. Questo non è un tipo di tecnica, ho appena raggiunto questa soluzione per tentativi ed errori. Da quando ho scoperto che ci sono alcune segnalazioni di bug riguardanti i driver php e ODBC, i driver non emettono dati Unicode validi. Temo che anche i dati di 'varbinary' saranno elaborati come Unicode, quindi ho provato a convertirlo in una stringa hex che non sarà interpretata in modo falso dal driver. Dopo averlo provato, restituisco correttamente una stringa esadecimale valida in PHP. Quindi converto questo gruppo di stringhe in un file. Questo è il trucco. – MiKeNeko
Quando abbiamo bloccato un tipo di dati, prova ad elaborarlo/codificarlo per renderlo testo normale. Questo è il trucco che ho fatto. – MiKeNeko