【PHP】4種判斷變數或陣列是否存在的方法

【PHP】4種判斷變數或陣列是否存在的方法

本篇重點

  • 使用 empty()、is_null()、isset() 或是直接使用if ($variable) 判斷式來判斷變數或陣列是否存在
  • 資料檢查甚麼時候會有錯誤訊息(php error)

在開發動態網頁時,後端程式扮演了一個重要的角色,可能會處理來自前端程式的資料,也有可能處理來自資料庫的資料,在這種情況下,我們必須嚴謹地檢查數據的完整性,以確保後續的程式能夠順暢運行。那麼有哪些函數能夠進行這樣的檢查?

首先先了解各種類型的判斷,判斷的類型有

  • 無效值(null)
  • 布林值(boolean)
  • 字串(string)
  • 數值(integer)
  • 陣列(array)

判斷差異表

比較不同的function在各種情況下的判斷

型態if ($x)empty()isset()is_null()
$x = nullnullfalsetruefalsetrue
$x is undefinednullfalsetruefalsetrue
$x = truebooleantruefalsetruefalse
$x = falsebooleanfalsetruetruefalse
$x = ‘’stringfalsetruetruefalse
$x = ‘1’stringtruefalsetruefalse
$x = ‘0’stringfalsetruetruefalse
$x = ‘-1’stringtruefalsetruefalse
$x = ‘hello’stringtruefalsetruefalse
$x = ‘true’stringtruefalsetruefalse
$x = ‘false’stringtruefalsetruefalse
$x = 1integertruefalsetruefalse
$x = 0integerfalsetruetruefalse
$x = -1integertruefalsetruefalse
$x = 666integertruefalsetruefalse
$x = array()arrayfalsetruetruefalse
$x = array(‘a’, ‘b’)arraytruefalsetruefalse
  • if ($x)empty() 的判斷結果相反
  • isset()is_null() 的判斷結果相反

螢光標記是我覺得特別要注意的判斷結果

範例

  1. 用戶填寫表格資料並送出資料,這些資料會從前端傳到後端程式,此時我們需要驗證是否有填入資料或是資料是否正確
php
1
2
3
4
5
6
7
8
<?php
// 使用 isset() 搭配 intval() 確認是否有參數傳入且為大於 0 的數值
$age = isset($_POST['age']) && intval($_POST['age']) > 0 ? intval($_POST['age']) : 0;

// 初步整理 $age 值後,檢查是否需要返回前端重新填寫年齡
if ($age == 0) {
// 返回前端請用戶重新填寫年齡
}
  • 情境一,填寫年齡 30 傳入後端,isset() 為 true,且 intval() 後數值大於零,$age = 30 往下接續處理
  • 情境二,填寫年齡 0 傳入後端,isset() 為 true,但 intval() 後數值等於零,$age = 0 返回前端處理
  • 情境三,無填寫年齡傳入後端,isset() 為 false,$age = 0 返回前端處理

健忘筆記

? : 是一種條件運算符,稱為 三元運算符,可以用來做因果判斷

  1. 從資料庫撈取資料,並檢測是否有資料,如果為無資料需要做處理
  • 情境一,從資料庫撈取會員資訊,並取得完整資料
php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$user_data = array(
'name' => '小明',
'gender' => 'Male',
);

// 使用 if (!$user_data) 確認變數內是否有資料
if (!$user_data) {
// 無資料時的處理
}

// 結果:if (!$user_data) 判斷為 false,原本 if ($user_data) 為 true,但碰到驚嘆號反轉布林值結果,因此為 false 跳過判斷

// 使用 !is_array($user_data) 搭配 empty($user_data) 確認變數內是否有資料
if (!is_array($user_data) || empty($user_data)) {
// 無資料時的處理
}

// 結果:!is_array($user_data) 為 false,empty($user_data) 也為 false,因此跳過判斷
  • 情境二,從資料庫撈取會員資訊,但沒有撈到資料寫入空陣列
php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$user_data = array();

// 使用 if (!$user_data) 確認變數內是否有資料
if (!$user_data) {
// 無資料時的處理
}

// 結果:if (!$user_data) 判斷為 true 進入無資料處理

