odbc_binmode

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_binmodeModifica la gestión de columnas de datos binarios

Descripción

odbc_binmode(Odbc\Result $statement, int $mode): true

odbc_binmode() controla la gestión de las columnas de datos binarios. Los tipos ODBC SQL afectados son BINARY, VARBINARY y LONGVARBINARY. El modo predeterminado puede definirse utilizando la directiva php.ini uodbc.defaultbinmode

Cuando un dato SQL se convierte en carácter C, (ODBC_BINMODE_CONVERT) los 8 bits del carácter fuente se representan por dos caracteres ASCII. Estos caracteres son representaciones ASCII de los números en formato hexadecimal. Por ejemplo, el binario 00000001 se convierte en "01" y el binario 11111111 se convierte en "FF".

Mientras que la gestión de las columnas BINARY y VARBINARY depende únicamente del binmode, la gestión de las columnas LONGVARBINARY depende también de longreadlen, como se muestra a continuación:

Conversión de LONGVARBINARY
Modo Longitud Resultado
ODBC_BINMODE_PASSTHRU 0 passthru
ODBC_BINMODE_RETURN 0 passthru
ODBC_BINMODE_CONVERT 0 passthru
ODBC_BINMODE_PASSTHRU >0 passthru
ODBC_BINMODE_RETURN >0 Tal cual
ODBC_BINMODE_CONVERT >0 Carácter

Si se utiliza odbc_fetch_into(), passthru significa que se devolverá una cadena vacía para estas columnas. Si se utiliza la función odbc_result(), passthru significa que los datos se envían directamente al cliente (es decir, se imprimen).

Parámetros

statement

The ODBC result object.

mode

Valores posibles para el parámetro mode:

Nota: La gestión de columnas de tipo binary long también se ve afectada por la función odbc_longreadlen().

Valores devueltos

Siempre devuelve true.

Historial de cambios

Versión Descripción
8.4.0 statement expects an Odbc\Result instance now; previously, a resource was expected.
add a note

User Contributed Notes 4 notes

up
1
yhalmoe at yahoo dot no
15 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
mizmerize at yahoo dot com
19 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
22 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;

?>
up
-2
bortuzar
16 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); ?>
To Top