2014-07-19 30 views
2

我還沒有找到一個堅實的工作輪,所以我想我可能會問這裏。PHP - 如何擺脫「未定義的索引」

我error.log中說,一個很好的理由

[error] [client xxx.xxx.xxx.xxx] PHP Notice: Undefined index: Variablename 

直到現在我擺脫它,使用它周圍的if語句像

if (isset($var)) { 
    if ($var ...) { ... } 
} 

但現在我有一個可愛的小問題,所以我不能輕易使用上面的「繞回」。如果這些嘗試達到指定的數量,現在我想讓登錄消失。如果這些嘗試達到指定的數量,那麼check_login(...)函數將寫入$ _SESSION變量,如['loginattempts']或['captchaattempts']。像

if ($_SESSION['loginatt'] < x && $_SESSION['capatt'] < x) { echo 'login form...';} 

如果如果變量被設置圍繞它,我包檢查 - 如果這些變量沒有設置登錄將不會出現。

可能工作一回合可以

if (!isset($var)) {echo 'login form ...';} 
else {echo 'login form...';} 

但是這意味着我必須在我的代碼 重複的登錄表單,我知道也可以只改變這種回聲「登錄表單... '轉換爲一個requice_once'include/loginform.php' - 但是這個require_once命令仍然會有一個重複的條目。

我還可以設置一個$的testvar像

if (isset($var)) { 
    if ($var > x) { 
    echo 'acc. blocked; 
    $testvar = 0; 
    } 
    else { 
    $testvar = 1; 
    } 

if ($testvar < 1) { 
    echo 'login form...'; 
} 

那麼,有沒有任何其他的方式爲那些?

如果不是您建議採用哪種方式來保持代碼的「好編程」?

任何聲明,歡迎,感謝幫助了

克里斯

回答

2

在我的經驗,在開發過程中總是一個好主意,輸出所有的錯誤和總是有初始化值。它可以擺脫一些錯誤,因爲您將始終有一個默認值可以回退。

解決您的問題的一個簡單方法是使用其他變量,並添加您的$_SESSION變量只有當它們存在。例如:

$login_attempts = 0; 
if (isset($_SESSION['loginattempts'])) { 
    $login_attempts = $_SESSION['loginattempts']; 
} 

另外,三元表達也是可能的緊湊性,雖然與長loginattempts指數,這看起來有點苛刻,在我看來。

$login_attempts = (isset($_SESSION['loginattempts'])) ? $_SESSION['loginattempts'] : 0; 
+0

謝謝 - 給了我一個好的印象 - 這裏的三元表達式看起來相當不錯,保持代碼整潔。關於Sessionindex:它不完全是這個名字 - 我只是舉了一個例子名來保持主題更清晰:) – Kris

+0

@Kris我同意 - 如果你有很多變量需要初始化,三元表達式是整潔的。如果我們要挑選效率,我的第一個塊中的代碼總是首先將'0'寫入'$ login_attempts',而三元變量將直接採用正確的值(除非它被優化)。無論哪種方式,我懷疑這值得失眠。祝你的項目好運! – ljacqu

+1

好吧 - 無論我採取什麼解決方案 - 它都不會以「真實」的方式損害性能。這只是我想保持它儘可能乾淨,並儘可能保持簡單,如果其他程序員必須修改我的代碼:) – Kris

0

開始定義索引!

你可以直接檢查會話瓦爾設置或不

if (isset ($_SESSION['loginatt'])) { /* action here */ } 
如果你想減少冗餘使用的登錄表單串 你可以一個變量中,聲明它,就像

$loginform = '<form action="" ...>'; 
$loginform .= '<input type='"...>'; 

echo它在任何你想要的。