• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • odbc_binmode()

    (PHP 4, PHP 5, PHP 7)

    Handling of binary column data

    说明

    odbc_binmode(resource $result_id,int $mode): bool

    Enables handling of binary column data. ODBC SQL types affected areBINARY,VARBINARY, andLONGVARBINARY.

    When binary SQL data is converted to character C data, each byte(8 bits)of source data is represented as two ASCII characters. These characters are the ASCII character representation of the number in its hexadecimal form. For example, a binary00000001is converted to"01"and a binary11111111is converted to"FF".

    LONGVARBINARY handling
    binmodelongreadlenresult
    ODBC_BINMODE_PASSTHRU0passthru
    ODBC_BINMODE_RETURN0passthru
    ODBC_BINMODE_CONVERT0passthru
    ODBC_BINMODE_PASSTHRU0passthru
    ODBC_BINMODE_PASSTHRU>0passthru
    ODBC_BINMODE_RETURN>0return as is
    ODBC_BINMODE_CONVERT>0return as char

    If odbc_fetch_into() is used, passthru means that an empty string is returned for these columns.

    参数

    $result_id

    The result identifier.

    If$result_idis0, the settings apply as default for new results.

    Note: Default forlongreadlenis4096and$modedefaults toODBC_BINMODE_RETURN. Handling of binary long columns is also affected by odbc_longreadlen().

    $mode

    Possible values for$modeare:

    • ODBC_BINMODE_PASSTHRU: Passthru BINARY data
    • ODBC_BINMODE_RETURN: Return as is
    • ODBC_BINMODE_CONVERT: Convert to char and return

    返回值

    成功时返回TRUE,或者在失败时返回FALSE

    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.
    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...
    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;
    ?>
    
    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); ?>