2009-05-18 7 views
11

En un bit de código en el que estoy trabajando, necesito extraer un valor de la base de datos y verificar si es 0. Originalmente, había escrito esto como:¿Cuál es la mejor comparación con 0 en PHP?

if ($myVal == 0) { ... 

Pero cuando miré de nuevo hoy, me di cuenta de un error ahí:

var_dump("foo" == 0); // bool(true) 

// and while we're here... 
var_dump(intval("foo")); // int(0) 

Puesto que este valor proviene de la base de datos, que generalmente significa que será una cadena, así que supongo que podría hacer esto:

if ($myVal === "0") 

pero parece contrario a la intuición ya que en realidad quiero que se trata de un número entero, y TH parece mostrar que estamos trabajando con cadenas. (espero que tenga sentido para usted). Además, no debería ser inesperado que cualquier accesoador DB dado arroje valores a su tipo apropiado, dado el tipo de campo.

¿Qué método utilizas para verificar el valor de 0 cuando podría ser una cadena o un int?

+0

+1 Parece muy básico, pero una pregunta sorprendentemente interesante dado el tipo de malabarismo de PHP. – cletus

Respuesta

19

versión corta:

if ("$myVal" === '0') 

o

if (strval($myVal) === '0') 

Versión larga:

if ($myVal === 0 || $myVal === '0') 
+1

oh, eso es inteligente, ¡no hubiera pensado en convertirlo de otra forma! – nickf

+1

Supongo que la versión larga es en realidad la versión más rápida. === es una comparación rápida porque no hace conversiones de tipo. – jmucchiello

+0

@Jm: probablemente tengas razón. Es más molesto escribir. :) – cletus

2

El mejor que tengo actualmente es la siguiente:

is_numeric($myVal) && $myVal == 0 
+0

Esta condición siempre devolverá falso, ya que como dijo en su pregunta, los valores de db se devuelven como cadenas. $ myVal es una cadena, y la comparación se detendrá aquí. Debe convertir su valor en un número entero antes de hacer la comparación. –

+1

En realidad bgy, is_numeric() devolverá verdadero para una cadena de un valor numérico. Consulte http://au2.php.net/is_numeric – thomasrutter

0

Trate de usar intval() para emitir la cadena a un int

if(intval($myVal) == 0) 
+3

(intval ("esto no debe ser igual a cero") == 0) es verdadero – nickf

+0

-1: intval ('null') devuelve 0 – ya23

+0

Casting una cadena a un int da como resultado 0 a menos que la cadena comience con dígitos. La cadena "foo" arroja a 0, la cadena "35foo" arroja a 35. – dirtside

1

Si los valores que regrese de la base de datos son cadenas, pero el tipo de datos original entero, entonces es probable que desee que su objeto DAO (Data Access, o lo que sea que está tirando de la datos) para enviar cosas a los tipos de datos que espera. De esta forma, el código PHP que está mirando los valores está mirando el tipo de datos que espera.

El problema es, por supuesto, que no hay una correspondencia 1-1 entre los tipos de datos que define el DB, y los tipos de datos que PHP define. Sin embargo, en su mayor parte esto no es un problema, ya que existen tipos equivalentes para la mayoría de los tipos que usamos normalmente: int, float, bool, string.

El resultado es que entre el lugar donde consulta la base de datos y el lugar donde verifica esos valores, esos valores se deben convertir a los tipos de datos que espera. Acabo de probar con mysql_fetch_object() en una tabla MySQL que contiene un int (10) y un varchar (50); ambos campos siempre fueron insertados como tipo "cadena" por PHP. Por lo tanto, si desea tratar uno de los campos como int, colóquelo en un int antes de hacer algo con él. Por ejemplo:

$rs = mysql_query("SELECT * FROM table"); 
while ($row = mysql_fetch_object($rs)) { 
    $RealRow->id = (int)$row->id; 
    $RealRow->name = $row->name; 
    // etc. 
} 

// ... later ... 

if ($RealRow->status == 0) { 
    // do something 
} 

La consulta y esas cosas RealRow deben estar dentro de una clase/método, por lo que está encapsulado; de esta forma, CUALQUIER parte de tu código que obtenga datos del table siempre obtendrá el objeto $ RealRow, que tendrá todo configurado para los tipos de datos adecuados.Por supuesto, si cambia sus tipos de datos, esto requiere editar manualmente el DAO para tratar con el casting; también sería posible consultar el DB para obtener el tipo de cada campo (con una tabla "SHOW COLUMNS FROM") y automáticamente convertir los campos al tipo de datos adecuado.

+0

El comando "MOSTRAR COLUMNAS LLENAS DE myTable" es una manera mucho más fácil de determinar los tipos de datos de cada campo. A veces, sin embargo, este nivel de abstracción puede ser exagerado para una situación dada. – nickf

+0

Preferiría que "MOSTRAR [COMPLETO] COLUMNAS" realmente descompusiera los tipos de datos por tipo básico, espacio de visualización, sin firmar, etc. en campos separados, para que fuera más accesible mediante programación. Ahora mismo tiene que analizar manualmente el campo "Tipo" de la salida ... aunque estoy seguro de que alguien tiene una biblioteca para eso. – dirtside

1

creo que sólo debe utilizar

if ($myVal == 0) 

no creo que es necesario que preocuparse de si $ myVal es "foo". Usted mismo ha dicho que este valor solo será un número.

En otras palabras, si alguna vez experimentas que $ myVal es "foo", el error no es ese "foo" == 0, el error es que $ myVal es "foo", cuando se supone que es un número.

0
if(('integer' === gettype($is_anonymous) && $is_anonymous === 0) 
    || 
    ('string' === gettype($is_anonymous) && $is_anonymous === '0')  
) { 
    echo 'matches'; 
} 
+0

Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y/o cómo responde este código a la pregunta mejora su valor a largo plazo. –

Cuestiones relacionadas