PHP Australia Conference 2015

odbc_binmode

(PHP 4, PHP 5)

odbc_binmodeManejo de información de columna binaria

Descripción

bool odbc_binmode ( resource $result_id , int $mode )

Habilita el manejo de información de columna binaria. Los tipos de SQL ODBC son BINARY, VARBINARY, y LONGVARBINARY.

Cuando se convierte informaicón SQL binaria a información C de carácter, cada byte (8 bits) de información fuente está representado como dos caractéres ASCII. Estos caracteres la representación de caracteres ASCII del número en su forma hexadecimal. Por ejemplo, el número binario 00000001 se convierte a "01" y 11111111 se convierte a "FF".

Manejo de LONGVARBINARY
binmode longreadlen result
ODBC_BINMODE_PASSTHRU 0 passthru
ODBC_BINMODE_RETURN 0 passthru
ODBC_BINMODE_CONVERT 0 passthru
ODBC_BINMODE_PASSTHRU 0 passthru
ODBC_BINMODE_PASSTHRU >0 passthru
ODBC_BINMODE_RETURN >0 devuelve como es
ODBC_BINMODE_CONVERT >0 devuelve como tipo char

Si se usa odbc_fetch_into(), passthru significa se devuelve una cadena vacía para esta columnas.

Parámetros

result_id

El identificador de resultado.

Si result_id es 0, las configuraciones se aplican por defecto para los nuevos resultados.

Nota: longreadlen por defecto es 4096 y mode por defecto es ODBC_BINMODE_RETURN. El manejo de columnas binarias de tipo long también está afectado por odbc_longreadlen().

mode

Los valores posibles para mode son:

  • ODBC_BINMODE_PASSTHRU: Realiza passthru en daots BINARY
  • ODBC_BINMODE_RETURN: Devuelve como es
  • ODBC_BINMODE_CONVERT: Covierte a tipo char y devuelve

Valores devueltos

Devuelve TRUE en caso de éxito o FALSE en caso de error.

add a note add a note

User Contributed Notes 4 notes

up
1
yhalmoe at yahoo dot no
4 years ago
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.
up
0
bortuzar
5 years ago
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); ?>
up
0
mizmerize at yahoo dot com
8 years ago
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...
up
0
andrea dot galli at acotel dot com
11 years ago
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;

?>
To Top