PHP Conference Japan 2024

odbc_longreadlen

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

odbc_longreadlen處理 LONG 資料欄

說明

odbc_longreadlen(Odbc\Result $statement, int $length): true

控制 `LONG`、`LONGVARCHAR` 和 `LONGVARBINARY` 欄位的處理方式。預設長度可以使用 php.ini 指令 uodbc.defaultlrl 設定。

參數

statement

ODBC 結果物件。

length

返回 PHP 的位元組數由參數 length 控制。如果設定為 `0`,則使用 odbc_result() 擷取時,長欄位資料會直接傳遞到客戶端(即印出)。

返回值

永遠返回 true

更新日誌

版本 說明
8.4.0 statement 現在需要一個 Odbc\Result 實例;以前需要一個 resource

注意事項

注意:

`LONGVARBINARY` 欄位的處理方式也會受到 odbc_binmode() 的影響。

新增備註

使用者貢獻的備註 6 則備註

php dot net dot notes at webqs dot com
19 年前


如果您在透過 ODBC 將 PHP 與 MS SQL 一起使用時遇到資料截斷和/或編碼異常的問題,請嘗試將 odbc.defaultlrl(在 php.ini 中或透過 ini_set())設定為一個較大的數字,例如 65536,如此處其他備註所述。
訣竅是知道您的資料將會有多長,因此您可能需要提供一些額外的空間。不幸的是,您必須在切割字串之前知道它的長度。

這樣做將允許您的應用程式一次讀取最多此數量。我相信這種行為背後一定有原因,但在 5 年的 MySQL 和 Postgres 開發過程中,我從未遇到過類似的情況。

如果您仍然遇到問題,並且在表格的長欄位中使用 Unicode 資料,請確保其類型設定為「ntext」,如果它是「text」。MSDN 有一些關於 Unicode 資料類型的資訊。
這讓我頭痛了大約 3 天,「二進位」資料導致瀏覽器崩潰和循環結果集(即在 odbc.defaultlrl 位元組後重複資料)。

這個解決方案是透過不斷嘗試才找到的。

希望有幫助
Eion Robb
8 年前
這裡的備註中沒有提到,但 odbc_longreadlen($result, 0); 只會影響 odbc_result() 的輸出。將讀取長度設定為 0(或小於零)只會在 odbc_fetch_object()、odbc_fetch_array() 和 odbc_result_all() 函數中輸出空白字串。
egil at wp dot pl
15 年前
我嘗試使用第一個評論中的建議,但實際上並沒有像我預期的那樣工作... 我想獲取所有數據,無論它有多大,但發生了奇怪的事情,我終於找到了這個解決方案(至少適用於 MS SQL 2000 至少幾 MB 的二進制數據)

<?php
// 連線
$link = odbc_connect($odbc_source_name, $user, $pass);

// 查詢 (注意 - 此範例中只有一列)
$sql = 'SELECT image_data_column FROM some_table WHERE record_id=1';

// 執行
$result = odbc_exec ($link, $sql);
if (!
$result)
{
trigger_error ('[sql] 執行: '.$sql, E_USER_ERROR);
}

// 擷取設定
odbc_binmode ($result, ODBC_BINMODE_PASSTHRU);
odbc_longreadlen ($result, 0);

// 取得內容
ob_start(); // 如果預期有多列,可能需要將此程式碼移到 if 敘述內
while (odbc_fetch_row($result))
{
odbc_result($result, 1); // 這實際上會輸出 image_data_column 的所有內容
}
odbc_free_result($result);
$contents = ob_get_clean();
?>
jdcard at inreach dot com
19 年前
我正在從 MSAccess 的 MEMO 欄位(長字串)讀取資料,但資料總是截斷在 255 個字元。我嘗試了所有我能想到的 odbc_longreadlen() 和 odbc_binmode()(以及 odbc.defaultlrl)的組合,但都沒有解決問題。

唯一有效的解決方法是將我的查詢從「SELECT Field1, Field2 FROM TableName」修改為「SELECT * FROM TableName」。

我懷疑您可以強制轉換欄位類型以強制使用適當的資料類型,但在經過三天的努力終於成功之後,我甚至沒有嘗試。
匿名
22 年前
另一種方法是調整您的 php.ini 檔案並設定
odbc.defaultlrl=65536
或其他足夠大的值。
lrl = 長讀取長度 (long read length)
jasendorf at lcounty dot com
23 年前
我花了很長時間才弄清楚如何使用這個函式。以下是我找到的 Jason Lee 的一小段程式碼,它可能會幫助其他人...

$cur = odbc_exec($cnx, $query);
if(!$cur) {
/* 錯誤處理程式 */
}

odbc_binmode($cur, ODBC_BINMODE_PASSTHRU);
odbc_longreadlen($cur, 16384); /* 允許 16kb 通過 */

while(odbc_fetch_row($cur)) {
$bigger_than_4096_var = odbc_result($cur, 1);
/* 等等... */

} 希望這能幫助到一些人,John
To Top