odbc_binmode
(PHP 4, PHP 5, PHP 7, PHP 8)
odbc_binmode — バイナリカラムデータを処理する
説明
バイナリカラムデータを処理する方法を制御します。
(関係するODBC SQL型: BINARY
, VARBINARY
, LONGVARBINARY
)。
デフォルトの処理モードは、php.ini の
uodbc.defaultbinmode 経由で設定できます。
バイナリ SQL データが文字データに変換される時 (ODBC_BINMODE_CONVERT
)、ソースデータの
各バイト (8 ビット) は、2 つのアスキー文字で表現されます。
これらの文字は、16 進表現で数値をアスキー文字で表現したものです。
例えば、2 進数 00000001
は "01"
に変換され、
11111111
は "FF"
に変換されます。
BINARY
と VARBINARY
型のカラムを処理する方法は
binmode によって決まります。LONGVARBINARY
型のカラムを処理する方法は、
longreadlen にも依存します:
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
-
結果 ID。
statement
に0
を指定した場合、 ここで設定した値は、新規の結果に関するデフォルト値として用いられます。 mode
-
mode
には、以下の値が指定できます。-
ODBC_BINMODE_PASSTHRU
: BINARY データとして通過 -
ODBC_BINMODE_RETURN
: そのまま返す -
ODBC_BINMODE_CONVERT
: char に変換し返す
注意: LONGVARBINARY 型のカラムを処理する方法は odbc_longreadlen() によっても影響を受けます。
-
戻り値
常に true
を返します。
User Contributed Notes 4 notes
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;
?>