3 votes

Comment trouver des variables indéfinies dans un script PHP script ?

Supposons que nous ayons la fonction suivante en PHP :

public function testSomething()
{
    $name = perform_sql_query("SELECT name FROM table WHERE id = $entity_id;");
    assert($name == "some_name");
}

La requête est syntaxiquement correcte, mais comme $entity_id n'est pas défini, la requête cherchera toujours 'id = 0', ce qui est sémantiquement incorrect.

J'aimerais que ces fonctions échouent automatiquement lorsqu'elles tentent d'utiliser une variable non définie. Existe-t-il un tel mécanisme en PHP ? Ou peut-être existe-t-il un outil, qui peut être utilisé pour analyser le code source de PHP afin de trouver de tels cas ?

Ces variables non définies peuvent se trouver n'importe où dans le projet, de sorte que la décision correcte sera de vérifier les arguments des fonctions dans chaque fonction.


La mise en place d'un gestionnaire d'erreur a été facilitée. Désormais, chaque fois qu'une variable non initialisée est utilisée, une exception est levée.

6voto

soulmerge Points 37314

PHP dispose de plusieurs niveaux de gravité pour les erreurs script. Vous pouvez définir ce que l'interpréteur doit considérer comme une erreur : Soit en utilisant la fonction error_reporting() ou de régler le php.ini -directive portant le même nom à cette fin.

Voici un exemple de configuration de PHP pour l'établissement d'un rapport n'importe quoi ce qui peut conduire à des erreurs (cela peut conduire à un grand nombre de messages, si vous le configurez pour la première fois, mais la correction de ces erreurs vous permettra d'obtenir une application beaucoup plus stable) :

# In your PHP script:
error_reporting(E_ALL | E_STRICT);

# Or in your php.ini file:
error_reporting = E_ALL | E_STRICT

2voto

Paul Dixon Points 122033

Si vous activez tous les avertissements et avis l'évaluation de cette chaîne devrait générer un message d'erreur.

De plus, il évaluera un code SQL invalide (il sera id= pas id=0 ), de sorte que votre perform_sql_query devrait également le signaler.

2voto

Andi Points 5222

Je vérifie normalement si mes valeurs sont nulles dans ma fonction. Vous pouvez utiliser isset() et aussi si c'est une chaîne vide, en utilisant quelque chose comme ci-dessous :

public function testSomething()
{
    if(!empty($entity_id)){
            $name = perform_sql_query("SELECT name FROM table WHERE id = $entity_id;");
            assert($name == "some_name");
            return true;
    }
    return false;
}

Je définirais également le rapport d'erreur en utilisant la ligne ci-dessous :

error_reporting(E_ALL | E_STRICT);

2voto

Extrakun Points 8024

Il convient de tenir compte du fait que, pour un site en ligne, vous ne souhaitez peut-être pas que les utilisateurs voient les erreurs et les avertissements. Certains hébergeurs fournissent une fonction error.log qui enregistre les erreurs de PHP. Voici un gestionnaire d'erreurs personnalisé pour les sites réels :

function log_error($no, $msg, $file, $line)
{
    $errorMessage = "Error no $no: $msg in $file at line number $line";

    file_put_contents("errors_paypal.txt",$errorMessage."\n\n",FILE_APPEND);
}

set_error_handler('log_error');

L'avantage est que vous pouvez le formater et y insérer les informations que vous souhaitez.

1voto

Salman A Points 60620
  • Définissez le rapport d'erreur à E_ALL dans vos applications PHP en utilisant :

    error_reporting(E_ALL) ;

Ou en définissant des valeurs appropriées pour les paramètres rapport_d'erreur variable dans le fichier php.ini ou .htaccess . Cela vous permet de détecter toutes les erreurs, y compris celles liées à des variables non définies.

  • Mise en place de PHP error_log dans votre environnement de développement et l'inspecter soigneusement pendant les phases de développement.

Enfin, pour le code susmentionné, il convient d'inclure toute la gestion des erreurs dans la fonction "perform_sql_query". Votre perform_sql_query est probablement une enveloppe au-dessus de la fonction mysql_query Il faut donc vérifier les erreurs générées par la fonction mysql_query (et autres fonctions similaires).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X