PHP: Hypertext Preprocessor (original) (raw)
odbc_binmode
(PHP 4, PHP 5, PHP 7, PHP 8)
odbc_binmode — Handling of binary column data
Description
odbc_binmode(Odbc\Result $statement
, int $mode
): true
When binary SQL data is converted to character C data ([ODBC_BINMODE_CONVERT](uodbc.constants.php#constant.odbc-binmode-convert)
), 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 binary00000001
is converted to"01"
and a binary 11111111
is converted to "FF"
.
While the handling of BINARY
and VARBINARY
columns only depend on the binmode, the handling of LONGVARBINARY
columns also depends on the longreadlen as well:
LONGVARBINARY handling
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_RETURN | >0 | return as is |
ODBC_BINMODE_CONVERT | >0 | return as char |
If odbc_fetch_into() is used, passthru means that an empty string is returned for these columns. If odbc_result() is used, passthru means that the data are sent directly to the client (i.e. printed).
Return Values
Always returns [true](reserved.constants.php#constant.true)
.
Changelog
Version | Description |
---|---|
8.4.0 | statement expects an Odbc\Result instance now; previously, a resource was expected. |
Found A Problem?
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:
immediately before your main query, in mizmerize's code. That should override the default setting.
`
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).
result=odbcexec(result=odbc_exec(result=odbcexec(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 mFValue=odbcresult(m_FValue=odbc_result(mFValue=odbcresult(result, 1); } ?>...after 48 hours of scratching I finally made a work around, but by using a function in the bin2hex() function documentation...
len=strlen(len = strlen(len=strlen(data); return pack("H" . len,len, len,data); } $connH=odbc_pconnect("ImageDB","sa","",SQL_CUR_USE_IF_NEEDED) or die(odbc_errormsg()); result=odbcexec(result=odbc_exec(result=odbcexec(connH, "SELECT Emp_Image FROM tblEmployeePics WHERE Emp_Id=547"); if ($result) { odbc_longreadlen($result, 131072); odbc_binmode($result,ODBC_BINMODE_CONVERT); mFValue=odbcresult(m_FValue=odbc_result(mFValue=odbcresult(result, 1); out=hex2bin(out=hex2bin(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...
`
andrea dot galli at acotel dot com ¶
22 years ago
`Example: retrieve image from database.
QueryID=odbcexec(Query_ID = odbc_exec(QueryID=odbcexec(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;?>`
16 years ago
`I set the odbc_longreadlen() at the beggining of my script so nText field types dont get truncated, like this:
`