P粉6449810292023-08-24 11:13:56
試試這些
// recommended solution for recent PHP versions $user_name = $_SESSION['user_name'] ?? ''; // pre-7 PHP versions $user_name = ''; if (!empty($_SESSION['user_name'])) { $user_name = $_SESSION['user_name']; }
或者,作為一個快速但骯髒的解決方案:
// not the best solution, but works // in your php setting use, it helps hiding site wide notices error_reporting(E_ALL ^ E_NOTICE);
關於會話的注意事項:
使用會話時,需要將 session_start();
放置在所有使用會話的檔案內。
P粉7879344762023-08-24 10:41:30
此錯誤訊息旨在幫助 PHP 程式設計師在存取不存在的變數(或陣列元素)時發現拼字錯誤或錯誤。所以一個好的程式設計師:
雖然 PHP 不需要變數聲明,但它確實建議這樣做,以避免一些安全漏洞或錯誤,即人們會忘記為稍後在腳本中使用的變數賦值。 PHP 在未宣告變數的情況下會發出 E_WARNING
等級的錯誤。
此警告可協助程式設計師發現拼字錯誤的變數名稱或類似類型的錯誤(例如在評估為 false 的條件內為變數指派了值)。此外,未初始化的變數還可能存在其他問題。如 PHP 手冊中所述,
這表示變數可能會從包含的檔案中取得值,並且將使用該值而不是預期存取未初始化變數的null
,這可能會導致不可預測的結果。為了避免這種情況,PHP 檔案中的所有變數最好在使用之前進行初始化。
處理問題的方法:
建議:在使用之前聲明每個變數。這樣,只有當您確實犯了錯誤,嘗試使用不存在的變數時,您才會看到此錯誤 - 這正是此錯誤訊息存在的原因。
//Initializing a variable $value = ""; //Initialization value; 0 for int, [] for array, etc. echo $value; // no error echo $vaule; // an error pinpoints a misspelled variable name
變數已定義但在函數中不可見的特殊情況。 PHP 中的函數有自己的變數範圍,如果您需要在函數中使用外部變量,則其值必須作為函數的參數傳遞:
function test($param) { return $param + 1; } $var = 0; echo test($var); // now $var's value is accessible inside through $param
使用空合併運算子抑制錯誤。但請記住,這樣 PHP 將無法通知您使用了錯誤的變數名稱。
// Null coalescing operator echo $value ?? '';
對於古老的 PHP 版本(< 7.0),可以使用三元的 isset()< 7.0),可以使用带有三元的 isset()
echo isset($value) ? $value : '';
請注意,它本質上仍然是一種錯誤抑制,儘管只是針對一個特定錯誤。因此,它可能會阻止 PHP 透過標記統一變數來幫助您。
使用@運算子抑制錯誤。由於歷史原因而離開這裡,但認真地說,這是不應該發生的。
注意:強烈建議只實現第 1 點。
當您(或 PHP)嘗試存取陣列的未定義索引時,會出現此通知/警告。
在處理程式碼中定義的內部陣列時,態度應該完全相同:只需在使用前初始化所有鍵即可。這樣,該錯誤將完成其預期的工作:通知程式設計師其程式碼中的錯誤。所以方法是相同的:
推薦:宣告您的陣列元素:
//Initializing a variable $array['value'] = ""; //Initialization value; 0 for int, [] for array, etc. echo $array['value']; // no error echo $array['vaule']; // an error indicates a misspelled key
一種特殊情況是某些函數會傳回陣列或其他值(例如 null
或 false
)。那麼在嘗試存取數組元素之前就必須要進行測試,例如
$row = $stmt->fetch(); if ($row) { // the record was found and can be worked with echo $row['name']; }
對於外部陣列(例如$_POST
/ $_GET
/ $_SESSION
或JSON 輸入),情況有點不同,因為程式設計師無法控制此類數組的內容。因此,檢查某些鍵是否存在,甚至為遺失的鍵分配預設值都是合理的。
當 PHP 腳本包含 HTML 表單時,第一次載入時很自然地沒有表單內容。因此,這樣的腳本應該檢查表單是否已提交
// for POST forms check the request method if ($_SERVER['REQUEST_METHOD'] === 'POST') { // process the form } // for GET forms / links check the important field if (isset($_GET['search'])) { // process the form }
某些 HTML 表單元素(例如核取方塊)如果未選中,則不會傳送到伺服器。在這種情況下,有理由使用空合併運算子來指派預設值
$agreed = $_POST['terms'] ?? false;
可選的 QUERY STRING 元素或 cookie 應以相同的方式處理
$limit = $_GET['limit'] ?? 20; $theme = $_COOKIE['theme'] ?? 'light';
但是分配應該在腳本的一開始就完成。 驗證所有輸入,將其指派給局部變量,並在程式碼中始終使用它們。因此,您要存取的每個變數都會故意存在。
相關:
#