progpars
progpars.com
سر و کله زدن با فرم در PHP از اون مبحثهایی هست که زیاد درباره اش سوال پیش میاد مخصوصا برای کاربران تازه کار. توی این مقاله میخوایم همه سوراخ سمبه های فرمها رو با PHP کشف کنیم. انواع فیلد و ورودی رو معرفی می کنم و شیوه دسترسی به مقدارشون در PHP رو هم توضیح میدم.
اول از تگ form شروع می کنیم. تگ form چند تا attribute اصلی برای کار ما داره:
یک توضیح کوتاه: توابع معمول برای چک کردن اطلاعات isset و empty هستند. اگر دقیق نمی دونی، تابع isset فقط موجود بودن یا null بودن متغیر رو چک می کنه. یعنی اگر متغیری اصلا وجود نداشته باشه یا برابر null باشه، این تابع FALSE میده و در غیر اینصورت همیشه TRUE میده. تابع empty با مقدار هم کار داره یعنی مقدار خالی یا صفر رو هم تشخیص میده
حالا فرم زیر رو ببین. این فرم همه جور فیلد و ورودی به دردبخور رو به انواع مختلف داره. میخوایم این فرم رو در PHP پردازش کنیم. روش چیدمان فیلدها، براساس نوع رفتار PHP با اونهاست. لطفا خوب، خط به خط این فرم رو مطالعه کن (مهمه!).
فیلدهای text، password، submit، select، hidden و textarea همیشه وجود دارند یعنی اگر پر بشوند با مقدار فرستاده میشوند در غیر اینصورت خالی فرستاده میشوند یعنی استفاده از تابع isset برای این فیلدها همیشه مقدار TRUE خواهد بود و تابع مناسب براشون empty هست. یعنی با تابع empty راحت می تونیم چک کنیم که کاربر فیلد رو پر کرده یا خیر. دسترسی به اطلاعات این فیلدها به ساده ترین شکل ممکن انجام میشه:
چک باکس و فیلدهایی رادیویی، تا وقتی علامت زده نشدند، به سرور فرستاده نمیشوند! پس اول باید چک کنیم که وجود دارند یا نه. اینجا تابع isset بکار میاد. البته اینکار رو با همون تابع empty هم می تونیم انجام بدیم همونطور که توی فرم مشاهده کردی و میدونی، ورودی های رادیویی چون فقط یکیشون قابل انتخابه، باید همنام باشند تا اونجوری که باید، کار کنند.
وقتی چک باکسهای زیادی داشته باشیم، معمولا استفاده از آرایه بهتره. برای این دسته، با یک آرایه مواجهیم. عناصر این آرایه نیازی به چک کردن با isset نداره چون اگر چک باکسی انتخاب نشه، وارد این آرایه هم نخواهد شد. فقط باید وجود خود آرایه رو بررسی کنیم یعنی بررسی کنیم که آیا حداقل یک چک باکس انتخاب شده یا نه. وقتی برای آرایه کلید تعیین می کنیم، امکان مدیریت دسته بندی فیلدها خیلی بالا میره. روش استفاده مثل آرایه های انجمنی (Associative Arrays) در PHP هست.
—————————————
یک نوعی از منوی Select، حالت چندانتخابی یا Multiple هست که برای این حالت، نام فیلد حتما باید آرایه باشه و مقادیر هم بصورت عناصر این آرایه منتقل میشوند:
و اما آپلود که فقط با متد POST قابل اجراست و اطلاعات فایل رو داخل آرایه FILES_$ میریزه.
یه نکته برای داونلود همزمان چند فایل توسط آرایه وجود داره و اونهم شکل آرایه FILES_$ در زمان آپلود چند فایله. به شکل آرایه در این حالت، خیلی خوب دقت کن.
اول از تگ form شروع می کنیم. تگ form چند تا attribute اصلی برای کار ما داره:
- action: باید حاوی آدرسی باشه که قراره اطلاعات فرم به اونجا ارسال بشه. مثلا یک فایل PHP ساختیم که قراره اطلاعات این فرم رو پردازش کنه، پس اینجا باید آدرس اون فایل رو بنویسیم تا بعد از فشار دادن دکمه Submit اطلاعات فرم به اونجا بره.
اگر این attribute رو خالی بذاریم یا اصلا استفاده اش نکنیم، بصورت پیش فرض، روی آدرسی که فرم درش قرار داره تنظیم میشه. مثلا form.html. - method: روش ارسال اطلاعات بصورت GET یا POST. این مشخصه بصورت پیش فرض روی GET تنظیم شده. در هر دو اطلاعات سالم و سلامت به سرور فرستاده میشوند ولی با در نظر گرفتن مواردی. مقایسه این دو روش به این صورته:
- GET: اطلاعات بصورت ساده و کد نشده منتقل میشه. این روش دقیقا مشابه اینه که اطلاعات رو بصورت Query به URL اضافه کرده باشیم و وقتی فرم رو Submit می کنیم، این اطلاعات خودش به URL اضافه میشه و قابل دیدن میشه. باید توجه داشت که اطلاعات حساسی مثل Password نباید در معرض دید قرار بگیره پس نباید برای فرمی که اطلاعات مهمی داره از GET استفاده کنیم تا اطلاعات فرم توی Address Bar قابل رویت نشه. به اضافه اینکه IE توی حجم اطلاعات GET محدودیت داره. به این صورت که وقتی اطلاعات فرم بصورت Query به URL اضافه میشه، طول این URL حداکثر میتونه ۲۰۸۳ کاراکتر باشه.
در روش GET، چون اطلاعات فرم کد نمیشوند و ساده منتقل میشوند پس یک مقدار ناچیزی سبکتره!. اطلاعات فرم در این حالت، توسط آرایه GET_$ در PHP قابل دسترسیه. همچنین در روش GET از Upload خبری نیست، یعنی با GET نمیشه آپلود کرد. - POST: این روش اطلاعات رو کد می کنه. چیزی به URL اضافه نمی کنه. محدودیت خاصی نداره و امکان آپلود فقط از طریق این روش ممکنه. اطلاعات این روش در PHP توسط آرایه POST_$ قابل دسترسیه.
- GET: اطلاعات بصورت ساده و کد نشده منتقل میشه. این روش دقیقا مشابه اینه که اطلاعات رو بصورت Query به URL اضافه کرده باشیم و وقتی فرم رو Submit می کنیم، این اطلاعات خودش به URL اضافه میشه و قابل دیدن میشه. باید توجه داشت که اطلاعات حساسی مثل Password نباید در معرض دید قرار بگیره پس نباید برای فرمی که اطلاعات مهمی داره از GET استفاده کنیم تا اطلاعات فرم توی Address Bar قابل رویت نشه. به اضافه اینکه IE توی حجم اطلاعات GET محدودیت داره. به این صورت که وقتی اطلاعات فرم بصورت Query به URL اضافه میشه، طول این URL حداکثر میتونه ۲۰۸۳ کاراکتر باشه.
- application/x-www-form-urlencoded: این حالت پیش فرض روش POST.
- multipart/form-data: ارسال اطلاعات بدون کد کردن. آپلود فقط با این روش امکانپذیره!
- text/plain: شبیه حالت اول ولی کاراکترهای اسکی رو کد نمی کنه.
یک توضیح کوتاه: توابع معمول برای چک کردن اطلاعات isset و empty هستند. اگر دقیق نمی دونی، تابع isset فقط موجود بودن یا null بودن متغیر رو چک می کنه. یعنی اگر متغیری اصلا وجود نداشته باشه یا برابر null باشه، این تابع FALSE میده و در غیر اینصورت همیشه TRUE میده. تابع empty با مقدار هم کار داره یعنی مقدار خالی یا صفر رو هم تشخیص میده
حالا فرم زیر رو ببین. این فرم همه جور فیلد و ورودی به دردبخور رو به انواع مختلف داره. میخوایم این فرم رو در PHP پردازش کنیم. روش چیدمان فیلدها، براساس نوع رفتار PHP با اونهاست. لطفا خوب، خط به خط این فرم رو مطالعه کن (مهمه!).
- <form action=”submit.php” method=”POST” enctype=”multipart/form-data”>
- <input type=”text” name=”field_text” value=”" />
- <input type=”password” name=”field_password” value=”" />
- <textarea name=”textarea”></textarea>
- <input type=”submit” name=”button_submit” value=”Submit Form” />
- <select name=”select_single”>
- <option value=”option ۱″>Opt1</option>
- <option value=”option ۲″>Opt2</option>
- <option value=”option ۳″>Opt3</option>
- <option value=”option ۴″>Opt4</option>
- </select>
- <input type=”hidden” name=”field_hidden” value=”some hidden data” />
- <input type=”checkbox” name=”field_checkbox_single” value=”checkbox single value” />
- <input type=”radio” name=”field_radio” value=”radio value ۱″ />
- <input type=”radio” name=”field_radio” value=”radio value ۲″ />
- <input type=”radio” name=”field_radio” value=”radio value ۳″ />
- <input type=”checkbox” name=”field_checkbox_multiple[]“ value=”checkbox multiple value ۱″ />
- <input type=”checkbox” name=”field_checkbox_multiple[]“ value=”checkbox multiple value ۲″ />
- <input type=”checkbox” name=”field_checkbox_multiple[]“ value=”checkbox multiple value ۳″ />
- <input type=”checkbox” name=”chkbx_multiple_with_key[parent]“ value=”chkbx mltpl with key1″ />
- <input type=”checkbox” name=”chkbx_multiple_with_key[parent]“ value=”chkbx mltpl with key2″ />
- <select name=”select_mulitple[]“ multiple=”multiple”>
- <option value=”option ۱″>Opt1</option>
- <option value=”option ۲″>Opt2</option>
- <option value=”option ۳″>Opt3</option>
- <option value=”option ۴″>Opt4</option>
- </select>
- <input type=”file” name=”field_file” MAX_FILE_SIZE=”2000000″ />
- <input type=”file” name=”field_file_multiple[]“ MAX_FILE_SIZE=”2000000″ />
- <input type=”file” name=”field_file_multiple[]“ MAX_FILE_SIZE=”2000000″ />
- <input type=”reset” name=”field_reset” value=”Reset” />
- <input type=”image” name=”field_img” value=”Image” />
- <input type=”button” name=”field_button” value=”Button To Click” />
- </form>
فیلدهای text، password، submit، select، hidden و textarea همیشه وجود دارند یعنی اگر پر بشوند با مقدار فرستاده میشوند در غیر اینصورت خالی فرستاده میشوند یعنی استفاده از تابع isset برای این فیلدها همیشه مقدار TRUE خواهد بود و تابع مناسب براشون empty هست. یعنی با تابع empty راحت می تونیم چک کنیم که کاربر فیلد رو پر کرده یا خیر. دسترسی به اطلاعات این فیلدها به ساده ترین شکل ممکن انجام میشه:
- <input type=”text” name=”field_text” value=”" />
- <input type=”password” name=”field_password” value=”" />
- <textarea name=”textarea”></textarea>
- <input type=”submit” name=”button_submit” value=”Submit Form” />
- <select name=”select_single”>
- <option value=”option ۱″>Opt1</option>
- <option value=”option ۲″>Opt2</option>
- <option value=”option ۳″>Opt3</option>
- <option value=”option ۴″>Opt4</option>
- </select>
- <input type=”hidden” name=”field_hidden” value=”some hidden data” />
- $field_text = $_POST['field_text'];
- $field_password = $_POST['password'];
- $textarea = $_POST['textarea'];
- $submit = $_POST['submit'];
- $select_single = $_POST['select_single'];
- $field_hidden = $_POST['field_hidden'];
چک باکس و فیلدهایی رادیویی، تا وقتی علامت زده نشدند، به سرور فرستاده نمیشوند! پس اول باید چک کنیم که وجود دارند یا نه. اینجا تابع isset بکار میاد. البته اینکار رو با همون تابع empty هم می تونیم انجام بدیم همونطور که توی فرم مشاهده کردی و میدونی، ورودی های رادیویی چون فقط یکیشون قابل انتخابه، باید همنام باشند تا اونجوری که باید، کار کنند.
- <input type=”checkbox” name=”field_checkbox_single” value=”checkbox single value” />
- <input type=”radio” name=”field_radio” value=”radio value ۱″ />
- <input type=”radio” name=”field_radio” value=”radio value ۲″ />
- <input type=”radio” name=”field_radio” value=”radio value ۳″ />
- if(isset($_POST['field_checkbox_single']))
- $field_checkbox_single = $_POST['field_checkbox_single'];
- if(isset($_POST['field_radio']))
- $field_radio = $_POST['field_radio'];
وقتی چک باکسهای زیادی داشته باشیم، معمولا استفاده از آرایه بهتره. برای این دسته، با یک آرایه مواجهیم. عناصر این آرایه نیازی به چک کردن با isset نداره چون اگر چک باکسی انتخاب نشه، وارد این آرایه هم نخواهد شد. فقط باید وجود خود آرایه رو بررسی کنیم یعنی بررسی کنیم که آیا حداقل یک چک باکس انتخاب شده یا نه. وقتی برای آرایه کلید تعیین می کنیم، امکان مدیریت دسته بندی فیلدها خیلی بالا میره. روش استفاده مثل آرایه های انجمنی (Associative Arrays) در PHP هست.
—————————————
- <input type=”checkbox” name=”field_checkbox_multiple[]“ value=”checkbox multiple value ۱″ />
- <input type=”checkbox” name=”field_checkbox_multiple[]“ value=”checkbox multiple value ۲″ />
- <input type=”checkbox” name=”field_checkbox_multiple[]“ value=”checkbox multiple value ۳″ />
- <input type=”checkbox” name=”chkbx_multiple_with_key[parent]“ value=”chkbx mltpl with key1″ />
- <input type=”checkbox” name=”chkbx_multiple_with_key[parent]“ value=”chkbx mltpl with key2″ />
- if(isset($_POST['field_checkbox_multiple'])) {
- foreach($_POST['field_checkbox_multiple'] as $checkbox_multiple)
- echo $checkbox_multiple;
- }
- if(isset($_POST['chkbx_multiple_with_key']) {
- foreach($_POST['chkbx_multiple_with_key'] as $key => $checkbox_multiple_with_key)
- echo ”$key : $checkbox_multiple_with_key”;
- }
یک نوعی از منوی Select، حالت چندانتخابی یا Multiple هست که برای این حالت، نام فیلد حتما باید آرایه باشه و مقادیر هم بصورت عناصر این آرایه منتقل میشوند:
- <select name=”select_mulitple[]“ multiple=”multiple”>
- <option value=”option ۱″>Opt1</option>
- <option value=”option ۲″>Opt2</option>
- <option value=”option ۳″>Opt3</option>
- <option value=”option ۴″>Opt4</option>
- </select>
- foreach($select_mulitple as $select) {
- echo $select;
- }
و اما آپلود که فقط با متد POST قابل اجراست و اطلاعات فایل رو داخل آرایه FILES_$ میریزه.
- <input type=”file” name=”field_file” MAX_FILE_SIZE=”2000000″ />
- if(isset($_FILES['field_file'])) {
- $file_name = $_FILES["field_file"]["name"];
- $file_type = $_FILES["field_file"]["type"];
- $file_size = $_FILES["field_file"]["size"];
- $file_tmp_name = $_FILES["field_file"]["tmp_name"];
- $file_error = $_FILES["field_file"]["error"];
- }
یه نکته برای داونلود همزمان چند فایل توسط آرایه وجود داره و اونهم شکل آرایه FILES_$ در زمان آپلود چند فایله. به شکل آرایه در این حالت، خیلی خوب دقت کن.
- <input type=”file” name=”field_file_multiple[]“ MAX_FILE_SIZE=”2000000″ />
- <input type=”file” name=”field_file_multiple[]“ MAX_FILE_SIZE=”2000000″ />
- if(isset($_FILES['field_file_multiple'])) {
- $file_name_1 = $_FILES["field_file_multiple"]["name"][0];
- $file_type_1 = $_FILES["field_file_multiple"]["type"][0];
- $file_size_1 = $_FILES["field_file_multiple"]["size"][0];
- $file_tmp_name_1 = $_FILES["field_file_multiple"]["tmp_name"][0];
- $file_error_1 = $_FILES["field_file_multiple"]["error"][0];
- $file_name_2 = $_FILES["field_file_multiple"]["name"][1];
- $file_type_2 = $_FILES["field_file_multiple"]["type"][1];
- $file_size_2 = $_FILES["field_file_multiple"]["size"][1];
- $file_tmp_name_2 = $_FILES["field_file_multiple"]["tmp_name"][1];
- $file_error_2 = $_FILES["field_file_multiple"]["error"][1];
- }
- <input type=”reset” name=”field_reset” value=”Reset” />
- <input type=”image” name=”field_img” value=”Image” />
- <input type=”button” name=”field_button” value=”Button To Click” />