2014-07-19 7 views
2

Je n'étais pas encore capable de trouver un bon travail, alors j'ai pensé que je pourrais demander ici.PHP - comment se débarrasser de "Undefined index"

Mon error.log dit pour une bonne raison

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

Jusqu'à présent, je me suis débarrassé de celui-ci avec l'aide d'une instruction if autour d'elle comme

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

Mais maintenant j'ai eu un problème de lil si Je ne peux pas utiliser ce "wrap-around" comme ci-dessus facilement. La fonction check_login (...) écrira $ _SESSION Variables comme ['loginattempts'] ou ['captchaattempts'] - maintenant je veux laisser le login disparaître si ces tentatives atteignent un montant spécifié. Comme

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

Si j'enveloppait un chèque si la variable est définie autour d'elle - la connexion ne semble pas si ces variables ne sont pas définies.

possibles travail-a-tours pourraient être

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

mais cela voudrait dire que je devrais avoir un formulaire de connexion en double dans mon code je sais pourrait aussi simplement changer cet écho « formulaire de connexion ... 'dans un requice_once' inclut/loginform.php '- mais il y aura toujours une entrée en double pour cette commande require_once.

Je pourrais aussi définir un testvar de $ comme

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

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

Alors y at-il d'autres moyens que ceux?

Si ce n'est pas le moyen que vous suggérez de prendre pour conserver le code comme il se doit pour une "bonne programmation"?

Toutes les déclarations sont les bienvenus, merci pour aider à

Kris

Répondre

2

Dans mon expérience, il est toujours une bonne idée de sortie toutes les erreurs au cours du développement et les valeurs ont toujours initialisé. Il peut se débarrasser de certains bogues car vous aurez toujours une valeur par défaut sur laquelle vous pourrez vous replier.

Un moyen facile de résoudre votre problème est d'utiliser une autre variable et d'ajouter vos variables $_SESSION seulement si elles existent. Par exemple:

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

Alternativement, une expression ternaire est également possible de compacité, bien que les longues loginattempts index cela ressemble un peu dur, à mon avis.

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

Merci - m'a donné une bonne impression - les expressions ternaires ici semblent assez sympa pour garder le code soigné. A propos de l'index de session: ce n'est pas exactement ce nom - j'ai juste pris un nom d'exemple pour garder le sujet plus clair :) – Kris

+0

@Kris Je suis d'accord - les expressions ternaires sont soignées si vous avez beaucoup de variables à initialiser. Si nous devions jouer sur l'efficacité, le code de mon premier bloc écrirait toujours '0' à' $ login_attempts', alors que la variante ternaire prendrait directement la valeur correcte (à moins qu'elle ne soit optimisée de toute façon). De toute façon, je doute que ça vaille la peine de perdre le sommeil. Bonne chance pour votre projet! – ljacqu

+1

Bien vrai - quelle que soit la solution que je pourrais prendre - il ne nuira pas à la performance d'une manière «réelle». C'est juste ce que je veux garder c'est aussi propre que possible et le garder aussi simple que possible si d'autres programmeurs doivent modifier mon code :) – Kris

0

Commencez à définir des index!

vous pouvez vérifier directement si vars session sont fixés ou non

if (isset ($_SESSION['loginatt'])) { /* action here */ } 

si vous voulez réduire la redondance dans l'utilisation de la forme connexion chaîne vous pouvez déclarer sous une variable, comme

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

et echo partout où vous voulez.