2024 年 PHP Conference Japan

odbc_binmode

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

odbc_binmode二進位欄位資料的處理

說明

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

控制二進位欄位資料的處理方式。受影響的 ODBC SQL 類型為 BINARYVARBINARYLONGVARBINARY。可以使用 uodbc.defaultbinmode php.ini 指令設定預設模式。

當二進位 SQL 資料轉換為字元 C 資料(ODBC_BINMODE_CONVERT)時,來源資料的每個位元組(8 位元)會以兩個 ASCII 字元表示。這些字元是以十六進位形式表示數字的 ASCII 字元。例如,二進位 00000001 會轉換為 "01",而二進位 11111111 會轉換為 "FF"

雖然 BINARYVARBINARY 欄位的處理方式僅取決於 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 以字元形式返回

如果使用 odbc_fetch_into(),直接傳遞表示這些欄位會返回空字串。如果使用 odbc_result(),直接傳遞表示資料會直接傳送到用戶端(即印出)。

參數

statement

ODBC 結果物件。

mode

mode 的可能值如下:

注意二進位長欄位的處理方式也會受到 odbc_longreadlen() 的影響。

返回值

永遠返回 true

更新日誌

版本 說明
8.4.0 statement 現在需要 Odbc\Result 實例;以前需要 資源
新增註記

使用者貢獻的註記 4 則註記

yhalmoe at yahoo dot no
14 年前
給使用 ODBC 的 Sybase 使用者(這可能也適用於 MS-SQL Server)

我使用了與 mizmerize 相同的程式碼,但在選取 image 資料類型的資料時,我從伺服器取回的資料被截斷了(在 32kb 標記處)。我的 Sybase 伺服器具有 2Gb 的 @@textsize 屬性,這應該很充足了。但顯然,PHP ODBC 驅動程式在建立連線時將其重置為 32Kb,然後在之後將其設回 2Gb。解決方案是在您的主要查詢之前立即執行查詢

<?php odbc_exec($connH, "set textsize 131072"); ?>

在 mizmerize 的程式碼中。這應該會覆寫預設設定。
mizmerize at yahoo dot com
18 年前
我目前使用 SQL Server 2000 作為 ODBC 存取的資料來源,並在 Windows 2000 上執行的 Apache 2 伺服器上測試 PHP 腳本。

我嘗試使用 ODBC 從資料庫中取得影像,但當我使用 odbc_result() 函式取得結果時,輸出總是會自動清除。

使用以下程式碼,當我呼叫 odbc_result() 時,圖片會立即自動輸出到瀏覽器(可能是個錯誤,但回報錯誤並不容易)。

<?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);
//呼叫這個函式後,輸出會立即清除到瀏覽器... 讓我百思不得其解
$m_FValue=odbc_result($result, 1);
}
?>

...經過 48 小時的苦思,我終於找到了一個解決方法,是透過使用 bin2hex() 函式文件中的另一個函式...

<?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);
}
?>

訣竅是將 odbc_binmode 改為 ODBC_BINMODE_CONVERT,將輸出轉換為十六進位制,然後使用一個方便的函式將其轉換回二進位制,以便於操作其大小、深度等...
andrea dot galli at acotel dot com
21 年前
範例:從資料庫擷取圖片。

<?php

$Link_ID
= odbc_connect("DSN", "user", "pass");
$Query_ID = odbc_exec($Link_ID, "SELECT picture FROM categories");

// 若要比較,請改成 ODBC_BINMODE_CONVERT

odbc_binmode($Query_ID, ODBC_BINMODE_RETURN);

$Images = odbc_result($Query_ID, 1);

echo
$Images;

?>
bortuzar
15 年前
我在腳本開頭設定了 odbc_longreadlen(),這樣 nText 欄位類型就不會被截斷,如下所示:

<?php odbc_longreadlen (0, 1000000); ?>
To Top