تبلیغات
وبلاگ میلاد داودآبادی - نحوه کار با فرمها در PHP. یکبار برای همیشه! یاد بگیرید خواهشن !!!
وبلاگ میلاد داودآبادی

نحوه کار با فرمها در PHP. یکبار برای همیشه! یاد بگیرید خواهشن !!!

یکشنبه 10 بهمن 1389

نویسنده: میلاد داودآبادی | طبقه بندی:php، 

خوب به نظرم بهتره یک وب سایت شخصی برام خودم بزنم تا اینکه کد ها رو  انقدر قاطی در وبلاگم بزارم. فعلا چاره ای نیست ... 

سر و کله زدن با فرم در PHP از اون مبحثهایی هست که زیاد درباره اش سوال پیش میاد مخصوصا برای کاربران تازه کار. توی این مقاله میخوایم همه سوراخ سمبه های فرمها رو با PHP کشف کنیم. انواع فیلد و ورودی رو معرفی می کنم و شیوه دسترسی به مقدارشون در PHP رو هم توضیح میدم.

اول از تگ 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 حداکثر میتونه 2083 کاراکتر باشه.
      در روش GET، چون اطلاعات فرم کد نمیشوند و ساده منتقل میشوند پس یک مقدار ناچیزی سبکتره!. اطلاعات فرم در این حالت، توسط آرایه GET_$ در PHP قابل دسترسیه. همچنین در روش GET از Upload خبری نیست، یعنی با GET نمیشه آپلود کرد.
    • POST: این روش اطلاعات رو کد می کنه. چیزی به URL اضافه نمی کنه. محدودیت خاصی نداره و امکان آپلود فقط از طریق این روش ممکنه. اطلاعات این روش در PHP توسط آرایه POST_$ قابل دسترسیه.
  • enctype: روش کد کردن اطلاعات که یکی از مقادیر زیر میتونه باشه:
    • application/x-www-form-urlencoded: این حالت پیش فرض روش POST.
    • multipart/form-data: ارسال اطلاعات بدون کد کردن. آپلود فقط با این روش امکانپذیره!
    • text/plain: شبیه حالت اول ولی کاراکترهای اسکی رو کد نمی کنه.
    این مشخصه تقریبا هیچوقت بکار نمیاد غیر از زمان آپلود که از حالت دومش استفاده میشه.
  • یک توضیح کوتاه: توابع معمول برای چک کردن اطلاعات isset و empty هستند. اگر دقیق نمی دونی، تابع isset فقط موجود بودن یا null بودن متغیر رو چک می کنه. یعنی اگر متغیری اصلا وجود نداشته باشه یا برابر null باشه، این تابع FALSE میده و در غیر اینصورت همیشه TRUE میده. تابع empty با مقدار هم کار داره یعنی مقدار خالی یا صفر رو هم تشخیص میده

    حالا فرم زیر رو ببین. این فرم همه جور فیلد و ورودی به دردبخور رو به انواع مختلف داره. میخوایم این فرم رو در PHP پردازش کنیم. روش چیدمان فیلدها، براساس نوع رفتار PHP با اونهاست. لطفا خوب، خط به خط این فرم رو مطالعه کن (مهمه!).

    توضیحات بیشتر در ادامه مطلب .

    1. <form action="submit.php" method="POST" enctype="multipart/form-data">  
    2.       
    3.     <input type="text" name="field_text" value="" />  
    4.     <input type="password" name="field_password" value="" />  
    5.     <textarea name="textarea"></textarea>  
    6.     <input type="submit" name="button_submit" value="Submit Form" />  
    7.     <select name="select_single">  
    8.         <option value="option 1">Opt1</option>  
    9.         <option value="option 2">Opt2</option>  
    10.         <option value="option 3">Opt3</option>  
    11.         <option value="option 4">Opt4</option>  
    12.     </select>  
    13.     <input type="hidden" name="field_hidden" value="some hidden data" />  
    14.       
    15.       
    16.     <input type="checkbox" name="field_checkbox_single" value="checkbox single value" />  
    17.     <input type="radio" name="field_radio" value="radio value 1" />  
    18.     <input type="radio" name="field_radio" value="radio value 2" />  
    19.     <input type="radio" name="field_radio" value="radio value 3" />      
    20.       
    21.     <input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 1" />  
    22.     <input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 2" />  
    23.     <input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 3" />  
    24.       
    25.     <input type="checkbox" name="chkbx_multiple_with_key[parent]" value="chkbx mltpl with key1" />  
    26.     <input type="checkbox" name="chkbx_multiple_with_key[parent]" value="chkbx mltpl with key2" />  
    27.       
    28.     <select name="select_mulitple[]" multiple="multiple">  
    29.         <option value="option 1">Opt1</option>  
    30.         <option value="option 2">Opt2</option>  
    31.         <option value="option 3">Opt3</option>  
    32.         <option value="option 4">Opt4</option>  
    33.     </select>  
    34.       
    35.     <input type="file" name="field_file" MAX_FILE_SIZE="2000000" />  
    36.     <input type="file" name="field_file_multiple[]" MAX_FILE_SIZE="2000000" />  
    37.     <input type="file" name="field_file_multiple[]" MAX_FILE_SIZE="2000000" />  
    38.       
    39.     <input type="reset" name="field_reset" value="Reset" />  
    40.     <input type="image" name="field_img" value="Image" />  
    41.     <input type="button" name="field_button" value="Button To Click" />  
    42.   
    43. </form> 

    از خط اول. همونطور که میبینی action فرم روی submit.php تنظیم شده و method روی POST (چون میخوایم Upload هم داشته باشیم). پس باید فایل submit.php وجود داشته باشه که اطلاعات ارسالی این فرم رو بگیره.

    فیلدهای text، password، submit، select، hidden و textarea همیشه وجود دارند یعنی اگر پر بشوند با مقدار فرستاده میشوند در غیر اینصورت خالی فرستاده میشوند یعنی استفاده از تابع isset برای این فیلدها همیشه مقدار TRUE خواهد بود و تابع مناسب براشون empty هست. یعنی با تابع empty راحت می تونیم چک کنیم که کاربر فیلد رو پر کرده یا خیر. دسترسی به اطلاعات این فیلدها به ساده ترین شکل ممکن انجام میشه:


    1. <input type="text" name="field_text" value="" />  
    2. <input type="password" name="field_password" value="" />  
    3. <textarea name="textarea"></textarea>  
    4. <input type="submit" name="button_submit" value="Submit Form" />  
    5. <select name="select_single">  
    6.     <option value="option 1">Opt1</option>  
    7.     <option value="option 2">Opt2</option>  
    8.     <option value="option 3">Opt3</option>  
    9.     <option value="option 4">Opt4</option>  
    10. </select>  
    11. <input type="hidden" name="field_hidden" value="some hidden data" />
    ---------------------------------------------------------------------------
    1. $field_text = $_POST['field_text'];  
    2. $field_password = $_POST['password'];  
    3. $textarea = $_POST['textarea'];  
    4. $submit = $_POST['submit'];  
    5. $select_single = $_POST['select_single'];  
    6. $field_hidden = $_POST['field_hidden'];
    ---------------------------------------------------------------------------
    چک باکس و فیلدهایی رادیویی، تا وقتی علامت زده نشدند، به سرور فرستاده نمیشوند! پس اول باید چک کنیم که وجود دارند یا نه. اینجا تابع isset بکار میاد. البته اینکار رو با همون تابع empty هم می تونیم انجام بدیم همونطور که توی فرم مشاهده کردی و میدونی، ورودی های رادیویی چون فقط یکیشون قابل انتخابه، باید همنام باشند تا اونجوری که باید، کار کنند.
    1. <input type="checkbox" name="field_checkbox_single" value="checkbox single value" />  
    2. <input type="radio" name="field_radio" value="radio value 1" />  
    3. <input type="radio" name="field_radio" value="radio value 2" />  
    4. <input type="radio" name="field_radio" value="radio value 3" />
    ------------------------------------------------------------------------
    1. if(isset($_POST['field_checkbox_single']))  
    2.     $field_checkbox_single = $_POST['field_checkbox_single'];  
    3.   
    4. if(isset($_POST['field_radio']))  
    5.     $field_radio = $_POST['field_radio']; 
    -----------------------------------------------------------------------
    وقتی چک باکسهای زیادی داشته باشیم، معمولا استفاده از آرایه بهتره. برای این دسته، با یک آرایه مواجهیم. عناصر این آرایه نیازی به چک کردن با isset نداره چون اگر چک باکسی انتخاب نشه، وارد این آرایه هم نخواهد شد. فقط باید وجود خود آرایه رو بررسی کنیم یعنی بررسی کنیم که آیا حداقل یک چک باکس انتخاب شده یا نه. وقتی برای آرایه کلید تعیین می کنیم، امکان مدیریت دسته بندی فیلدها خیلی بالا میره. روش استفاده مثل آرایه های انجمنی (Associative Arrays) در PHP هست.
    ---------------------------------------
    1. <input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 1" />  
    2. <input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 2" />  
    3. <input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 3" />  
    4.   
    5. <input type="checkbox" name="chkbx_multiple_with_key[parent]" value="chkbx mltpl with key1" />  
    6. <input type="checkbox" name="chkbx_multiple_with_key[parent]" value="chkbx mltpl with key2" />
    ----------------------------------------------------------
    1. if(isset($_POST['field_checkbox_multiple'])) {  
    2.     foreach($_POST['field_checkbox_multiple'as $checkbox_multiple)  
    3.         echo $checkbox_multiple;  
    4. }  
    5.   
    6. if(isset($_POST['chkbx_multiple_with_key']) {  
    7.     foreach($_POST['chkbx_multiple_with_key'as $key => $checkbox_multiple_with_key)  
    8.         echo "$key : $checkbox_multiple_with_key";  

    ---------------------------------------------------------------------
    یک نوعی از منوی Select، حالت چندانتخابی یا Multiple هست که برای این حالت، نام فیلد حتما باید آرایه باشه و مقادیر هم بصورت عناصر این آرایه منتقل میشوند:
    1. <select name="select_mulitple[]" multiple="multiple">  
    2.     <option value="option 1">Opt1</option>  
    3.     <option value="option 2">Opt2</option>  
    4.     <option value="option 3">Opt3</option>  
    5.     <option value="option 4">Opt4</option>  
    6. </select>

    -----------------------
    1. foreach($select_mulitple as $select) {  
    2.     echo $select;  


    --------------------------------------------------

    و اما آپلود که فقط با متد POST قابل اجراست و اطلاعات فایل رو داخل آرایه FILES_$ میریزه.


    1. <input type="file" name="field_file" MAX_FILE_SIZE="2000000" /> 
    ---------------------
    1. if(isset($_FILES['field_file'])) {  
    2.     $file_name = $_FILES["field_file"]["name"];  
    3.     $file_type = $_FILES["field_file"]["type"];  
    4.     $file_size = $_FILES["field_file"]["size"];  
    5.     $file_tmp_name = $_FILES["field_file"]["tmp_name"];  
    6.     $file_error = $_FILES["field_file"]["error"];  

    لازم به ذکره که وجود مشخصه MAX_FILE_SIZE در فرم قطعی نیست و نمیشه کاملا بهش اطمینان کرد و مقدارش هم به بایت باید باشه.

    یه نکته برای داونلود همزمان چند فایل توسط آرایه وجود داره و اونهم شکل آرایه FILES_$ در زمان آپلود چند فایله. به شکل آرایه در این حالت، خیلی خوب دقت کن.

    1. <input type="file" name="field_file_multiple[]" MAX_FILE_SIZE="2000000" />  
    2. <input type="file" name="field_file_multiple[]" MAX_FILE_SIZE="2000000" />

    1. if(isset($_FILES['field_file_multiple'])) {  
    2.     $file_name_1 = $_FILES["field_file_multiple"]["name"][0];  
    3.     $file_type_1 = $_FILES["field_file_multiple"]["type"][0];  
    4.     $file_size_1 = $_FILES["field_file_multiple"]["size"][0];  
    5.     $file_tmp_name_1 = $_FILES["field_file_multiple"]["tmp_name"][0];  
    6.     $file_error_1 = $_FILES["field_file_multiple"]["error"][0];  
    7.       
    8.     $file_name_2 = $_FILES["field_file_multiple"]["name"][1];  
    9.     $file_type_2 = $_FILES["field_file_multiple"]["type"][1];  
    10.     $file_size_2 = $_FILES["field_file_multiple"]["size"][1];  
    11.     $file_tmp_name_2 = $_FILES["field_file_multiple"]["tmp_name"][1];  
    12.     $file_error_2 = $_FILES["field_file_multiple"]["error"][1];  

    در فرم، عناصری هم هستند که مقداری در PHP ندارند. البته اگر button مقدار مشخصه typeاش برابر submit باشه، کار دکمه submit معمولی رو می کنه و نوع image هم مثل submit عمل می کنه ولی مختصات x و y محل کلیک شدن روی دکمه رو هم قاطی اطلاعات ارسال می کنه.

    1. <input type="reset" name="field_reset" value="Reset" />  
    2. <input type="image" name="field_img" value="Image" />  
    3. <input type="button" name="field_button" value="Button To Click" />


    ← آخرین پستها

    ← نویسندگان

    ← ابر برچسبها