PHP Doku:: Die Behandlung von Binärdaten - function.odbc-binmode.html

Verlauf / Chronik / History: (44) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzDatenbankerweiterungenAbstraktionsebenenODBC (Unified)ODBC Funktionenodbc_binmode

Ein Service von Reinhard Neidl - Webprogrammierung.

ODBC Funktionen

<<odbc_autocommit

odbc_close_all>>

odbc_binmode

(PHP 4, PHP 5)

odbc_binmodeDie Behandlung von Binärdaten

Beschreibung

int odbc_binmode ( int $result_id , int $mode )

(Betrifft die ODBC SQL Typen: BINARY, VARBINARY und LONGVARBINARY)

  • ODBC_BINMODE_PASSTHRU: gibt Binärdaten direkt zum Output durch
  • ODBC_BINMODE_RETURN: liefert die Binärdaten unverändert zurück
  • ODBC_BINMODE_CONVERT: konvertiert die Binärdaten zu Zeichen und liefere sie zurück

Im ODBC_BINMODE_CONVERT werden die Binärdaten zu Character-C-data gewandelt. Jedes Byte (8 Bits) der ursprünglichen Daten wird zu zwei ASCII-Zeichen, die der hexadezimalen Darstellung des Wertes entsprechen. Der Binärwert 00000001 wird zum Beispiel zu "01" gewandelt, der Binärwert 11111111 zu "FF".
Die Benutzung von LONGVARBINARY
binmode longreadlen Resultat
ODBC_BINMODE_PASSTHRU 0 Direkte Ausgabe
ODBC_BINMODE_RETURN 0 Direkte Ausgabe
ODBC_BINMODE_CONVERT 0 Direkte Ausgabe
ODBC_BINMODE_PASSTHRU 0 Direkte Ausgabe
ODBC_BINMODE_PASSTHRU >0 Direkte Ausgabe
ODBC_BINMODE_RETURN >0 Direkte Ausgabe
ODBC_BINMODE_CONVERT >0 Rückgabe als CHAR-Werte

Wenn odbc_fetch_into() genutzt wird, wird bei direkter Ausgabe ein leerer String als Spaltenwert zurückgeliefert.

Wenn result_id gleich 0 ist, wird die Einstellung als Defaultwert für die nächsten Transaktionen gesetzt.

Hinweis: Der Defahltwert für longreadlen ist 4096, für odbc_binmode() ODBC_BINMODE_RETURN, also die unveränderte Rückgabe. Das Verhalten von LONGVARBINARY wird ebenfalls durch die Funktion odbc_longreadlen() bestimmt.


4 BenutzerBeiträge:
- Beiträge aktualisieren...
yhalmoe at yahoo dot no
14.12.2009 17:45
For Sybase users (this probably applies to MS-SQL Server as well) who are using ODBC:

I was using the same code as mizmerize, but I was getting truncated data back from the server (at the 32kb mark) when selecting data with the image datatype. My Sybase server has a @@textsize property of 2Gb, which should be plenty. But apparently, the php ODBC driver resets this to 32Kb when a connection is made, and then sets it back to 2Gb after. The solution is to do a query:

<?php odbc_exec($connH, "set textsize 131072"); ?>

immediately before your main query, in mizmerize's code. That should override the default setting.
bortuzar
12.02.2009 16:28
I set the odbc_longreadlen() at the beggining of my script so nText field types dont get truncated, like this:

<?php odbc_longreadlen (0, 1000000); ?>
mizmerize at yahoo dot com
11.01.2006 3:59
I am currently using an SQL Server 2000 used as a datasource for ODBC access, Testing PHP scripts from an Apache 2 server running on Windows 2000.

I was trying to get an image from the database using ODBC but the output always flushes automatically while I was just getting the result using odbc_result() function.

With this code, the picture automatically prints to the browser as soon as I hit odbc_result() (probably a bug, but bug reports aren't that easy to do).

<?php
  $connH
=odbc_pconnect("ImageDB","sa","",SQL_CUR_USE_IF_NEEDED) or die(odbc_errormsg());
   
$result=odbc_exec($connH, "SELECT Emp_Image FROM tblEmployeePics WHERE Emp_Id=547");
    if (
$result) {                           
       
odbc_longreadlen($result, 131072);       
       
odbc_binmode($result,ODBC_BINMODE_PASSTHRU);                           
//upon calling this, the output flushes out to the browser... made me scratch       
$m_FValue=odbc_result($result, 1);
}
?>

...after 48 hours of scratching I finally made a work around, but by using a function in the bin2hex() function documentation...

<?php
     
function hex2bin($data){
      
$len = strlen($data);
       return
pack("H" . $len, $data);
    }

   
   
$connH=odbc_pconnect("ImageDB","sa","",SQL_CUR_USE_IF_NEEDED) or die(odbc_errormsg());
   
$result=odbc_exec($connH, "SELECT Emp_Image FROM tblEmployeePics WHERE Emp_Id=547");
    if (
$result) {                           
       
odbc_longreadlen($result, 131072);       
       
odbc_binmode($result,ODBC_BINMODE_CONVERT);                           
       
$m_FValue=odbc_result($result, 1);
       
$out=hex2bin($m_FValue);
    }
?>

The trick was to convert the output into hex by changing odbc_binmode to  ODBC_BINMODE_CONVERT and using a handy function to convert it back to binary in order to facilitate manipulation of its size, depth etc...
andrea dot galli at acotel dot com
28.04.2003 17:27
Example: retrieve image from database.

<?php

   $Link_ID
= odbc_connect("DSN", "user", "pass");
  
$Query_ID = odbc_exec($Link_ID, "SELECT picture FROM categories");

  
// change to ODBC_BINMODE_CONVERT for comparison

  
odbc_binmode($Query_ID, ODBC_BINMODE_RETURN);

  
$Images = odbc_result($Query_ID, 1);

   echo
$Images;

?>



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)