تاریخچه
کمتر کاربر اینترنت را میتوان یافت که تاکنون با صفحاتی با پسوندPHP برخورد نکرده باشد و البته این پسوند نامی آشنا برای طراحان و برنامه نویسان وب است.
پی اچ پی (PHP) یکی از محبوبترین و رایجترین زبانهای برنامه نویسی برای ایجاد صفحات پویا در وب است و کمتر خواستهای در محیط وب وجود دارد که در PHP قادر به انجام آن نباشیم.
از ایجاد یک صفحه ساده برای پردازش اطلاعات فرمها، ارتباط با بانکهای اطلاعات، کار با سوکتهای TCP، پردازش فرمتهای PDF وZIP و حتی تصویر بخشی از توانایی این زبان است.
PHP در سال 1994 توسط Lerdorf Rasmus و برای استفاده شخصیاش ایجاد شد.
او بعدها و در سال 1995 نسخه حرفهایتر از مفسر زبان PHP به نام Version 2 PHP/FI را عرضه کرد، و در سال 97 تعداد سایتهایی که از PHP استفاده میکردند به بیش از 50000 رسید و امرازه نیز میلیونها سایت از آن استفاده میکنند.
سایتهای مشهوری چون Alltheweb و mamma از این زبان استفاده میکنند و حتی Yahoo نیز در حال استفاده از این زبان برای توسعه وب سایتهای خود است.
PHP زبانی برای سیستم عاملها
یکی از برترین مزایای زبان PHP سازگاری آن با اکثر سیستم عاملها و نرمافزارهای وب سرار (مانند IIS و Apache) است.
برخی از دیگر زبانها و تکنولوژیها مانند ASP محدود به سیستم عامل windows است و پشتیبانی از آن در دیگر سیستم عاملها بسیار پر هزینه و محدود است، و برخی نیز مانند JSP مشکلاتی با برخی نرمافزارهای وب سرار دارد.
ساختار و امکانات PHP به شکل مستقل از سیستم عامل شکل گرفته است و این بدان معنا است که به طور مثال برنامهنویس میتواند اسکریپت خود را تحت سیستم عامل ویندوز نوشته و تست کند و سپس آنرا بدون تغییر به سیستم عامل یونیکس یا لینوکس انتقال دهد.
درPHP امکان استفاده از برخی از امکانات خاص سیستم عاملهای مشهور نیز در نظر گرفته است که برای نمونه میتوان از پشتیبانی از تکنولوژی DCOM و یا Windows API نام برد.
نسخههای جدید مفسر PHP سازگار با دیگر تکنولوژیهای خاص وبسرارها مانند ISAPI نیز میباشد.
PHP رایگان و Open Source
تهیه برنامه مفسر PHP برای همه سیستم عاملها رایگان است و علاقهمندان میتوانند آخرین نسخه مفسر این زبان را از سایت رسمی PHP بارگذاری (Download) کند.
همچنین امکان تهیه رایگان سورس مفسر PHPنیز فراهم است ، و این مسئله علاوه بر این که در گسترش امکانات این زبان بسیار موثر بوده است، مزیتی برای شرکتها و توسعه دهندگان برای انتخاب این زبان است چرا که پشتیبانی و اعتماد به آن را راحتتر کرده است.
بسیاری از ویرایشگرهای حرفهای این زبان نیز یا رایگان هستند و یا با هزینه بسیار کم میتوان آنها را تهیه کرد، در حالی که دیگر تکنولوژیها، مثلاً تهیه پلات فرمهای جاوا هزینه هنگفتی دارد و همچنین کار حرفهای با تکنولوژی .NET نیز نیاز به تهیه Visual Studio.NET و پرداخت هزینه چند صد دلاری است.
سرعت بالای تفسیر و اجرای PHP یکی از سریعترین زبانها در نوع خود است.
تفسیر و اجرای یک اسکریپ php به طور متوسط تا سه و چهار برابر یک اسکریپ ASP است.
(البته باید در نظر داشته باشیم که IIS با Cach اسکریپتهای ASP سرعت اجرای آنها را در دفعات بعد بالا میبرد) همچنین در ASP استفاده زیادی از اشیا COM میشود که باعث کاهش سرعت و مصرف منابع سیستم میشود در حالی که در PHP بسیاری از امکانات و حتی برقراری ارتباط با یکی محبوبترین نرمافزار مدیریت بانکهای اطلاعاتی mySql به صورت توکار نهاده شده است.
شرکت Zend که تهیه کننده فعلی موتور مفسر و پشتیبانی کننده آن است، محصولات دیگری را نیز در جهت بهینه کردن سرعت اجرای PHP ارائه کرده است این محصولات با افزایش سرعت تفسیر و همچنین ذخیره کردن نتیجه تفسیر (Cash) باعث افزایش چندین برابر اجرای آن میشوند.
ساختار مناسب و امکانات بالا در PHP همان طور که در ابتدای مقاله اشاره شد، کمتری نیازی در برنامهنویسی تحت وب وجود دارد که در PHP امکان رفع آن نباشد.
PHP شامل کتابخانهای غنی از توابعی است که امکان پردازش اطلاعات فرمها، کار با بانکهای اطلاعاتی، فایلهای متنی و باینری، فایلهای گرافیکی، PDF، ZIP و پراتکلهای TCP، FTP، DNS،SMTP و ...
را برای برنامهنویس فراهم میکند، این را مقایسه کنید با ASP که به طور مستقل امکان Upload File ، ارسال ایمیل یا کار با فایلهای باینری را ندارد.
همچنین PHP یکی ازبهترین پشتیبانیها را از نرمافزارهای بانک اطلاعات دارد.
mySql , SqlServer , mSql , dBase, Oracle , IBMDB2, PostgreSQL , InterBase و بسیاری از نرمافزارهای دیگر در PHP قابل استفاده هستند و البته امکان کار با ODBC و COM برا ی استفاده از بانکهای Ms Access و دیگر محصولات نیز هست.
قدرت زبان PHP تنها در کتابخانه توابع آن نیست، پشتیبانی بسیار خوب از برنامهنویسی شیءگرا (OOP) و کار آسان و سریع با متغیرها از مزایای دورنی این زبان است.
سرعت بالای تفسیر و اجرای PHP یکی از سریعترین زبانها در نوع خود است.
قدرت زبان PHP تنها در کتابخانه توابع آن نیست، پشتیبانی بسیار خوب از برنامهنویسی شیءگرا (OOP) و کار آسان و سریع با متغیرها از مزایای دورنی این زبان است.
معایب PHP حال که از حسن PHP گفتیم، بد نیست اشارهای نیز به برخی معایب آن داشته باشیم.
نحو (syntax) زبان PHP بسیار شبیه زبان C++ و Perl است.
این اگر چه باعث استقبال از این زبان توسط برنامهنویسان C و یا Perl شد، اما این نحو برای بسیاری از طراحان صفحات وب چندان آسان نیست و بسیاری معتقد هستند که تکنولوژی ASP و زبان VBScript آسانتر و قابل درک تراست و همچنین JSP و زبان جاوا نیز به دلیل محبوبیت و ساختار قدرتمند آن مورد توجه است.
یک اشکال دیگر PHP عدم پشتیبانی خوب آن از یونیکد و به خصوص زبان فارسی است، حتی آخرین نسخههای این زبان نیز امکان سورت(Sort) صحیح متون فارسی را ندارد.
البته این اشکال با کامپایل مجدد یا کمی برنامهنویسی قابل حل است.
از کجا شراع کنیم؟
تقریبا میتوان گفت اگر دارای هر سیستم عاملی هستید میتوانید استفاده و کار با این زبان را شراع کنید؛ تنها کافی است به سایت رسمی زبان PHP به آدرس http://www.php.net براید، و نسخه مفسر این زبان را با توجه به سیستم عامل خود بارگذاری (Download) کنید.
راهنما و مرجع دستورات و توابع این زبان در همین سایت قراردارد.
همچنین سایت http://www.IranPHP.net میتواند مکانی مناسب برای حل مشکلات و تماس با دیگر برنامهنویسان PHP باشد.
نصب PHP (نصب بررای windows 2000 server) نصب Apache وPHP بررای یک سرایس دهندۀ windows به علت محیط کار گرافیکی، ساده تر از نصب بر رای Linux می باشد.
همچنین شما لازم نیست که حتماً مدیر سرایس دهنده باشید.
شما میتوانید PHP را بر رای هر یک از ویندوزهای 95,98,ME,NT و یا 2000 نصب کنید.
برای این کارباید فایلهای مورد نیاز را ازسایتهای php وApache بارگذاری کنید.
همچنین برای نصب ساده تر، فایلهای php مخصوص windows نیز موجود است.
برای نصبApache وPHP 1- جدیدترین و با ثبات ترین نسخه های php وApache را در کامپیوتر خود بارگذاری کنید.
2- PHP را بر رای یک شاخه مناسب (مانند c:\php) باز کنید(unzip) .
برای این منظور شما احتیاج به یک نرم افزار برای باز کردن فایلهای فشرده شده (zip) دارید.
3- برای نصب Apache، برنامه نصب آنرا اجراکنید.
4- فایل php.ini-distرا از شاخه php به شاخه سیستم (مانندc:\windows) کپی کنید و نام آنرا بهphp.ini تغییر دهید.
5- برنامه Apache را اجراء کنید.
ساده ترین راه برای این منظور استفاده از منوی Start > Programs > Apache WebServer > Start Apache می باشد.
6- با استفاده از مرارگر ِوب خودApache و PHP را آزمایش کنید.
ساده ترین راه برای این منظور، تایپ آدرسhttp://Localhost/ در مرورگر خود می باشد.
همچنین شما می توانید از فایل test.php نیز برای آزمایش نصب موفق PHP استفاده کنید.
نکته: همچنین می توانید php را بر رای سرویس دهنده های دیگر وب، مانند IIS نیز اجراء کنید.
پیکربندی با وجود اینکه بهتر است در هنگام نصب، پیکربندیphp را نیز انجام دهید، اما شما می توانید بعد از نصب نیز بعضی از پارامتر را تغییر دهید.
فایل php.ini حاوی پارامترهایی برای چگونگی عملکرد php می باشد، شما می توانید با ویرایش این پارامترها و راه اندازی مجدد برنامه کاربردی سرایس دهندۀ ِوب خود، این پارامترها را تغییر دهید.
اگر شما بعد از تغییر این فایل با مشکلی مواجه شدید، می توانید مجدداً عملیات کپی کردن فایل php.ini-dist و تغییر نام آن به php.ini را انجام دهید.
برای اینکه php بتواند پایگاههای داده را پشتیبانی کند، از mcrypt () استفاده کند و یا موارد دیگر، شما باید کتابخانه ها و بسته های دیگری نیز بارگذاری کنید.
بعد از بارگذاری، شما باید مکان این کتابخانه ها یا بسته ها را در فایل php.ini مشخص کنید برای توضیحات بیشتر به « راهنمای php » مراجعه کنید.
تعریف از PHP در یک کلام: « PHP یک زبان برنامه نویسی اسکریپتی(script language ) مثل perl، قابل جاسازی یا تلفیق ( embedding ) در کدهای HTML (مثل جاوا اسکریپت) ، قابل اجرا بر روی سیستمهای مختلف مثل لینوکس و ویندوز، با کابردهای وسیع برای برنامه نویسی پیشرفته در وب است.» درضمن Server-side هم هست یعنی مثل ASP رای سرار اجرا و خراجی آن بصورت یک فایل HTML تحویل شما می شود بر خلاف JavaScript که Client-Side است.
پس لازم نیست مرارگر خاصیت اضافه ای داشته باشد.
اگر چه PHP syntax خودش را از C قرض!
گرفته، اما C++ و Perl و Java هم از عنایت ایشون بی نصیب نمونده اند.
شما اگر C بلدید می توانید تا آن کار کنید.
PHPو بانک اطلاعاتی از آنجائیکه برنامه نویسی حرفه ای بدون بانک اطلاعاتی ( database ) نمی شود، PHP هم با خیلی از بانک های اطلاعاتی رابطه دارد.
مثلاAdabas D, Ingres, Oracle (OCI7 and OCI8), dBase, InterBase, Ovrimos Empress FrontBase, PostgreSQL , FilePro (read-only), mSQL, Solid, Hyperwave, Direct MS-SQL, Sybase, IBM DB2, MySQL, Velocis, Informix, ODBC, Unix dbm .
بغیر از بانکهای اطلاعاتی، PHP کارهای زیر را مثل آب خوردن انجام میدهد: ساخت و پرداخت تصاویر، کارهای امنیتی، کار با کوکی ها، آپ.لود فایل، پردازش XML و هزارتا + یک کار دیگر.
چگونگی عملکرد PHP نوشتن یک برنامه PHP شبیه ایجاد یک صفحه HTML است و تنها با این تفاوت که کدهای این زبان در داخل صفحات و در بین کدهای HTML درج میشود و البته طبیعی است که یک فایل PHP میتواند تنها شامل کدهای PHP باشد.
با توجه به این که PHP یک زبان طرف سرایس دهنده است، و بنابراین برای اجرا، اسکریپتهای آن باید آنها را به کامپیوتر سرایس دهنده وب (مانند سیستم Windows 2000 و نرمافزار IIS) انتقال دهیم و حالا با تایپ نام فایل آن در گردشگر اینترنت میتوانیم آنرا اجرا و خراجی احتمالی را مشاهده کنیم.
طبیعی است که در سمت سرایسگیرنده (کاربر سایت) امکان مشاهده کدها وجود ندارد.
پس از درخواست برای اجرای یک اسکریپت PHP فایل حاوی کدهای PHP به برنامه مفسر PHP انتقال داده شده (معمولا php.exe) و این برنامه بعد از تفسیر و اجرای اسکریپت، نتیجه را به سمت کاربر میفرستد.
در زیر نمونهای از یک اسکریت ساده PHP درج شده است.
این برنامه پیغام ارسالی توسط کاربر را میگیرد (این پارامتر میتواند توسط یک فرم یا در نوار آدرس گردشگر اینترنت تایپ شود) و آن را در قالب HTML برای کاربر ارسال میکند.
کد HTML نتیجه حاصل که کاربرامکان مشاهد آنرا دارد: http://www.mysite.com/test.php?message=hello اسکریت PHP که در سمت سرویس دهنده اجرا میشود از آنجا که آموزش این زبان در این پروژه نمیگنجد، بنابراین در ادامه نگاهی به تاریخچه ، مزایا و احتمالا معایب آن خواهیم داشت.
نحوه استفاده به راحتی!
هرجا که خواستید، دستور مورد نظر را بین دو تا علامت "" میذارید .
اینطوری: مدلهای دیگری هم هست، ولی همین بهتره.
البته کافی است یکبار از یکی از دستورات PHPدران یک فایل HTML استفاده کرد، تا توانست برای همیشه فایل را به ".php" تغییر نوع دهید، تا بتواند رای سرار اجرا شود مگر اینکه...
یک مثال: چند نکته: اول: PHP case-sensetive است.
یعنی حساس به حراف.
پس $a و $A با هم فرق دارند.
دوم: تمام دستورات در PHP به سمیکالن " ; " ختم می شوند.
این را هیچ وقت فراموش نکنید.
سوم: اگر بخواهید توضیحات ( comments ) یک خطی داشته باشید، باید از دو علامت "//" استفاده کنید.
و اگر توضیحاتتان در چند خط باشند از "/*" در ابتدا و "*/" در انتهای توضیح.
چهارم: بین علامت کوتیشن (") و گیومه (') یک فرق کوچیک هست.
PHP محتوای بین کوتیشن را تحلیل و ترجمه میکند.
انواع متغیرها: PHP ، 8 نوع ( type ) دارد: boolean و integer و float و string و array و object و resource و NULL که پنج تای اولی پرکاربردتر هستند.
یک متغیر با گذاشتن علامت $ به اول یک اسم ساخته میشود!
دامنه تعریف متغیرها، در ناحیه ای است که تعریف می شوند.
بعدا که تعریف تابع را یاد گرفتید، می بینید که از یک متغیر سراسری همین جوری!
نمی شود در بدنه یک تابع استفاده کرد.
در ضمن PHP متغیرهای "از پیش تعریف شده" ( predefined ) دارد.
برای اینکه آنها را بینید کافی است کد زیر را بنویسید و اجرا کنید: مثلا $_SERVER['PHP_SELF'] که اسم فایل برنامه را بر می گرداند.
از این برای مستقل کردن کدهای برنامه از اسم فایل خیلی استفاده می شود.
یا $_SERVER['HTTP_USER_AGENT'] که نوع مرورگرتان را برمی گرداند.
یا $HTTP_POST_VARS و $HTTP_GET_VARS که برای ارتباط با فرم ها باید!
استفاده بشوند.
(البته می تونید از $_POST یا $_GET هم استفاده کنید، به شرطی که نسخه PHPبالاتر از 4.2 باشد) اولین تجربه!
برای اولین تجربه بد نیست!
که با کارکردن با فرم ( form ) آشنا شویم.
فرض کنید می خواهید اسم یکی را بگیرید و به او سلام کنید.
این فرم (مثلا hello.htm ) : این هم برنامه hello.php // hello.php $username= $HTTP_POST_ VARS['username']; // php 4 and later // you can use $_POST in php 4.2 instead $HTTP_POST_VARS echo " Hello dear ", $username; ?> آرایه ها: آرایه ها موجودات دوست داشتنی هر زبان هستند.
قبلا فقط می شد تنها عناصر همنوع را در یک آرایه قرار داد، اما در php می توان هر نوع داده ای ( از 8 نوع) را با هر نوع اندیسی (integer و string ) در یک آرایه جمع کرد.
به چند روش می شود، یک آرایه را تعریف کرد.
1.
$a= array( key => value, ….
); 2.
$a[key]= value; 3.
$a[]= value; چند مثال: ساختن یک آرایه خالی !
$a= array (); آرایه مشخصات یک نفر $a= array('name'=>'netvand', 'family'=>''netkadeh", 'age'=>22); همان آرایه بالا ی که با 3 تا دستور ساخته شده $a['name']= 'netvand'; $a['family']='netkadeh'; $a['age']= 22; اگر اندیسی برای آرایه مشخص نکنید، یعنی خانه صفرم [0].
$a[ ]=1; اما مقادیر بعدی بعد از آن به ترتیب قرار می گیرند.
یعنی [1] و [2] و… $a[ ]=2; $a[ ]= 3; برای اینکه ببینید آرایه ای که ساخته اید، چگونه عمل می کند از این دستور کمک بگیرید: متدوالترین دستوری که برای کار با آرایه ها به کار میرود، دستور foreach است.
foreach ( $arrayname as $key =>$value ) echo $value,""; foreacho ( $arrayname as $key ) echo $arrayname[$key], ""; دستورات بالا، مقدار عناصر آرایه را در سطرهای متوالی چاپ ( بخاطر ) می کنند.
توجه: در PHP تابعهای آماده زیادی برای کار رای آرایه نوشته شده که کافی است شما فقط طرز استفاده آنها را یاد بگیرید.
رشته ها: رشته را که می شناسید: مجموعه ای از کاراکترهاست که می تواند تا آنجا که ما بخواهیم بزرگ شود.
برای اینکه بتوانید از کاراکترهای escaped داخل رشته ها استفاده کنید باید قبل از آنها علامت (\) را قرار دهید.
مثلا: آخر خط (\n) ، سر خط (\r) ، بک اسلاش (\\) ، دلار (\$) و کوتیشن (\").
رشته را به سه روش می توان ایجاد کرد: اول: با علامت نقل قول.
(') دوم: با کوتیشن (دوتا نقل قول).
(") سوم: >> توجه کنید که: 1-اگر بخواهید داخل نقل قول (') از بک اسلش یا نقل قول استفاده کنید (که فقط همین دو تا را هم میشود استفاده کرد)، باید قبل آنها یک بک اسلش قرار دهید.
//output: I'll show your C:\*.* اگر بقیه را بگذارید خودشان را همراه یک اسلش نشان میدهند.
مثل متغیرها.
//output: in ghalate!
\n choon sare khat nemire.
2- همانطور که قبلا گفتیم، php متغیرهای داخل دوتا علامت نقل قول را expand نمی کند.
یعنی مقدارشان را جایگزین اسمشان نمی کند.
مثلا : $p= 'u don\'t see this!'; echo 'Oh!
$p.'; //output: Oh!
$p.
این تنها فرق رشته های نقل قولی با کوتیشنی است.
نگاه کنید: $php = 'PHP!'; echo 'first char is: '.$php[0]; //output: first char is: P echo 'last char is: '.$php{strlen($php)-1}; //output: last char is: !
$Ilike= "I like "; echo $Ilike.$php; $Ilike .= $php; // $Ilike= $Ilike.$php; echo $Ilike; //output: I like PHP!
?> خوب حتما فهمیدید که چگونه میشود حرف اول و آخر رشته را چاپ کرد و چطوری دو تا رشته را به هم چسباند (با علامت نقطه) و به یک رشته مقداری را اضافه کرد.
(با نقطه مساوی) .
عملگرها: تعداد زیادی عملگر وجود دارد (لازم نیست بشمارید) که برای کارکردن با "نوع" های مختلف داده ای بکار میرود.
معروفترین آنها عبارتند از: + و – و .
و * و / و % (عملگرهای ریاضی) = و =+ و =(برای مقداردهی اعداد و رشته ها) == (برابر) و =!
(مخالف) و = و (عملگرهای مقایسه ای)++و--(افزودن و کاستن) فقط در مواقع استفاده باید حق تقدم عملگرها را درنظر بگیرید.
ساختارهای کنترلی: تذکر خیلی مهم: معمولا چون بدنه این دستورات بیشتر از یک دستور دارند، حتما لازمه که بین دو تا آکولاد { } قرار بگیرند.
گذاشتن سمی کالن بعد از دستورات را هم که فراموش نمی کنید.
معروفتری نشانه ها عبارتند از: -- اگر: if (expr) statement توجه: پرانتزها همیشه لازم هستد.
مثال: if ($a > $b) echo $a; -- اگر، وگرنه: if (expr) statement else statement مثال: if ($a > $b) echo $a; else echo $b; -- هر وقت که: در این دستور، اگر فقط عبارت درست باشد، بدنه حلقه اجرا میشود.
while (expr) statement مثال: $a= 1; while ($a $a++; -- تا وقتی که: این دستور، بدنه را حداقل یکبار اجرا میکند تا به کنترل شرط برسد.
do statement while (expr); مثال: $a=1000; do $a--; while ($a == 0); -- برای: for (expr1; expr2; expr3) statement مثال: for ( $i =0; $i print($i); یا !
for ($i=0; $i نمونه دیگر: $first ?
$second : $third اگر $first درست باشد، مقدار $second و گرنه $third برگردانده می شود.
$b= ($a>=10) ?
$a: '0'.$a; /* output: $a=5 , $b=05 $a=20, $b=20 */ تابع: برای اینکه n تا دستور را k بار انجام بدیم و البته همه آن n تا دستور را k بار ننویسیم، می توانیم از تابع استفاده کنیم.
یکبار، آن n دستور را در یک تابع می نویسیم و هرجا که لازم شد، تابع را صدا می کنیم.
function function_name(arg_1, arg_2 , … ) { statements; return function_value } نکته: 1ـ اگر داخل تابع متغیری تعریف کنید، فقط داخل تابع معتبر است.
شما می تونید همنام با متغیرهای سراسری (آنهائی که داخل برنامه اصلی تعریف شده اند)، داخل تابع متغیر تعریف کنید.
برنامه هم از مقدار آنها استفاده خواهد کرد.
هیچ اشکالی هم ندارد!
2_ در نسخه های اخیر PHP ، حتی از متغیرهای سراسری هم نمی شود داخل تابع استفاده کرد مگر اینکه با global تاکید کنید که اینها سراسری هستند یا آنها را به صورت متغیرمرجع به تابع ارجاع بدید.
global $a, $b, $c; 3ـ پارامترهای تابع، متغیرهای داخلی محسوب میشوند و فقط داخل بدنه تابع معتبر هستند.
4ـ می تونید، به تابع پارامتر ندهید، یا پارامتر تابع را هم آنجا (هنگام تعریف تابع) مقداردهی کنید.
5ـ تابع شما می تواند، ظاهرا، مقداری را بر نگرداند (که خودش مقدار True را برمی گرداند).
چند نکته در مورد فرم ها: همانطور که می دانید، انتقال اطلاعات بین صفحات از طریق دو متد POST (برای فرمها) و GET (از طریق خط آدرس url) ها صورت می گیرد.
شما هر عنصری که در فرم استفاده کنید، اندیسی همنام با آن در $_POST (که یک آرایه است) ساخته می شود که شما باید درون برنامه از آن استفاده کنیند.
یک مثال پیچیده تر: // form2.php $do= $_GET['do']; if ($do == 'send') { $name= $_POST['name']; $comments= $_POST['comments']; $check= $_POST['check']; $which= $_POST['which']; $what= $_POST['what']; //do something you want with those.
} else { ?> "> Name: Comments: check this 1 2 I want this no, this is better both of them ?> اول: بجای ساختن دو تا فایل، هر دو تا را در یک برنامه که اسم آن را گذاشتم form2.php نوشتیم.
برای همین لازم شد تا از ساختار کنترلی if () { … } else { … } استفاده کنم.
دوم: در این فرمی که تعریف کردم، از همه عناصر یک فرم استفاده کردم.
به اسمها دقت کنید: name و comments و check و which و what و ding که یک فیلد مخفی است!.
سوم: $do= $_GET['do'] پارامتریه که قرار است از طریق خط آدرس به برنامه داده شود.
do به برنامه میگوید چه تصمیمی بگیرد و چه کار بکند.
چهارم: به مقدار action در تعریف فرم دقت کنیند.
action="" - علامت مساوی کار دستور echo را انجام میدهد.
یعنی مقدار متغیر را حساب می کند.
- متغیر $_SERVER['PHP_SELF'] نام برنامه را برمی گردونه.
این کار را برای مستقل کردن برنامه از اسم فایلش انجام دادم.
(شما هم همیشه این کار را انجام بدین.) - مقدار action بعد از اجرای برنامه می شود: form2.php?do=send پارامترهای خط آدرس: حتما نمونه هایی از این قبیل را دیده اید: http://netkadeh.persianblog.com/?date=13811019#206012 مثلا آدرس بالا، مقدار تاریخ را از طریق متغیر date به برنامه ارسال می کند.
در این مورد برنامه نویس، برای کوتاه کردن آدرس ( و احتمالا بالابردن امنیت!
) نام برنامه را حذف کرده.
شما می توانید فرض کنید default.asp یا بوده.
به هر حال برای بدست آوردن مقدار مقدار date در برنامه باید از این دستور استفاده کنید: $date= $HTTP_GET_VARS['date']; // since php 3.0 $date= $_GET['date']; // since php 4.1.0 کار باData Objecها درphp5 قسمت 1 امروزه کار با database یکی از مسائل روزمره برنامه نویسان وب به شمار می آید،از یک پردازش ساده فرم گرفته تا برنامه های کاربردی در مقیاس بزرگ (large-scale).
تقریبا در اکثر موارد از database استفاده می کنیم.
بعد از کارکردن روی چند پروژه، زمان زیادی طول نخواهد کشید که متوجه می شوید، چهار عمل اصلی ساده در کار با database به طور مرتب تکرار می شوند.این اعمال عبارتند از: پیداکردن و انتخاب رکوردها(SELECT) به روز رسانی رکوردهای جاری(UPDATE) افزودن رکوردهای جدید(INSERT) حذف رکوردها(DELETE) شما در جاهای مختلف برنامه مجبورید که یک Query را بازنویسی کرده و یا آن را از قسمت های قبلی برنامه Copy-Paste کرده و سپس تغییرات لازم را روی آن اعمال کنید.عده ای از برنامه نویسان ترجیح می دهند که از یک لایه انتزاعی (Abstraction Layer) مثل PEAR::DB و یا DBX استفاده کنند.استفاده از یک لایه انتزاعی چیز خوبی است اما هدف اصلی در آن ،این است که RDMBS را محو کند یا به اصطلاح Transparent سازد و برنامه شما مستقل از RDMBS شود.یک لایه انتزاعی، راهی برای مجردسازی(abstraction) ساختارdatabase شما ارائه نمی دهد.
اینجاست که یک لایه دسترسی مجزا می تواند مفید واقع شود.شما می توانید لایه دسترسی داده دا از راههای مختلف پیاده سازی کنید، اما در این پروژه ، توجه ما معطوف به Data Object ها می باشد.
مفهوم Data Object برگرفته از الگوهای طراحی به خوبی مستند شده( very well-documented design patterns) به نام Data Access Object و الگوهای شیء انتقال (Transfer Object) است.
این الگوها می توانند بسیار پیچیده باشند،اما با کمی تفکر می توانیم به راحتی از ایده ها و اهداف پایه ای آنها در php5 استفاده کنیم.
یک شیء داده(Data Object) چیست؟
همانطور که ذکر شد، ایده Data Object برگرفته از یک الگوی طراحی است.اگر نگاهی به الگوهای طراحی کنید، متوجه می شوید که تقریبا اغلب آنها بر مبنای شیءگرایی (object orientation)هستند.
در این جا می خواهیم از مدل شی ای جدید php5 استفاده گسترده ای داشته باشیم.همچنین برای مثالهای خود از MySQL استفاده می کنیم.
در اصل، هر Data Object یک کلاس کدنویسی شده است که یک table را در database شما به طور مستقیم مشخص می کند.
برای هر table یک کلاس خاص می نویسیم.کلاس،شامل متغیرهای عضو(مطابق با فیلدهای جدول) و مجموعه ای از توابع یا متدها(حداقل برای انجام ۴ عمل اصلی ذکرشده)می باشد.فرض کنید یک جدول ساده برای نگهداری مشخصات کاربر داریم: TABLE: User userId INT firstName VARCHAR(30) lastName VARCHAR(40) email VARCHAR(100) برای این جدول کلاسی تعریف می کنیم که شامل متغیرهای عضو مطابق با فیلدهای جدول باشد.
بهتر است که برای Data Object خود یک پیشوند بگذاریم (مثل User_DO ) تا آن را با کلاسهای هم نام دیگر اشتباه نگیریم.
(این یک الگوی رایج در php برای شبیه سازی namespae ها می باشد) class DO_User { public $userId; public $firstName; public $lastName; public $email; } مثال بالا یک سطر ساده از جدول را نشان می دهد.
اگر یک شیء Do_user را نمونه سازی(instantiate) کنیم،می توانیم یک سطر از داده ها را نگهداری کنیم.
حالا چطور اطلاعات را از database واکشی کرده و در این شیء ذخیره کنیم؟
برای این کار یک متد جدید به نام ()get به کلاس خود اضافه می کنیم تا از database برای یک کاربر خاص Query بگیریم.
ما از userID(کلید اولیه) هر کاربر به عنوان پارامتر استفاده می کنیم: class DO_User { public $userId; public $firstName; public $lastName; public $email; // This function will perform a select on the table looking for // a specific userId.
public function get($userId) { $sql = 'SELECT * FROM User WHERE userId=' .
mysql_escape_string($userId); $rs = mysql_query($sql); $row = mysql_fetch_array($rs); $this->userId = $row['userId']; $this->firstName = $row['firstName']; $this->lastName = $row['lastName']; $this->email = $row['email'] } } حالا با استفاده از این Data Object می توانیم با database خود تعامل داشته باشیم.هیچ نیازی با استفاده از SQL نیست.
مثال زیر اطلاعات مربوط به یک کاربر را دریافت و در Web Browser نمایش می دهد: get(5); ?> User Info Here is the user info: User ID userId?> First Name firstName?> Last Name lastName?> Email email?> همانطور که مشاهده می کنید استفاده از یک Data Object بسیار ساده است.
تابع ()get ای که اضافه کردیم یک Query ساده را انجام می دهد و یک کلید اولیه مشخص(userID ) جستجو می کند.
توجه کنید که چون از فیلد با کلید اولیه استفاده کردیم، تنها یک رکورد از داده ها را دریافت می کنیم و مقادیر آنها را در متغیرهای عضو کلاس قرار می دهیم.
در قسمت های بعدی در مورد دریافت چند سطر از رکوردها نیز بحث خواهیم کرد.
همانطور که تا اینجا دیدیم لایه دسترسی به داده ها و لایه انتزاع پایگاه داده دو چیز متفاوتند.
می توانید یکی از این دو لایه و یا حتی هر دو را برای بدست آوردن انعطاف (flexibility) بیشتر به کار ببرید.کار لایه انتزاع پایگاه داده، مخفی کردن RDBMS ای است که در پس زمینه در حال اجرا است.
اگر شما در نوشتن دستورات SQL خود، تبحر داشته باشید، به راحتی می توانید از یکdatabase server به دیگری کوچ کنید،بدون آنکه تغییری در فراخوانی های توابع یا SQL بدهید.Pear::DB این کار را به خوبی انجام می دهد.
لایه دسترسی به داده ها(Data Access Layer) روشی است برای مشخص کردن جداول خود، تا بتوانید بدون استفاده از SQL در Business layer برنامه خود(جایی که کد تمام توابع برنامه قرار می گیرد) با داده های جداول، تعامل داشته باشیدData Object ها ، گزینه خوبی برای لایه دسترسی به داده ها هستند زیرا از آنجا که رابطه مستقیم با جداول دارندد،می توانید بدون تغییر در آنها،چندین بار از آنها در طول برنامه خود استفاده کنید.
در قسمت قبل ، کلاسی با نام DO_User ساختیم ویک متد ساده برای دریافت رکورد بر اساس فیلد userId نوشتیم.در این قسمت به توسعه کلاسDO_User می پردایم: افزودن یک رکورد جدید(INSERT) در اینجا یک متد جدید به نام insert را به کلاس خود اضافه می کنیم.
این متد،یک رکورد جدید به جدول ما اضافه می کند: public function insert() { $sql = "INSERT INTO User SET firstName='" .
mysql_escape_string($this->firstName) .
"', lastName='" .
mysql_escape_string($this->lastName) .
"', email='" .
mysql_escape_string($this->email) .
"'"; mysql_query($sql); $this->userId = mysql_insert_id(); } ممکن است سوال کنید که اطلاعات برای درج شدن از کجا گرفته می شوند، زیرا تابع insert هیچ پارامتری ندارد!
جواب این است که قبل از فراخوانی این تابع باید متغیرهای عضو کلاس مقداردهی شده باشند به جز متغیر userId که بعد از افزودن رکورد جدید توسط تابع mysql_insert_id به آن مقدار می دهیم.
مثال زیر نحوه به کارگیری این متد را نشان می دهد: firstName = 'Jane'; $user->lastName = 'Doe'; $user->email = 'jane.doe@example.com'; $user->insert(); ?> INSERT Example The user was added to the User table.
The userId is: userId?> در مثال بالا ابتدا یک شیء از نوع DataObject را نمونه سازی می کنیم.سپس متغیرهای لازم را مقداردهی کرده و تابع insert را فراخوانی می کنیم.
ما می توانیم با به کارگیری توام دو متد get و insert یک رکورد را کپی کنیم.
می توانیم ابتدا یک تغییر جزئی در مقادیر بدهیم(مثلا آدرس ایمیل را عوض کنیم) و سپس رکورد را کپی کنیم: get(5); // Change the email address in the DataObject // NOTE: This doesn't affect the DB at all, // just the value in the DataObject $user->email = 'jdoe@example.com'; // Next, we call insert() to create a NEW record in the User table $user->insert(); ?> Copy Row INSERT Example The user was copied to the User table.
The userId is: userId?> مثال بالا نشان می دهد که با به کارگیری DataObject چقدر کار تعامل با پایگاه داده، آسان می شود.
9999999999999999999999999999999 بروز رسانی رکوردها(UPDATE) بازیابی یک رکورد،تغییر بعضی مقادیر و افزودن آن به صورت یک رکورد جدید کار ارزشمندی است اما در اکثر مواقع، شما نیاز به UPDATE کردن یک رکورد دارید.در این جا متدی به نام update به کلاس خود اضافه می کنیم: public function update() { $sql = "UPDATE User SET firstName='" .
"' WHERE userId=" .
mysql_escape_string($this->userId); mysql_query($sql); } این متد بسیار شبیه متد insert است.به مثال زیر توجه کنید: get(5); // Change the email address $user->email = 'janedoe@example.com'; // Perform the update $user->update(); ?> UPDATE Example The user updated.
The userId is: userId?> حذف سطرها(DELETE) در اینجا تابعی با نام delete به کلاس خود اضافه می کنیم: public function delete() { $sql = "DELETE FROM User WHERE userId=" .
mysql_escape_string($this->userId); mysql_query($sql); } کار کردن با delete مشابه update می باشد.این متد هم از فیلد کلید اولی یعنی userID استفاده می کند.
ارزش DataObject ها وقتی مشخص می شود که با آنها کار کنید!
در قسمت بعدی به متدهای پیچیده تر برای بسط کلاس خود می پردازیم.
کارباData Objectهادرphp5 قسمت3 در قسمت ۱و۲ به معرفی یک DataObject پرداختیم.کلاسی به نام DO_User تعریف کرده و متدهای حذف،اضافه و برازرسانی مرتبط با آن را برای یک سطر از رکوردها نوشتیم.
در این قسمت به بررسی پرس و جوهایی(Query)می پردازیم که بیش از یک سطر را برمی گردانند.
ساده ترین راش برای حل این مساله،ساخت آرایه ای از DataObject ها است که شامل تمام رکوردهای دریافتی باشد.این راه حل ممکن است در نگاه اول منطقی به نظر برسد اما اگرquery شما ۱۰۰۰۰ سطر و یا بیشتر را برگرداند چه اتفاقی می افتد؟
یک ارایه بسیار بزرگ از اشیاء احتیاج به حجم زیادی از حافظه دارد و بار زیادی را به host شما تحمیل می کند و ممکن است منجر به ازکارافتادن (Shut Down) سایت شما شود.پس بهتر است به فکر یک راه حل دیگر برای دریافت چند سطر ازداده ها باشیم: