A ver...
Tienes un error de concepto. ¿Contra qué quieres hacer la comparación del valor de $_POST['categoria']?
Mira esta página:
http://www.php.net/manual/es/types.comparisons.php . Te darás cuenta de los resultados que obtendrás de una comparación dependiendo del tipo de elementos que está comparando (strings, enteros, booleanos, etc); y además, del tipo de comparación que estás realizando (flexible o estricta). En una comparación flexible (Usando el operador ==), El valor cero (0) es igual a un string. Es decir, la sentencia ("texto" == 0) siempre evaluará como verdadero (true).
Otro punto que estás pasando por alto es que los valores que obtienes de un formulario, y por ende, que accesa a través de la superglobal $_POST, siempre serán de tipo string. Por lo tanto, una comparación flexible con 0 siempre te dará
true.
La solución con empty entonces tampoco te servirá pues tu valor "
cero" es el string "0". Por lo tanto, teóricamente $_POST['categoria'] nunca será empty.
Puedes comparar strings usando la comparación flexible, es decir, ($_POST['categoria'] == "0"), pero lo recomendable en todo caso sería usar una función de PHP que está hecha justo para eso:
strcasecmp():
Con eso debería funcionar como quieres,
Saludos,