FLUX RSS

  • YouTube
  • LinkedIn
  • Google

Erreur de comparaison PHP

Aujourd'hui, J'ai écrit un script en PHP pour être utilisé dans la ligne de commande lorsque je suis tombé sur un comportement inattendu (au moins de ma part).
Le script devrait recevoir trois arguments, le dernier d'entre eux une liste contenant un ou plusieurs codes numériques.
Essayant de valider ce dernier argument a été d'obtenir un résultat différent qu'imaginé.
Voir l'extrait de code que j'utilisais:

// test.php si (php_sapi_name() == « cli ») {
    $di = isset($argv[1]) ? $argv[1] : Date("Y-m-d"); // Première Date $df = isset($argv[2]) ? $argv[2] : Date("Y-m-d"); // Date limite $prods = isset($argv[3]) ? exploser(',', $argv[3]) : Tableau(); // Liste de codes

    ##### Validation de
    // Première Date si ($di != date("Y-m-d", strtotime($di))) {
        ECHO "\n";
        ECHO "ERREUR! DATE initiale non valide!\n";
        sortie;
    }
    // Date limite si ($DF != date("Y-m-d", strtotime($DF))) {
        ECHO "\n";
        ECHO "ERRO! DATE finale non valide!\n";
        sortie;    
    }

    // Si des codes (comte($prods) >; 0) {
        foreach ($prods comme $prod) {
            If ($prod != (int)$prod) {
                ECHO "\n";
                ECHO "ERREUR! Le CODE " . $prod . " n'est pas valide!\n" ;
                sortie;
            }
        }
    }
    ECHO "FAIT!";
}

Il est intéressant, Quand j'ai couru

# php -f test.php 2015-12-10 2015-12-11 33b

le résultat a été

# FAIT

and reversing the condition to

        If ($prod == (int)$prod)

afficher le message ATTENDU.
J'ai essayé d'affecter à une variable distincte et continue ne fonctionne ne pas.

            $vérifier = (int) $prod;
            If ($prod != $check) {

Whyyy??

La comparaison de Type

!==

cannot be used here, étant donné que tous les arguments seront des chaînes. Quand j'ai bien qu'à ce sujet, j'ai eu la réponse.

So I did some command line tests and I check for the actually behavior of PHP Comparisons.

Quand nous faisons les choses comme:

$chaîne == $integer

PHP will always do a CAST from String to the other type before comparison, Si le code

$chaîne == (int) $chaîne

will always return true, depuis $chaîne changera à int in both sides.

Pour éviter ce genre d'ennui, is necessary to have the same type in both sides of comparison.

            $CONF = (int) $prod;
            If ($prod != (chaîne) $CONF) {
            // OU, si ($prod != (chaîne)(int)$prod) {

A la prochaine.

Laisser une réponse

Votre adresse email ne sera pas publié. Les champs obligatoires sont marqués *

Ce site utilise Akismet pour réduire le spam. Apprenez comment vos données de commentaire sont transformées.