RSS

  • YouTube
  • LinkedIn
  • Google

Error de comparación PHP

Hoy, Estaba escribiendo un script en PHP para ser utilizado en la línea de comandos cuando me topé con un comportamiento inesperado (por lo menos de mi parte).
El script debe recibir tres argumentos, la última de ellas una lista que contiene uno o más códigos numéricos.
Tratando de validar este último argumento fue conseguir un resultado diferente lo imaginado.
Ver el fragmento de código que estaba usando:

// Test.php si (php_sapi_name() == 'cli') {
    $di = isset($argv[1]) ? $argv[1] : fecha('Y-m-d'); // Inicial de fecha $df = isset($argv[2]) ? $argv[2] : fecha('Y-m-d'); // Fecha límite $prods = isset($argv[3]) ? explotar(',', $argv[3]) : arreglo de discos(); // Lista de códigos

    ##### Validación de
    // Inicial de fecha si ($di != fecha('Y-m-d', strtotime($di))) {
        Eco "\n";
        Eco "ERROR! FECHA de inicio no válido!\n";
        salida;
    }
    // Final fecha si ($DF != fecha('Y-m-d', strtotime($DF))) {
        Eco "\n";
        Eco "ERRO! FECHA FINAL no válido!\n";
        salida;    
    }

    // Si los códigos (Conde($puntas de prueba) >; 0) {
        foreach ($sondas como $prod) {
            If ($Prod != (int)$Prod) {
                Eco "\n";
                Eco "ERROR! El código de " . $Prod . " no es válido!\n" ;
                salida;
            }
        }
    }
    Eco "HECHO!";
}

Es interesante que, Cuando corrieron

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

el resultado fue

# HECHO

y revertir la condición de

        If ($Prod == (int)$Prod)

muestran el mensaje esperado.
He intentado asignar a una variable independiente y continuaba no funciona.

            $comprobar = (int) $Prod;
            If ($Prod != $check) {

Whyyy??

La comparación de tipo

!==

no se puede utilizar aquí, ya que todos los argumentos serán cadenas. Cuando yo aunque acerca de esto recibí la respuesta.

Así que hice algunas pruebas de línea de comandos y comprobar el comportamiento realmente de comparaciones PHP.

Cuando hacemos las cosas como:

$cadena == $integer

PHP haremos siempre un molde de cadena para el otro tipo antes de comparación, así que el código

$cadena == (int) $cadena

siempre devolverá true, desde $cadena se cambiará a int en ambos lados.

Para evitar este tipo de problemas, es necesario tener el mismo tipo en ambos lados de la comparación.

            $conf = (int) $Prod;
            If ($Prod != (cadena) $conf) {
            // O si ($Prod != (cadena)(int)$Prod) {

Nos vemos.

Contesta

Su dirección de correo electrónico no será publicado. Campos requeridos están marcados *

Este sitio utiliza Akismet para reducir el spam. Aprender cómo se procesaron los datos de comentario.