2010-10-14 6 views
1

Mes journaux d'erreurs deviennent très rapides parce que je référence une tonne de variables avec peut ou peut ne pas exister. Je suis retourné à travers et commence à les nettoyer, mais je voulais voir s'il y avait un moyen plus efficace (et plus propre) de vérifier les variables php.Erreurs PHP pour les variables (isset) et l'optimisation

Actuellement, j'utiliser comme suit:

Exemple 1:

<?php 
    if (isset($_SESSION['checked']) && $_SESSION['checked'] == "Y") { 
     do something; 
    } 
?> 

Exemple 2: (à moins de formulaire HTML)

<input type="text" name="sample_number" onKeyUp="this.value=this.value.replace(/[^0-9]/ig, '')" value="<?php echo $fields['sample_number']; ?>" /> 

où le numéro d'échantillon est affiché si elle est définie .

Y a-t-il une meilleure façon de gérer des scénarios comme ceux-ci?

+0

ma question exactement. –

Répondre

2

Il est un peu plus bavard, mais array_key_exists() est plus rapide que isset() pour le tableau de vérifier la présence clé et isset() est livré avec la mise en garde qu'il retourne false pour NULL valeurs (vous avez peut-être mettre volontairement une variable à NULL, mais isset() volonté être sémantiquement faux dans ce cas).

Ainsi, dans votre premier exemple:

<?php 
    if(array_key_exists('checked', $_SESSION) && $_SESSION['checked'] == 'Y') { 
     do something; 
    } 
?> 

Dans votre deuxième exemple, je suggère d'utiliser array_key_exists() et l'opérateur ternaire:

<input type="text" name="sample_number" onKeyUp="this.value=this.value.replace(/[^0-9]/ig, '')" value="<?= array_key_exists('sample_number', $fields) ? $fields['sample_number'] : '' ?>" /> 

comme il en fait une solution plus compacte sans répéter votre HTML à travers if() conditions. Editer: J'aime toujours initialiser mes variables le plus tôt possible, FWIW. Cela peut devenir compliqué car il y a toujours un surcoût potentiel si, disons, vous aviez une série de tableaux que vous avez initialisés mais que vous n'avez pas fini de les utiliser (par exemple, s'ils n'étaient utilisés que dans certaines conditions). ton application. Il n'y a pas de substitut au bon jugement.

+0

Je ne mets jamais mes variables de session à NULL sur mes sites donc la première partie ne me dérange pas tellement. – JM4

+0

Je vais donner un coup de chance à la 2ème pièce - cela semble intéressant et je ne l'ai jamais vu auparavant – JM4

+1

Juste pour un petit clin d'oeil: l'opérateur ternaire ('?:') Est au format: 'condition? true_statement: false_statement'. Vous voudriez l'employer comme n'importe quelle autre expression - pas comme un moyen d'exécuter deux fonctions de manière conditionnelle, par exemple (vous devriez toujours utiliser 'if()' dans ce cas). – mway

2

Je m'écris habituellement moi-même une fonction qui me permet d'extraire les valeurs du tableau associé (qu'il s'agisse de session, get ou post). Je fais habituellement ces fonctions assigner une valeur par défaut, car je ne m'inquiète pas vraiment si une valeur est placée ou la valeur par défaut est placée (qui mène à aucun comportement spécial).

Essentiellement, une fonction pourrait ressembler à ceci:

function getSessionVar ($name, $default = '') 
{ 
    if (!isset($_SESSION[$name]) 
     return $default; 

    switch (gettype($default)) 
    { 
     'integer': 
      return intval($_SESSION[$name]); 
      break; 

     'double': 
      return floatval($_SESSION[$name]); 
      break; 

     default: 
      return $_SESSION[$name]; 
    } 
} 

Puis-je utiliser cette fonction au début d'un bloc fichier/code pour obtenir toutes les variables qui me intéressent et juste travailler avec la valeur de cette variable.

+0

'gettype()' est mauvais, mais l'utilisation d'une fonction de type datastore est toujours une option. – mway

+0

un opérateur de fonction n'est pas vraiment une solution pour moi, surtout compte tenu du second exemple dans ma question initiale. Bien que je sois d'accord, c'est une bonne solution, probablement pas pour le problème auquel je suis confronté, d'autant plus que les valeurs variables changent souvent. – JM4

2

isset est la méthode qu'ils enseignent dans la formation de certification Zend. Vous pouvez prendre des raccourcis et faire le @ devant l'énoncé qui aboie, ou vous pouvez simplement baisser le niveau d'erreur, mais je crois fermement que les erreurs existent pour une raison ... eh bien, la plupart d'entre elles de toute façon. Prends ton temps et fais-le bien.

+0

bon conseil. Pouvez-vous expliquer comment fonctionne le raccourci @? Je ne peux pas trouver la langue en ligne pour cela. – JM4

+0

C'est l'opérateur de contrôle d'erreur (http://php.net/manual/fr/language.operators.errorcontrol.php), mais vous ne devriez vraiment pas l'utiliser, sauf si vous êtes absolument sûr que le résultat ne provoquera pas inattendu comportement au sein de votre application. – mway

+0

@mway, d'accord, je ne suis pas un grand fan. Mais pour ces simples avis de déclaration, c'est une solution possible. – bpeterson76

1

Ce n'est pas la meilleure façon de contourner, mais si vous avez besoin mal de signaler toutes les erreurs mais veulent ignorer le cas que vous avez décrit là-bas, je suppose que vous pourriez faire:

if ($test = @$_SESSION['checked'] && $test == 'Y') { 
    do something 
}