最近用 PHP 開發某個 service 介面,來貼個心得。
這個 service 介面允許呼叫者使用 HTTP POST 欄位與 JSON 兩種方式傳進變數,處理儲存在 MySQL 資料庫裡面的資料,並以 JSON 作為輸出資料的格式。
為了避免被鑽漏洞,以及排除錯誤的資料,這個系統必須檢查每一個傳進來的參數是否正確。
但某些資料表的 ROW_ID 是 unsigned BIGINT,我必須另外考慮 32-bit 與 64-bit 平台的差異。
因為 PHP 的 intval 有這段說明:
The maximum value depends on the system. 32 bit systems have a maximum signed integer range of -2147483648 to 2147483647. So for example on such a system, intval(‘1000000000000’) will return 2147483647. The maximum signed integer value for 64 bit systems is 9223372036854775807.
所以,PHP 的 intval 是不能用的。
於是,我就動起了 BC Math 的歪腦筋。
由於 SQL statement 是字串,我不需要顧慮變數型態,可以直接把原本檢查 ROW_ID 的這段 code:
$Id = intval( $Input['id'] );
if ( empty($Id) ) {
// Output error message
exit();
}
改成這樣:
$Id = bcadd( "{$Input['id']}", "0" );
if ( empty($Id) ) {
// Output error message
exit();
}
PS 1. 傳入負值不用管,因為 ROW_ID 已經 unsigned 了,不會有影響。
PS 2. ROW_ID 的輸出也可以不用管,因為 query 出來的資料型態都是 string。
11 月 19 2010
[PHP] BC Math 的妙用
最近用 PHP 開發某個 service 介面,來貼個心得。
這個 service 介面允許呼叫者使用 HTTP POST 欄位與 JSON 兩種方式傳進變數,處理儲存在 MySQL 資料庫裡面的資料,並以 JSON 作為輸出資料的格式。
為了避免被鑽漏洞,以及排除錯誤的資料,這個系統必須檢查每一個傳進來的參數是否正確。
但某些資料表的 ROW_ID 是 unsigned BIGINT,我必須另外考慮 32-bit 與 64-bit 平台的差異。
因為 PHP 的 intval 有這段說明:
所以,PHP 的 intval 是不能用的。
於是,我就動起了 BC Math 的歪腦筋。
由於 SQL statement 是字串,我不需要顧慮變數型態,可以直接把原本檢查 ROW_ID 的這段 code:
改成這樣:
PS 1. 傳入負值不用管,因為 ROW_ID 已經 unsigned 了,不會有影響。
PS 2. ROW_ID 的輸出也可以不用管,因為 query 出來的資料型態都是 string。
By Joe Horn • PHP 0 • Tags: JSON, MC Math, PHP