标签
PHP欄位明明存在卻判定沒有:isset與array_key_exists怎麼分
表單送來一個欄位,值剛好是null;後端卻回報「沒有這個欄位」。遇到這種情況,先看程式是不是用了isset()。它同時要求變數存在、值不是null,不能單靠結果判斷陣列裡有沒有這個鍵。要區分「沒傳」與「明確傳null」,應先用array_key_exists()判斷鍵,再處理值。 這個差別常出現在設定更新、資料匯入及API部分更新。例如使用者要清除副標題,系統把null當成清空指令;若後端把null視為未提供,就會保留舊副標題。本文用普通PHP陣列拆開這兩種情況,讓判斷對應到你真正要處理的動作。 先把「有鍵」與「有值」分開看 假設收到的資料是['subtitle' => null]。subtitle這個鍵確實在陣列裡,但它沒有非null的值。array_key_exists('subtitle', $input)會得到true,isset($input['subtitle'])則得到false。兩個結果都符合PHP的規則,只是它們回答不同的問題。 如果資料是空陣列,兩種檢查都得到false。也就是說,只看isset的false,無法知道欄位缺席,還是欄位存在但值為null。這不是資料自動被刪掉,也不是PHP沒有讀到請求;是你的檢查方式把兩種狀態合在一起。 還要留意空字串、數字0及布林false。這些值都不是null,所以isset會得到true。把isset當成「有填內容」也容易出錯:空字串可以通過isset,卻未必符合你的表單規則。鍵是否存在、值是否可接受,應分成兩個判斷。 用五組資料確認結果 建立一個獨立的case.php,貼上以下程式。它只檢查記憶體裡的陣列,不連接資料庫,也不會修改網站設定。執行前確認你使用的PHP命令指向要測試的版本。 <?php $cases = [ 'missing' => [], 'null' => ['subtitle' => null], 'empty' => ['subtitle' => ''], 'zero' => ['subtitle' => 0], 'false' => ['subtitle' => false], ]; foreach ($cases as $name => $input) { printf("%s: exists=%s isset=%s\n", $name, array_key_exists('subtitle', $input) ? 'true' : 'false', isset($input['subtitle']) ? 'true' : 'false'); } 在PHP8.4.2執行php case.php,輸出如下。最值得留意的是第二行:鍵存在,但isset仍然為false。後三行則說明不能把空字串、0、false和null混成同一種狀態。 missing: exists=false isset=false null: exists=true isset=false empty: exists=true isset=true zero: exists=true isset=true false: exists=true isset=true 如果你的結果不同,先看測試資料是否真的保留null。有些表單流程會把空白欄位轉成null,也有資料處理層會先移除值為null的鍵。檢查的位置很重要:應在你要判斷的那個資料結構上測,而不是只看更早收到的原始字串。...
PHP讀JSON得到null:分清合法null與解碼錯誤
PHP讀取JSON後得到null,不一定表示解碼失敗。JSON本身可以是一個合法的null;但格式錯誤時,預設的json_decode()也可能回傳null。若程式只寫「結果為null就報錯」,便會把有效資料當成錯誤。需要可靠區分時,可以用JSON_THROW_ON_ERROR,把解碼失敗交給JsonException處理。 這個問題容易出現在匯入檔案、第三方API回應及儲存JSON設定的功能裡。畫面只顯示「資料是空的」,站長卻不知道是服務正常回傳空值,還是資料傳到一半壞掉。先把語法解析與資料格式檢查拆開,錯誤訊息才會說到真正的問題。 合法null和壞掉的字串長得不一樣 JSON的null不需要引號,也沒有大括號。字串'null'交給json_decode後會成為PHP的null。相反,'{"name":}'缺少值,屬於無效JSON。預設解碼這兩者,都可能得到相同的null結果,只看回傳值無法分辨。 空字串也不是JSON的null。API回應沒有內容、HTTP請求失敗、檔案讀取失敗和伺服器回傳HTML錯誤頁,各自有不同原因;不能把它們先改成'null'再繼續處理。應先確認讀取或請求成功,再把真正拿到的字串交給解析器。 JSON也不只允許物件或陣列。像false、0和一段有雙引號包住的字串,都可以是合法值。因此「解碼沒有拋例外」只證明語法能解析,還不能證明資料符合某個API要求的物件結構。 用四組輸入看清差別 以下程式只使用合成字串,可儲存為case.php後在命令列執行。JSON_THROW_ON_ERROR自PHP7.3提供;本文的輸出來自PHP8.4.2。先用普通模式記錄錯誤,再用例外模式解析同一份資料。 <?php $cases = [ 'valid-null' => 'null', 'valid-object' => '{"name":"demo"}', 'broken' => '{"name":}', 'empty' => '', ]; foreach ($cases as $label => $raw) { $plain = json_decode($raw, true); $error = json_last_error(); printf("%s plain=%s error=%d\n", $label, var_export($plain, true), $error); try { $value = json_decode($raw, true, 512, JSON_THROW_ON_ERROR); echo "throw-mode: ", var_export($value, true), PHP_EOL; } catch (JsonException $e) { echo "throw-mode: JsonException code=", $e->getCode(), PHP_EOL; } } 合法null在普通模式的錯誤碼為0,例外模式仍然回傳null,沒有進入catch。合法物件會得到包含name的陣列。壞掉的字串與空字串在這組測試裡都得到語法錯誤碼4,例外模式則拋出JsonException。寫應用程式時應用JSON_ERROR_NONE等常數判斷,不要把這些數字硬寫成你的業務規則。 這樣你就能把「資料確實是null」與「資料無法解碼」放到不同分支。若對方的API規格允許null代表沒有設定,便可以在成功解析後處理這種狀態;若規格要求物件,則回報資料結構不符,而不是誤報語法壞掉。 把解析放在一個小的try區塊 try { $data =...
PHP Windows 套件重建:版本號相同,也要確認 Brotli 修補包的 -1 後綴
PHP 團隊在 2026 年 10 月 26 日更新 Windows 發行套件,提供 8.5.12-1、8.4.27-1、8.3.36-1 與 8.2.35-1。
PHP字串處理詳解
PHP 字串處理 在PHP中,字串是一串字符的集合,可以是任何長度,並由單引號或雙引號包裝。 創建字串 在PHP中,我們可以使用單引號或雙引號來創建字串,例如: $single_quoted = '這是一個單引號字串'; $double_quoted = "這是一個雙引號字串"; 字串操作 PHP提供了許多內建函數來操作字串,下面是一些常用的函數: strlen(): 返回字串的長度 str_word_count(): 返回字串中的單詞數量 str_replace(): 在字串中替換一些字符 strtoupper()和strtolower(): 將字串轉換為大寫或小寫 字串連接 在PHP中,我們可以使用.運算符來連接兩個字串,例如: $first = "Hello, "; $second = "World!"; $greeting = $first . $second; // "Hello, World!" 字串比較 我們可以使用strcmp()函數來比較兩個字串,例如: $first = "apple"; $second = "banana"; $result = strcmp($first, $second); // -1 如果兩個字串相同,strcmp()將返回0。如果第一個字串小於第二個字串,它將返回-1。如果第一個字串大於第二個字串,它將返回1。 結論 總的來說,PHP提供了許多強大的工具來處理字串。無論是創建字串,操作字串,還是比較字串,PHP都可以輕鬆完成。
PHP array_slice 後文章 ID 變成 0:保留數字鍵名的寫法
array_slice 切出文章後,原本的整數 ID 鍵名卻變成 0?用第四個參數保留鍵名,並分清位置偏移、字串鍵名與普通列表。
深入了解PHP註釋的重要性和使用方法
PHP註釋的重要性 在程式設計中,註釋是一個重要元素,它可以幫助我們理解和解釋程式碼的功能。在PHP中,我們有多種方式可以添加註釋,這些註釋對於程式碼的維護和理解都有很大的幫助。 PHP註釋的種類 在PHP中,我們主要有三種類型的註釋: 單行註釋:以兩個斜線(//)或一個井號(#)開頭。 多行註釋:以斜線星號(/*)開頭,以星號斜線(*/)結尾。 文件註釋:以兩個星號斜線(/**)開頭,以星號斜線(*/)結尾,通常用於生成自動文檔。 如何使用PHP註釋 在PHP中使用註釋非常簡單,以下是一些範例: <?php // 這是一個單行註釋 # 這也是一個單行註釋 /* 這是一個多行註釋 可以跨越多行 */ /** * 這是一個文件註釋 * 通常用於生成自動文檔 */ ?> 註釋的重要性 註釋對於程式碼的維護和理解都有很大的幫助。它可以幫助我們記錄程式碼的功能和用途,也可以幫助其他開發者理解我們的程式碼。在複雜的項目中,註釋是必不可少的。
PHP echo和print語句的深入理解
PHP echo和print語句 在PHP中,我們經常需要將資訊輸出到瀏覽器上。這時候,我們就需要使用到PHP的輸出語句。在PHP中,主要有兩種輸出語句,分別是echo和print。雖然這兩種語句在功能上非常相似,但在使用上還是有一些細微的差別。 echo語句 echo是一種語言結構,用於輸出一個或多個字串。echo沒有返回值,且可以輸出一個或多個字串。例如: <?php echo "Hello, world!"; ?> 這段程式碼會在瀏覽器上輸出"Hello, world!"。 print語句 print也是一種語言結構,用於輸出一個字串。print有一個返回值1,且只能輸出一個字串。例如: <?php print "Hello, world!"; ?> 這段程式碼也會在瀏覽器上輸出"Hello, world!"。 echo和print的差異 echo和print在大多數情況下可以互換使用,但還是有一些細微的差異。 echo可以輸出一個或多個字串,print只能輸出一個字串。 echo沒有返回值,print的返回值為1。 echo的速度略快於print。 選擇echo還是print 在實際開發中,選擇使用echo還是print主要取決於個人喜好和具體需求。如果需要輸出多個字串,或者追求程式運行速度,可以選擇使用echo。如果需要知道輸出是否成功,可以選擇使用print。 結語 總的來說,echo和print都是PHP中非常重要的輸出語句,理解它們的使用方法和差異,對於學習PHP有著至關重要的作用。
深入理解PHP變數:類型、聲明、使用和轉換
PHP 變數介紹 在PHP程式語言中,變數是一種存儲信息的容器。變數的名稱可以是字母、數字和下劃線,但必須以字母或下劃線開頭。在PHP中,所有變數名稱都是以美元符號($)開頭的。 PHP 變數的種類 PHP中的變數可以分為四種主要類型:標量類型、複合類型、特殊類型和資源類型。 標量類型:包括布爾型(boolean)、整型(integer)、浮點型(float)和字符串型(string)。 複合類型:包括數組(array)和對象(object)。 特殊類型:包括NULL和回調/閉包型(callable)。 資源類型:包括數據庫連接、文件操作等。 PHP 變數的聲明和使用 在PHP中,我們使用等號(=)來給變數賦值。例如,$var = "Hello, World!"; 就是將字符串 "Hello, World!" 賦值給變數 $var。我們也可以使用unset()函數來銷毀變數。 PHP 變數的作用範圍 在PHP中,變數的作用範圍可以是本地的(local)、全局的(global)或者超全局的(superglobal)。本地變數只在其被定義的函數內部可用,而全局變數則可以在腳本的任何地方使用。超全局變數是在所有的作用範圍內都可用的內置變數,例如$_GET、$_POST等。 PHP 變數的轉換 PHP是一種弱類型語言,這意味著在大多數情況下,我們不需要手動將變數從一種類型轉換為另一種類型。然而,如果需要,我們可以使用一些內置的函數來進行類型轉換,例如intval()、floatval()、strval()等。 結語 總的來說,理解和掌握PHP變數的使用是成為一名有效的PHP開發人員的關鍵步驟。希望這篇文章能對你有所幫助。