// 使用 !is_array($user_data) 搭配 empty($user_data) 確認變數內是否有資料
if (!is_array($user_data) || empty($user_data)) {
// 無資料時的處理
}

// 結果:!is_array($user_data)為 false,但 empty($user_data) 為 true,因此進入無資料處理
  • 情境三,從資料庫撈取會員資訊,但沒有撈到資料寫入字串
php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$user_data = 'no_data';

if (!$user_data) {
// 無資料時的處理
}

// 結果:if (!$user_data) 判斷為 false 跳過判斷

if (!is_array($user_data) || empty($user_data)) { // !is_array()為 true,因此進入無資料處理
// 無資料時的處理
}

// 結果:!is_array($user_data) 判斷為 true,因此進入無資料處理

健忘筆記

如果查找資料庫,沒有取得資料會寫入 array 以外的型態,那使用 !is_array($x) 搭配 empty() 來檢查資料會是更謹慎的做法

錯誤訊息

在進行資料完整性檢查時,要確保資料的完整性,但又不希望出現錯誤訊息,那麼應該採用哪種函數?

這四種驗證方式除了兩兩相反外,還有一個很重要的差異 “錯誤訊息” 也就是PHP error
當變數 $x 沒有被賦值時,使用 if ($x)is_null($x) 會引發錯誤訊息,但使用 isset($x)empty($x) 不會,不過這些錯誤屬於較輕微的 E_NOTICE 級別,所以在沒有開啟PHP的所有錯誤提示的情況下是不會對網頁造成影響,但還是應該盡量處理這些錯誤。

範例

  • 情境一,檢查陣列中不存在的索引
php
1
2
3
4
5
<?php
$a = [];

var_dump($a[1]); // NULL,錯誤訊息 Notice: Undefined offset: 1
var_dump(isset($a[1])); // bool(false),無錯誤訊息

$a 設定為一個空陣列,卻指定不存在的索引1,因此在 var_dump($a[1]) 的情況下會出現錯誤訊息

  • 情境二,判斷不存在的變數
php
1
2
3
4
<?php
// $b 沒有被賦值
var_dump(is_null($b)); // bool(true),Notice: Undefined variable: b
var_dump(empty($b)); // bool(true),無錯誤訊息

$b 沒有被賦值,因此在 is_null($b) 的情況下會出現錯誤訊息。

  • 情境三,有個陣列內的值需要做處理,但這個值不一定存在,如果不存在就不需要處理
php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
// 如果$user內沒有'age'
$user = array(
'name' => '小明'
);

if ($user['age']) {
$user['adult'] = ($user['age'] >= 18) ? true : false;
}

// 結果:出現錯誤訊息 Notice: Undefined index: age 並跳出判斷,'adult'沒有寫入資料

// 為了不跳出錯誤訊息且正常判斷,可以改成!empty($user['age'])
if (!empty($user['age'])) {
$user['adult'] = ($user['age'] >= 18) ? true : false;
}

// 結果:無錯誤訊息跳出判斷

// 如果$user內有'age'
$user = array(
'name' => '小明',
'age' => 10
);

if (!empty($user['age'])) {
$user['adult'] = ($user['age'] >= 18) ? true : false;
}

// 結果:!empty($user['age'])判斷為true,$user['adult'] 寫入 false

判斷用戶是否成年,而 $user 內 ‘age’ 的值不一定存在,因此需要檢查 ‘age’ 是否存在再做處理

健忘筆記

在不確定資料內部狀況的情況下,可以使用 empty() 來讓錯誤訊息消失

結論

依不同的需求,使用function 來判斷變數或陣列的完整性。

  • if ($x)empty($x) 的判斷結果相反
  • isset($x)is_null($x) 的判斷結果相反

無設定 $x 值的狀況下

  • if ($x)is_null($x) 會跳錯誤訊息
  • isset($x)empty($x) 則不會跳錯誤訊息

檢查完整性可以減少 bug 的發生,不用修 bug 就是開心😆~

你平常會檢查變數或陣列的資料完整性嗎? 是用甚麼方法處理呢? 歡迎留言跟大家分享!

參考資料

延伸閱讀

作者

健忘工程師

發表於

2023-12-30

更新於

2023-12-30

許可協議


評論

複製完成