PHP 8.4.2 Released!

odbc_binmode

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

odbc_binmodeОбрабатывает данные двоичного столбца

Описание

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

Функция управляет обработкой данных двоичного столбца. На ODBC-серверах функция затрагивает следующие типы SQL-данных: BINARY, VARBINARY и LONGVARBINARY. Режим по умолчанию устанавливают через директиву uodbc.defaultbinmode, которая содержится в файле php.ini.

Когда двоичные SQL-данные преобразовываются в символьные C-данные (ODBC_BINMODE_CONVERT), каждый байт (8 битов) исходных данных представляется парой символов в кодировке ASCII. Эти символы формируют символьное представление числа в формате ASCII в шестнадцатеричной форме. Например, двоичное число 00000001 преобразовывается в символьное представление "01", а число 11111111 — в "FF".

Хотя обработка столбцов с типами BINARY и VARBINARY зависит только от директивы binmode, обработка столбцов с типом LONGVARBINARY также зависит от атрибута longreadlen:

Обработка данных с типом LONGVARBINARY
Режим директивы binmode Значение атрибута longreadlen Результат
ODBC_BINMODE_PASSTHRU 0 Сквозной сеанс
ODBC_BINMODE_RETURN 0 Сквозной сеанс
ODBC_BINMODE_CONVERT 0 Сквозной сеанс
ODBC_BINMODE_PASSTHRU >0 Сквозной сеанс
ODBC_BINMODE_RETURN >0 Данные возвращаются как есть
ODBC_BINMODE_CONVERT >0 Данные возвращаются как char

В сквозном режиме функция odbc_fetch_into() возвращает из столбцов с двоичными данными пустую строку. При установке сквозного режима и вызове функции odbc_result() данные отправляются непосредственно клиенту, выводятся.

Список параметров

statement

Объект ODBC с результатом.

mode

Возможные значения параметра mode:

  • ODBC_BINMODE_PASSTHRU: Устанавливает сквозной режим для данных с типом BINARY
  • ODBC_BINMODE_RETURN: Данные возвращаются как есть
  • ODBC_BINMODE_CONVERT: Перед возвратом данные преобразовываются в тип char

Замечание: На обработку столбцов с типом двоичных данных LONG также влияет функция odbc_longreadlen().

Возвращаемые значения

Функция возвращает логическое значение true.

Список изменений

Версия Описание
8.4.0 Параметр statement теперь ожидает экземпляр с результом OBDC-запроса Odbc\Result; раньше ожидался аргумент с типом resource.
Добавить

Примечания пользователей 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
18 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
21 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
-1
bortuzar
15 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