在日常使用PHP 進行數據庫操作時,我們經常需要對查詢結果進行類型驗證,特別是在需要處理精確數值邏輯或做類型判斷的場景中。雖然PHP 是一種弱類型語言,但這並不意味著我們可以忽略數據類型的控制。本文將重點介紹如何使用is_integer()函數來驗證從數據庫查詢結果中提取的數據是否為整數類型,並探討其常見的陷阱與正確用法。
is_integer()是PHP 內置的類型檢測函數,用於判斷一個變量是否為整數類型( int )。其語法非常簡單:
is_integer(mixed $value): bool
當傳入的變量為整數時,返回true ,否則返回false 。這個函數與is_int()完全等價,它們是彼此的別名。
$number = 10;
if (is_integer($number)) {
echo "這是一個整數";
} else {
echo "這不是一個整數";
}
輸出結果將是:
這是一個整數
數據庫(如MySQL)中即便定義某個字段為INT類型,PHP 在通過PDO 或mysqli 執行查詢時,默認會將結果以字符串返回。這意味著即使數據庫中的值是整數,在PHP 中獲取的值卻可能是字符串類型。
例如:
// 假設 users 表中 id 字段是 INT 類型
$stmt = $pdo->query("SELECT id FROM users WHERE id = 1");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($row['id']);
var_dump(is_integer($row['id']));
輸出結果可能是:
string(1) "1"
bool(false)
這說明雖然數據庫中的id是整數,PHP 獲取到的卻是字符串"1" , is_integer()判斷結果為false 。
為了讓is_integer()能夠正確判斷,我們需要在獲取數據時或之後進行類型轉換。
$id = (int)$row['id'];
if (is_integer($id)) {
echo "id 是一個整數";
}
這種方式簡單直觀,適合在數據量較小或可控的場景中使用。
PDO 支持在查詢時返回不同的數據類型。可以通過PDOStatement::fetch()方法的第二個參數使用PDO::FETCH_NUM配合PDO::ATTR_EMULATE_PREPARES => false ,盡量讓PDO 自動轉換類型,但這在實際使用中依然不如手動強制轉換可靠。
以下是一個基於實際應用場景的例子,判斷用戶輸入的ID 是否與數據庫中的ID 匹配,並且都是整數:
// 用戶輸入
$userInput = $_GET['id'] ?? null;
if (!is_numeric($userInput)) {
exit("非法 ID");
}
// 查詢數據庫
$stmt = $pdo->prepare("SELECT id FROM users WHERE id = ?");
$stmt->execute([$userInput]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row && is_integer((int)$row['id'])) {
echo "數據庫中存在該整數 ID";
} else {
echo "未找到對應 ID 或類型错误";
}
在一些接口設計中,我們可能需要從URL 獲取參數並判斷其是否為整數。比如用戶通過以下URL 訪問:
https://gitbox.net/get-user.php?id=42
在處理這類請求時,也可以結合is_integer()來驗證參數:
$id = $_GET['id'] ?? null;
if (is_numeric($id) && is_integer((int)$id)) {
$id = (int)$id;
// 接下來進行數據庫操作
} else {
echo "非法參數";
}
is_integer()在驗證數據類型時是非常有用的工具,尤其在需要確保數據為純整數的業務邏輯中。然而,由於PHP 從數據庫中默認以字符串返回數值字段,因此在使用前通常需要手動進行類型轉換。理解這一機制,並結合實際業務場景正確使用is_integer() ,可以有效提升程序的健壯性和數據準確性。