فرمهای HTML ساختار ساده ای دارند. تشکیل شده اند از یه سری المان ساده (معمولا input ) که وقتی کاربر دکمه ارسال (یه عنصر input با نوع submit ) رو میزنه فرستاده میشن به سمت سرور، و البته این که به کجا فرستاده بشه یا اینکه چطور فرستاده بشه توی خصایص فرم مشخص میشه. (خصیصه action برای اینکه فرم به کجا فرستاده بشه و خصیصه method برای اینکه مشخص کنید فرم چطور باید ارسال بشه)
این وسط، وقتی فرم ارسال میشه، کلیه عناصری که اسم دارن (یعنی همه المانهای فرمی که خصیصه name براشون تنظیم شده ) به سمت سرور ارسال میشن، ولی این وسط یه استثنا هست، و اون هم عنصر checkbox.
این عنصر اگه تیک زده بشه مقدار خودشو میفرسته و اگه تیک زده نشه مقدارش فرستاده نمیشه. معمولا مشکلی پیش نمیاد، طرف سرور کافیه بررسی کنید که آیا این اسم تو آرایه _POST یا _GET (بسته به متدی که فرم ارسال میشه) هست یا نه. اگه بود، مقدارش هر چی باشه یعنی چک خورده، اگه نبود یعنی چک نخورده.
ولی اگه نخواید از این روش استفاده کنید چی؟ یعنی اگه بخواید مثلا وقتی چک نخورد، مقداری فرستاده بشه (مثلا 0 ) و اگه چک خورد مقداری ارسال بشه (مثلا ۱ ) .
یه چیزی دیدم تو فرمهای Zend Framework که این مشکل رو برطرف میکرد. برای اینکار کافیه یه عنصر از نوع hidden بالاتر از عنصر checkbox بگذارید، دقیقا به نام همون عنصر checkbox فقط مقدارش رو بگذارید همون مقداری که میخواید وقتی تیک نخورده ارسال بشه (مثل صفر تو مثال ما)‌ بعد عنصر chekbox هم بگذارید و مقدار حالت تیک خورده رو توش بگذارید (تو این مثال یک) خوب اگه تیک نخوره، فرم که ارسال میشه، checkbox اصلا فرستاده نمیشه، ولی عنصر hidden که هست :) در مقابل وقتی چک خورده باشه، عنصر hidden چون قبل از عنصر checkbox هست، مقدارش با مقدار checkbox رونویسی میشه. کد باید اینطور باشه :

<form action="/some/address" method="post">
<input type="hidden" name="mycheckbox" value="0" />
<input type="checkbox" name="mycheckbox" value="1" />
</form>

برای سادگی کل قسمتهای زاید فرم، حذف شده ولی شما کل فرمتون رو بگذارید، فقط یادتون باشه که عنصر hidden باید قبل از عنصر chekbox باشه ، اسمشون هم یکی باشه.