El problema te viene de usar empty para ver si es cero o no
Manual Cita: empty() Devuelve FALSE si var existe y tiene un valor no vacío, distinto de cero. De otro modo devuelve TRUE.
Las siguientes expresiones son consideradas como vacías:
"" (una cadena vacía)
0 (0 como un integer)
0.0 (0 como un float)
"0" (0 como un string)
NULL
FALSE
array() (un array vacío)
$var; (una variable declarada, pero sin un valor)
No se esta evaluando cero como false si no que !empty($foo) es false cuando se da uno de los casos anteriores.
Usa == o ===
http://www.php.net/manual/es/languag...comparison.php (!
empty($foo
) || $foo==
0) es true si $foo existe y tiene un valor
no vacío, o es cero.