Boplo.ir
rss

من در Facebook


جستجو


آخرین مطالب

مطالب همینجوری

بر و بچ

MyView Tween

دوستشون دارم

بیلبورد

دامین برای فروش: CleanCode.ir
FastFeed.ir
Fonvi.com

تماس


انواع و اقسام سفارشات طراحی و برنامه نویسی سایت پذیرفته میشه. از سایت حمایت از خرگوشهای صورتی گرفته تا سایت قاچاق اعضای بدن!
تماس

 

از بيماران سرطاني حمايت كنيم

A new begining
AHHP presents

 

آدرس کوتاه: http://Boplo.ir/:91

نحوه کار با فرمها در PHP. یکبار برای همیشه!
۲۹ اردیبهشت ۱۳۸۹ ساعت ۰۱:۴۷

پی اچ پی
سر و کله زدن با همه نوع ورودی فرمها در 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 با اونهاست. لطفا خوب، خط به خط این فرم رو مطالعه کن (مهمه!).

    <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 1">Opt1</option>
    		<option value="option 2">Opt2</option>
    		<option value="option 3">Opt3</option>
    		<option value="option 4">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 1" />
    	<input type="radio" name="field_radio" value="radio value 2" />
    	<input type="radio" name="field_radio" value="radio value 3" />
    	
    	
    	
    	
    	<input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 1" />
    	<input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 2" />
    	<input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 3" />
    	
    	<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 1">Opt1</option>
    		<option value="option 2">Opt2</option>
    		<option value="option 3">Opt3</option>
    		<option value="option 4">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>

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


    فیلدهای 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 1">Opt1</option>
    	<option value="option 2">Opt2</option>
    	<option value="option 3">Opt3</option>
    	<option value="option 4">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 1" />
    <input type="radio" name="field_radio" value="radio value 2" />
    <input type="radio" name="field_radio" value="radio value 3" />
    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 1" />
    <input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 2" />
    <input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 3" />
    
    <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 1">Opt1</option>
    	<option value="option 2">Opt2</option>
    	<option value="option 3">Opt3</option>
    	<option value="option 4">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"];
    }
    لازم به ذکره که وجود مشخصه MAX_FILE_SIZE در فرم قطعی نیست و نمیشه کاملا بهش اطمینان کرد و مقدارش هم به بایت باید باشه.

    یه نکته برای داونلود همزمان چند فایل توسط آرایه وجود داره و اونهم شکل آرایه 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];
    }

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

    <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" />

    این پست به نظرم یکم بی مزه شد ولی امیدوارم واسه تو که تا اینجاش خوندی، مفید بوده باشه.

     

    تو چی فکر می کنی؟

    
    ماهان : سلام !. چطوری !. حال می کنم با مطالبت. راستی من که 3سال پیش شروع کردم زبون ها تحت وب رو یاد بگیرم این مطئله که الآن توضیح دادی برام یه کوه بود !. کاش می شد اونموقع این مطلب رو می دادی. من حدود. بهترین پستت اون کلاس تبدیل تاریخ بود ! من با اون زندگی کردم. راستی اگه تونستی استفاده از Ext JS رو هم پست بده خیلی بدرد بخوره و البته کلی خفن + طولانی !. فعلا. من سایتت رو می بینیم، پست بده.
    (4 سال و 6 ماه و 6 روز و 14 ساعت و 2 دقیقه پیش)
    
    محمد جعفر : با جی کوئری، چطور میشه کد HTML تولید شده توسط ادیتور تاینی ام سی ای رو بدست اورد؟(می خواهم محتوا به صورت ایجکس فرستاده بشه، یکی از فیلد ها textarea است که روش تاینی ام سی ای پیاده شده)
    (4 سال و 4 ماه و 16 روز و 20 ساعت و 51 دقیقه پیش)
    
    امیرحسین : برای گرفتن محتوا میتونید از متد getContent استفاده کنید:
    http://wiki.moxiecode.com/index.php/TinyMCE:API/tinymce.Editor/getContent
    غیر از اون، خود TinyMCE امکانات AJAX داره. لینک زیر رو ببینید:
    http://wiki.moxiecode.com/index.php/TinyMCE:Turn_tinyMCE_into_an_Ajax_editor
    (4 سال و 4 ماه و 16 روز و 1 ساعت و 25 دقیقه پیش)
    
    homa : ممنون مقاله خیلی خوبی هست.
    این قسمت اررور میده:
    if(isset($_POST['field_checkbox_multiple']) {
    foreach($_POST['field_checkbox_multiple'] as $checkbox_multiple)
    echo $checkbox_multiple;
    }
    اررور پارسر میده
    (4 سال و 4 ماه و 16 روز و 17 دقیقه پیش)
    
    امیرحسین : اون IF یک پرانتز کم داشت.
    ممنون
    (4 سال و 4 ماه و 16 روز و 11 دقیقه پیش)
    
    مهدی : دوست عزیز ممنون از توضیحات داخل سایتت موفق باشی
    (3 سال و 7 ماه و 19 روز و 20 ساعت و 9 دقیقه پیش)
    
    niloufar : ali bud.mamnun
    (3 سال و 6 ماه و 18 روز و 2 ساعت و 59 دقیقه پیش)
    
    milad : مطلبتون عالی بود.
    (3 سال و 6 ماه و 6 روز و 20 ساعت و 25 دقیقه پیش)
    
    hasti : سلام. در منوهای فرم در phpوقتی عبارتی مینویسم که بین آن عبارت spaceوجود دارد بعد از echo کردن آن فقط عبارت اول یعنی قبل از spaceرا نشان میدهد. جکارکنم؟
    (3 سال و 3 ماه و 15 روز و 21 ساعت و 2 دقیقه پیش)
    
    یک دوست : hi
    (2 سال و 6 ماه و 25 روز و 13 ساعت و 16 دقیقه پیش)
    
    mahya : خیلی ممنونم خیلی خوب بود
    (2 سال و 5 ماه و 28 روز و 12 ساعت و 52 دقیقه پیش)
    
    b & b : سلام.
    خیلی عالی بود...
    واقعا ممنون.
    (1 سال و 8 ماه و 2 روز و 23 ساعت و 52 دقیقه پیش)
    
    r-h : مرسی خیلی خوب بود
    (1 سال و 7 ماه و 17 روز و 2 ساعت و 3 دقیقه پیش)
    
    morteza : با سلام و وقت بخیر

    دستتون درد نکنه . . . واقعا خوب بود.
    استفاده کردیم

    موفق و سربلند باشید.
    (1 سال و 1 ماه و 12 روز و 3 ساعت و 41 دقیقه پیش)
    
    اسی : عالی بود.
    دستت درد نکنه. کارم راه افتاد.
    (11 ماه و 16 روز و 1 ساعت و 39 دقیقه پیش)
    
    mostafa : با سلام
    دمت گرم
    ایشالا وقتی سایتمو زدم حتما داخلش از شما وسایتت تشکر میکنم
    (9 ماه و 19 روز و 18 ساعت و 28 دقیقه پیش)
    
    bita : خوب بود.اقا امیر حسین شما چیزی از دستورات شرطی علامت سوال میدونید؟
    (7 ماه و 22 ساعت و 9 دقیقه پیش)
    
    sayna : عالی بود.واقعا برام مفید بود.خیلی ممنون
    (6 ماه و 10 روز و 14 ساعت و 8 دقیقه پیش)
    
    raha : سلام خیلی مفید بود ممنونم فقط ی سوال که اگه زودتر جواب بدید خیلی ممنون میشم برای گرفتن اطلاعات label یا span باید چکار کنیم؟ منتظر هستم
    (3 ماه و 8 روز و 2 ساعت و 27 دقیقه پیش)
    
    یک دوست : توروخدا رنگ پس زمینه و فونت سایترو عوض کن ببینم چی می گی.
    (1 ماه و 24 روز و 23 ساعت و 1 دقیقه پیش)

     

    me

    امیرحسینم. اسمم رو دوست دارم، خودم رو دوست دارم. تهران زندگی می کنم. فارغ التحصیل مهندسی صنایع هستم. برنامه‌نویسی و طراحی وب می کنم. در واقع Web Developer محسوب میشم. برنامه نویسی و وقت گذرونی با وب تنها کاریه که خسته ام نمی کنه.
    آدم خیلی سردی هستم، اینو دور و وری هام میگن. ولی به نظر خودم سرد نیستم در واقع گرمای خودم رو کم بروز می دم! آدما رو اغلب دوست دارم غیر از اون مواقعی که اونا من رو نادیده میگیرن!

    این سایت رو بعد از کلی اینور اونور دوباره راه انداختم تا هرچی دوست دارم توش بنویسم، چه کسی بخونه چه نخونه.
    خلاصه اینجا خونه منه،

    به خونه امیرحسین خوش اومدی...

    MODx | Template World

    Powered by MODx