[英]PHP $_GET and $_POST undefined problem
我是PHP的新手,所以如果這是一個簡單的問題,我道歉...
我正在將PHP站點從一個服務器移動到另一個服務器。 新服務器是IIS 7.0,PHP 5.2.1,短開標簽打開“On”,我不知道原始服務器是如何設置的(我剛剛給出了代碼)。
以下是其中一個頁面的第一部分代碼:
<?
ob_start();
session_start();
if($_GET['confirm'] == 13 || $_GET['confirm'] == 14 || $_GET['confirm'] == 15 || $_GET['confirm'] == 16)
{
include("test/query/test_query.php");
}
?>
執行此頁面時,始終顯示以下錯誤:
PHP注意:未定義的索引:在第6行的[文件位置] .php中確認
此外,用戶通過從主頁(標准HTML頁面)重定向來訪問此頁面。 正確導航到的完整URL如下:
...我理解為什么會拋出錯誤。 我不明白的是這個代碼如何在原始服務器上工作。 我可以錯過配置設置嗎?
*同樣的問題發生在整個網站的幾十個地方。 這只是該問題的一個特定事件。
新服務器將error_reporting
設置為E_ALL。 你所看到的是通知,而不是錯誤。 嘗試:
error_reporting(E_ALL ^ E_NOTICE)
將錯誤報告設置為E_ALL時,訪問未設置的數組成員會生成錯誤。 如果您不希望降低錯誤報告級別,請在檢查$ _GET ['var']之前將代碼更改為:
if(isset($_GET['confirm']) && ($_GET['confirm'] == 13 || $_GET['confirm'] == 14 || $_GET['confirm'] == 15 || $_GET['confirm'] == 16)) {
通過在實際訪問$_GET['confirm']
之前添加對isset()的調用,您將驗證您沒有訪問未設置的數組成員。 ( $_GET['confirm']
只有在URL結束時才會設置?confirm=...
或?something...&confirm=...
)
我建議優化閱讀代碼:
if (isset($_GET['confirm']) && ($_GET['confirm'] >= 13 && $_GET['confirm'] <= 16))
我完全贊同喬希的建議。
由於沒有索引$ _GET ['confirm'],PHP會拋出一條通知,指出您正在查看未定義的索引。 正在顯示通知,因為新服務器在error_reporting中設置了E_NOTICE
標志,可以在php.ini中,也可以在某些配置文件或在頁面加載上運行的引導程序中設置。
從php手冊中, E_NOTICE
:“運行時通知。指示腳本遇到可能表示錯誤的內容,但也可能在正常運行腳本的過程中發生。”
如果您不擔心,可以嘗試關閉通知,或者使用它們追蹤可能存在問題的地方。
對於您發布的代碼,一個簡單的解決方法是將條件更改為
if(isset($_GET['confirm']) && <list of OR conditions>)
這樣,如果沒有'確認'索引,PHP將無法評估條件。
isset()
是一個有用的函數。 如果變量存在則返回“true”,否則返回“false”。 通常,人們將它與$_GET
或$_POST
等$_GET
全局結合使用來確定您是否從網站上的其他頁面發送 - 這允許您根據用戶來自何處以及數據是什么來創建不同的操作標記。 它還可以防止嘗試使用尚未定義的變量時出現錯誤,例如OP正在獲取。 因此,無需編寫兩個不同的.php文件,並擔心將用戶發送到錯誤的文件,您可以在一個頁面中完成所有操作。
周傑倫,我會小心你對其中一些電話的使用。 <?php
比<?
更有可能工作<?
。 我聽說session_start()應該是設置到瀏覽器的第一件事,否則會導致頭問題。 是的,你需要在使用它之前聲明一個變量 - 如果你沒有輸入[file].php?confirm=[some number]
作為你的URL,你的頁面將會破壞,除非你修改它以允許休息。
那是因為似乎沒有設置confirm
查詢字符串變量,你可以檢查它:
ini_set('display_errors', true);
error_reporting(E_ALL);
var_dump($_GET['confirm']);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.