2009-03-09 25 views
25

Solía ​​establecer cosas como esta cuando quería valores en blanco.En PHP, ¿cuál es la diferencia entre NULL y establecer una cadena para igualar 2 comillas simples?

$blankVar = ''; 

Luego, después de algunos meses, decidí que se veía mejor y tenía una intención más clara.

$blankVar = null; 

Esto funcionó sin contratiempo durante un tiempo, pero recientemente con DOP preparado estados me encontré con un problema. Al vincular un valor a null, la consulta fallaba, mientras que vincularlo a '' no lo hacía. Necesitaba unirlo a nulo, de modo que si se cumplía una condición, insertara datos en blanco.

¿Cuáles son las diferencias entre los 2? Sigo pensando que igualar nulo (o al menos una constante) se ve mejor, entonces ¿debería hacerlo?

define('EMPTY', ''); 

Respuesta

41

Null es simplemente otro tipo de datos en PHP, que tiene solo un valor (nulo). Dado que PHP es un lenguaje poco tipado, puede ser confuso cómo maneja diferentes valores.

"", 0, "0", False, array(), Null son todos considerados falsos en PHP.

Nulo, sin embargo, es un tipo diferente de animal. La incompatibilidad principal con el uso de nulo es que no se puede decir si isset().

$x = false; 
isset($x) -> true 
echo $x -> "" 

$y = null; 
isset($y) -> false 
echo $y -> "" 

//$z is not set 
isset($z) -> false 
echo $z -> E_NOTICE 

Así nula es extraño en el sentido de que no sigue las reglas normales variables en PHP (al menos algunos). En la mayoría de los casos, está bien.

Cuando se trata de columnas de bases de datos, PHP NULL no tiene lugar allí. Como ve, SQL es un lenguaje basado en cadenas. El NULL de SQL debe estar representado por NULL sin comillas.

Así que si quieres un campo vacío, otra vez en ""

INSERT INTO foo SET bar = "" 

Pero si quieres un campo NULL, establecen a NULL

INSERT INTO foo SET bar = NULL 

GRAN DIFERENCIA.

Pero si intenta insertar el PHP NULL directamente, agregará cero caracteres a la consulta, (lo que le deja con un error de sintaxis o en blanco, dependiendo de si lo citó).

+2

Gracias por incluir su sección en SQL. – alex

19

nula es un valor de marcador de posición especial en el lenguaje de programación que literalmente significa "nada". No es 0, no es una cadena vacía, no es nada. No hay ningún valor en la memoria a la que se apunta. Una cadena vacía, por otro lado, sigue siendo un objeto de cadena, solo uno muy corto :)

+1

Gracias Rex, esta es la respuesta más clara (para mí de todos modos). – alex

+0

Si es la respuesta más clara, y estoy de acuerdo, ¿por qué no la aceptó? –

+0

@Chris: Porque el que acepté me dio más información. En su lugar, voté por esta. – alex

2

Bueno, una cosa es lo agradable que se ve cada enfoque, pero la principal diferencia es que uno es una cadena vacía y el otra es una variable sin inicializar (nulo)

2

Aparte de las diferencias indicadas por Rex, hay dos tipos de comparaciones en PHP, suelto y estrictas:

http://www.php.net/manual/en/types.comparisons.php

Si comparaciones o funciones como is_null estrictas() se usan en cualquier capacidad, obtendrá diferentes resultados. Sin embargo, con comparaciones sueltas, PHP es bastante indulgente.

No estoy seguro, pero es posible que pueda utilizar su enfoque nulo, luego solo encasillar cuando esté usando la variable en el contexto donde tuvo problemas (es decir, pase (cadena) $ blankVar). Si eso funciona, puede significar que se necesitan menos cambios a su código.

+0

Esto parece útil, así que si continúo estableciendo las cosas en nulo, y si tengo un tropiezo, simplemente $ var = (cadena) $ myPossiblyNullString; ? – alex

+0

PHP está débilmente tipado, por lo que ese tipo de cosas generalmente funcionan, pero yo no lo he probado. –

1

'nulo' es lo único a lo que se refieren las variables sin inicializar. Puede establecer una variable para referirse a nulo. También está el estado 'desarmado', lo que significa que la variable no existe en absoluto. Puede verificarlo a través del isset() function. La mayoría de las veces se utiliza para comprobar si existe un elemento de matriz y, por ejemplo, es una forma de ver si $ _GET ['op'] ha recibido un param de cadena de consulta. También puede hacer que una variable se desarme (elimine un elemento de una matriz) a través del unset() function. También hay un function empty() que comprobará si una variable es NULL, FALSE, 0 o una cadena vacía

Cuestiones relacionadas