Aunque tu problema tiene que ver 100% con HTML (nada que ver con código PHP) te voy a explicar:
De entrada, los checkboxes son enviados al servidor únicamente si están seleccionados, de otra forma nunca llegarán.
Esa es la razón de usar un campo hidden, la técnica consiste en tener un campo hidden por cada checkbox que desees registrar: la única regla es que ambos tengan el mismo valor de name.
¿Por qué?
Imagina este escenario:
Código HTML:
Ver original<input type="hidden" name="foo" value="NO"> <input type="checkbox" name="foo" value="YES">
Todos los valores de un formulario se van sobreescribiendo en orden, entonces:
- Si no selecciono nada llegará el valor "NO" (pues el checkbox no sobreescribe el valor)
- Si selecciono el checkbox llegará el valor "YES" (pues el checkbox está sobreescribiendo el valor)
Ahora, ¿quien te recomendó usar un campo hidden que no te explicó todo esto?
Agregar dicho campo sólo porque sí no soluciona nada, ni que fuera magia.