IranPHP.net - First Persian PHP Resource

Listed on BlogShares

ورود
شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
به قسمت مقالات IranPHP.net خوش آمدید

امیدواریم مقالات مورد استفاده شما قرار گیرد
شما نیز میتوانید مقالات خود را به آدرس Articles at Iranphp.net بفرستید.
توجه کنید که فرمت مقالات شما باید HTML و یا متن ساده باشد.

PHP و فارسی | Template Engines
مقایسه با دیگر رقیبان | نمونه برنامه ها
نصب و تنظیم | کار با Database ها
کار با فایلها | کاربردی
برای هرگونه استفاده از امکانات سایت نیازی به اجازه نیست , مگر این که در زیر آن چیز دیگری گفته شده باشد. قدرت اين سايت در استفاده از Xoops است


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
به قسمت مقالات IranPHP.net خوش آمدید

امیدواریم مقالات مورد استفاده شما قرار گیرد
شما نیز میتوانید مقالات خود را به آدرس Articles at Iranphp.net بفرستید.
توجه کنید که فرمت مقالات شما باید HTML و یا متن ساده باشد.

PHP و فارسی | Template Engines
مقایسه با دیگر رقیبان | نمونه برنامه ها
نصب و تنظیم | کار با Database ها
کار با فایلها | کاربردی


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
مقالات قسمت مقایسه با دیگر رقیبان
در زیر مقالات فرستاده شده برای این بخش را ملاحضه میکنید

· ۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد (read: 3318 times)
· PHP و مقایسه آن با Perl CGIی (read: 2785 times)
· در آمدی بر زبان PHP (read: 1853 times)

[ بازگشت به صفحه اصلی مقالات ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
مقالات قسمت نصب و تنظیم
در زیر مقالات فرستاده شده برای این بخش را ملاحضه میکنید

· روش نصب PHP به همراه Apache HTTP سرور (read: 4065 times)
· روش نصب PHP بروى Windows ها (read: 5314 times)
· نصب PHP تحت Windows به چند روش (read: 4600 times)
· راهنمای کامل صب PHP بر روی windows (read: 3992 times)
· نکاتی مفید در مورد تنظیم php.ini (read: 2118 times)
· خصوصيات يك سرور خوب براي شما كه PHP كار هستيد (read: 1578 times)
· ماژول آپاچي mod_rewrite (read: 568 times)

[ بازگشت به صفحه اصلی مقالات ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
مقالات قسمت کاربردی
در زیر مقالات فرستاده شده برای این بخش را ملاحضه میکنید

· تابع mail در PHPی (read: 2748 times)
· PHP در مسیر شئ گرایی(قسمت اول) (read: 1611 times)
· تابع mail در PHP (read: 1294 times)
· توسعهء PHP (read: 1335 times)
· کلاسها در PHP چهار (read: 2609 times)
· ذخیره سازی مشخصات بازدید کنندگان (read: 2562 times)
· كارتهاي الكترونيكي با php وmysql م (read: 1960 times)
· ساخت ورودی تاریخ (read: 1585 times)
· شیی گرایی در PHP بخش نخست (read: 1618 times)
· Mebership System (read: 856 times)
· MD5 چيست؟ (read: 1236 times)
· Object Oriented Programming (read: 1051 times)
· نحوه دریافت و پرداخت پول به صورت آنلاین توسط e-gold (read: 1980 times)
· چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? (read: 1516 times)
· ساخت تصاوير امنيتي با php (read: 1114 times)
· آشنايي با SimpleXML (read: 871 times)
· آشنايي با PEAR (read: 1199 times)
· Session ها و مفهوم آنها (read: 887 times)
· تصاوير امنيتی قسمت دوم (read: 261 times)
· پیدا سازی رویداد گرایی در php (read: 467 times)
· تصدیق هویت کاربر (read: 576 times)
· مرور کلاس Config از مجموعه Pear (read: 156 times)
· کلاس Archive_Tar از مجموعه PEAR (read: 144 times)
· نگاهی به امنیت کوکیها و session ها (read: 229 times)

[ بازگشت به صفحه اصلی مقالات ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

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

· استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس (read: 9818 times)
· تقويم جلالی (read: 1007 times)

[ بازگشت به صفحه اصلی مقالات ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
مقالات قسمت کار با Database ها
در زیر مقالات فرستاده شده برای این بخش را ملاحضه میکنید

· نمایش چند صفحه ای اطلاعات (read: 4442 times)
· UPLOAD كردن MySQL س (read: 3087 times)
· SQLite پیشنهاد سبک وزن (read: 1641 times)
· شروعي ساده با MySQL پایگاه داده (read: 4375 times)
· استفاده از mysql بخش نخست (read: 4502 times)
· استفاده از mysql بخش پایانی (read: 3120 times)
· ساختن لینکدونی با تعداد دفعات کلیک (read: 1884 times)
· آشنايي با ماژول Mysqli در PHP 5 (read: 1638 times)
· بانكهاي اطلاعاتي تراكنشي (read: 441 times)

[ بازگشت به صفحه اصلی مقالات ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
مقالات قسمت کار با فایلها
در زیر مقالات فرستاده شده برای این بخش را ملاحضه میکنید

· مديريت فايل هاي ارسالي توسط كاربران (read: 3571 times)

[ بازگشت به صفحه اصلی مقالات ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
مقالات قسمت نمونه برنامه ها
در زیر مقالات فرستاده شده برای این بخش را ملاحضه میکنید

· تبدیل windows-1256 به utf-8 ی (read: 2760 times)
· تابع مرتب سازی فارسی (read: 2523 times)
· گرفتن متحوای یک سایت (read: 2614 times)
· تابع های تبدیل تاریخ شمسی به میلادی و برعکس (read: 8736 times)
· تابع چک کردن صحت ادرس e-mail ی (read: 2310 times)
· نحوه اتصال به بانک اطلاعاتی MySQL ی (read: 2228 times)
· ایجاد ارتباط پایدار با MySQL سرور (read: 1704 times)
· ایجاد بانک اطلاعاتی جدید در MySQL سرور (read: 1730 times)
· انتخاب بانک اطلاعاتی مورد نظر در MySQL سرور (read: 1563 times)
· گرفتن یک Query ساده و نوشتن جواب آن از MySQLی (read: 1845 times)
· فرستادن query های Update و Insert ی (read: 1704 times)
· ی Login - Logout ی (read: 2440 times)
· Some Date-Related functionsی (read: 1464 times)
· تبديل html به text ی (read: 1579 times)
· اتصال با بانك هاي Access با استفاده از Ado ی (read: 1915 times)
· تابع ساخت ورودی تاریخ (read: 1844 times)
· توابع کار با XML - فایل (read: 975 times)

[ بازگشت به صفحه اصلی مقالات ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
مقالات قسمت Template Engines
در زیر مقالات فرستاده شده برای این بخش را ملاحضه میکنید

· Smarty يک Templating Engine برای PHP (read: 2915 times)

[ بازگشت به صفحه اصلی مقالات ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد

۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد

نویسنده : سید حمید رضا هاشمی گلپایگانی ( hamid@morva.net )

تاریخ : ۲/۳/۱۳۸۱

مقدمه :

به دلیل سٶالات زیادی كه در مورد این موضوع شده بود تصمیم گرفتم كه كمی در مورد این موضوع تحقیق و نتیجه برای

استفاده همان در سایت IranPHP.net برای استفاده همگان قرار دهم . قبلا گفته باشم كه اینها تنها برداشت های شخصی

من در این تحقیق می باشد و خوشحال می شوم كه بقیه ایرادات من را در این تحقیق برایم ارسال كنند به دلیل اینكه من

تجربه كار با ASP را ندارم و همچنین بعضی اطلاعات من مربوط به ASP است و NET. را شامل نمی شود .

۱- سرعت ، سرعت ، سرعت

اولین باری كه یك كد به زبان PHP نوشتم بر روی یك كامپیوتر Pentium 166Mhz بود بر روی سیستم عامل Linux و به

همراه Apache Web Server . بسیار برایم جالب بود كه چقدر كد های من سریع اجرا می شوند . یعنی در آن موقع با

اگر شما یك Windows NT بر روی آن می توانستید سوار كنید و به فرض كه IIS هم بر روی آن بالا می آمد فكر كنم

اصلا وقت Serve كردن صفحات عادی html را نداشت چه برسد به اینكه بخواهد ASP را هم اجرا كند . علتش این است

كه Microsoft از یك Technology در اجرا كردن كدهای زبان ASP استفاده می كند كه در آن هر موقع شما تصمیم به

استفاده از یك عنصر خارجی مانند VBScript, MSSQL, ODBC و خیلی چیزهای دیگر كه در حقیقت از Engine های

خارجی استفاده می كنند دستور به آن Engine خارجی می دهد و جواب بدست آمده را بررسی و برای استفاده در اختیار

ادامه برنامه می گذارد . همین رفت و برگشت و اجرا كردن Engine های خارجی باعث كند شدن سرویس دهی می شود كه

این را شما به خوبی می توانید در استفاده از MSSQL به طرق مختلف احساس كنید . مثلا اگر شما خود MSSQL Extentions

برای استفاده از MSSQL استفاده كنید برای یك Query مشترك ۱.۸۸ ثانیه زمان تلف می شود و اگر همان را با استفاده

از ODBC اجرا نماﺋید زمانی در حدود ۹.۵۴ ثانیه تلف می شود كه این خود نشان می دهد كه ASP اینها را به تنهاﺋی اجراء

نمی كند و از Engine های ویندوز استفاده می كند .

۲- استفاده بهینه از Memory

در IIS4 اگر شما در یك صفحه مثلا ۲۰ بار یك صفحه را Include كنید این صفحه ۲۰ بار در حافظه بارگذاری می شود و در

حقیقت حافظه شما ۲۰ برابر زیادتر اشغال می شود . البته شنیدم كه این مشكل در ویندوز ۲۰۰۰ و IIS5 حل شده است

اما بازهم برای كسانی كه ASP را مینویسند و می خواهند آنرا بر روی سرور های Hosting كه دارای سیستم عامل NT

هستند اجرا كنند مشكل زا است و باعث كند شدن سیستم می شود و در Load بالا مسلما مشكل زا خواهد شد .

این مشكل به طور كلی در PHP وجود نداشته و ندارد و استفاده درست از Memory در هنگام اجرای یك كد باعث شده است

كه صفحات در Load بالا نیز به خوبی قابل رٶیت باشند .

۳- خرج اضافی ندارید !

مثلا در ASP اگر بخواهید از امكاناتی نظیر Encryption یا File Uploading یا ارسال نامه توسط كد برنامه استفاده كنید

باید امكانات اضافی برای این كار خریداری كنید و نصب كنید تا این امكانات به IIS شما اضافه گردد . این در حالیست كه

در PHP همه اینها در هنگام Compile در نظر گرفته می شوند و همگی از امكانات Standard این زبان هستند و هیچ نصب

یا خرج اضافی در كار نیست .

۴- MySQL بهترین انتخاب، بیشترین سرعت

در اینجا قصد ندارد به مقایسه MySQL و MSSQL بپردازم . اما به خاطر قدرت خارق العاده MySQL و سازگار بودن این

DBMS با زبان PHP به صورتیكه PHP اتصال به MySQL را به صورت دستورات Internally پشتیبانی می كند و حتی نیاز

به نصب Module اضافی برای این كار نمی باشد ، از سرعت بسیار بالاﺋی در كار با SQL برخوردار است كه شاید بعدا در

مورد MySQL مقاله ای نوشتم .

۵- نزدیك بودن Syntax به ++C/C و Java

از آنجاﺋیكه اكثر برنامه نویسان از ++C/C استفاده كرده اند و بخاطر محبوب بودن بی حد Java معمولا با Syntax های

این دو زبان اكثرا آشنا هستند . PHP هم اكثر Syntax های خود را شبیه به این زبانها انتخاب كرده است كه برای یادگیری

دوباره Syntax دستورات دچار مشكل نشوید كه مسلما Microsoft اصلا برایش این مساﺋل مشكل حساب نمی شود .

۶- رفع ایرادات ، سریع ، بی دردسر

تا حالا از Microsoft خواسته اید كه ایرادی را در سیستمهای خود رفع كند ؟ مسلما اگر شركت بزرگی مانند Boeing

نباشید حرف شما خیلی خریدار ندارد یا لااقل به این زودی ها به نتیجه نمی رسید .

OpenSource بودن PHP این امكان را به شما می دهد كه شخصا اقدام به رفع مشكل كنید و آنرا برای دستندركاران PHP

ارسال كنید و یا اینكه در Mailing List های عمومی PHP موضوع را مطرح كنید و خواهید دید كه از سراسر دنیا برای

رفع ایراد شما Patch ارسال می گردد .

۷- اجرا بر روی Platform های مختلف

درست است كه خیلی از این ایرادات را Microsoft رفع خواهد كرد و Technology های جدیدتر اراﺋه خواهد كرد ( چه

بسا این Net. كه الان آمده همه را درست كرده باشد ) اما یك مشكل اساسی برای ASP وجود دارد و آن این است كه

ASP بدون Windows یعنی هیچ ! بدلیل اینكه ASP نصفی از كدها را توسط Engine های ویندوز اجرا می كند كه در

سیستم عامل های دیگر خبری از آنها نیست . لذا ASP در سیستم عاملهای دیگر همیشه دارای ضعفهای بزرگی است .

اما PHP به دلیل آنكه توسط GNU C Compiler در همه Platform ها قابل Compile شدن است و از Engine های خاص

هیچ سیستم عاملی برای اجرای كدها استفاده نمی كند قابلیت اجرا بر روی تعدا زیادی از OS ها را داراست كه این یك

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

برگرفته از : http://php.weblogs.com/php_asp_7_reasons

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به مقایسه با دیگر رقیبان | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
روش نصب PHP به همراه Apache HTTP سرور

در این نوشته سعی خواهم کرد روش نصب PHP به همراه Apache HTTP Server را تا حد ممکن به صورت گام به‌گام توضیح دهم.

- نرم‌افزار Apache HTTP Server را از آدرس:

http://www.apache.org/dist/httpd/binaries/win32/apache_2.0.40-win32-x86-no_ssl.exe

پایین آورده و آن‌را نصب کنید .

( در حالتی‌که همه‌ی گزینه‌ها، پیش‌فرض ( Default ) هستند بدون مشکل پیش خواهید رفت. )

- نرم‌افزار PHP و Installer آن را هم از آدرس‌های زیر Download کرده آن‌را Install ‌کنید:

http://de.php.net/do_download.php?download_file=php-4.2.2-Win32.zip

http://de.php.net/do_download.php?download_file=php-4.2.2-installer.exe

- در شاخه‌ای که Apache HTTP Server را نصب کرده‌اید، زیرشاخه‌ای به نام \conf وجود دارد که در آن می‌توانید فایل httpd.confکه مربوط به پیکربندی این برنامه است را بیابید. با یک ویرایش‌گر ساده‌ی متن می‌توانید این پرونده را باز کرده و تغییردهید. برای اجرا شدن فایل‌ها با پسوند php تغییرات زیر باید در این پرونده اعمال شوند:

1- در بخشی که ScriptAliasها معرفی شده‌اند، سطر زیر را وارد می‌کنیم:

ScriptAlias /php4/ "c:/php/"
نکته این‌که: به جای c:/php/ باید مسیری را که PHP در آن نصب شده‌، وارد شود.

2- در قسمت AddType application ، سطر زیر را می‌آوریم:

AddType applicatin/x-httpd-php4 .php

3- در بخش Action application هم این خط اضافه می‌شود:

Action application/x-httpd-php4 "/php4/php.exe"

4- جلوی عبارت DocumentRoot بین علامت‌های نقل قول مسیر شاخه‌ای که می‌خواهید پرونده‌هایphp را درآن ذخیره و اجرا کنید، می‌نویسیم.( این زیر فهرست به عنوان LocalHost ما معرفی می‌شود. )

- پس از اعمال این تغییرات Apache HTTP Server را، با کلیک بر روی نشانه‌ی آن در Taskbar توسط منویی که باز می‌شود،Restart ‌کنید.

حال کافی‌ست برنامه‌ای را که با PHP نوشته‌اید، در شاخه‌ای که در بند ۴ به آن اشاره کردم کپی کرده و برای نمایش آن در Browser در بخش آدرس تایپ کنید : http://localhost/[ProgramName].php

اگر فرصت داشته باشم در باره‌ی IIS و PHP هم مطلبی خواهم نوشت.

علی نادری - 5 / 5 / 1381

naderi@arcor.de

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نصب و تنظیم | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
روش نصب PHP بروى Windows ها

روش نصب PHP بروى windows 95/98/Me NT/2000/XP

PHP بر روى win32 بدو صورت نصب مىشود

1 - بصورت CGI executable
2 - بصورت server module SAPI

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

1 - نصب PHP بصورت CGI executable :

نصب PHP بصورت CGI executable بسيار ساده مىباشد براى اين كار شما بايد بر روى PC خود يكى از web server هاى زير را داشته باشيد

Personal Web Server 3 and 4 or newer
Internet Information Server 3 and 4 or newer
Apache 1.3.x
OmniHTTPd 2.0b1 and up
Oreilly Website Pro
Xitami
Netscape Enterprise Server, iPlanet
در سايت www.php.net شما مىتوانيد php Installer را بر روى PC خود ذخيره كنيد
اين برنامه php را بر روى PC شما بصورت CGI executable و با پشتيبانى MySQL نصب خواهد كرد و web Server شما را بصورت automatic تنظيم خواهد كرد

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

2 - نصب PHP بر روى win32 بصورت server module SAPI :

نصب PHP بصورت server module SAPI بر روى Apache توسط دوست عزيزمان آقاى على نادرى در قسمت مقالات بطور كامل توضيح داده شده است
و اما نصب PHP بر روى IIS :
جهت اين كار ابتدا بايد PHP را از اين آدرس Windows Binaries بر روى PC خود ذخيره كنيد
محتويات اين فايل كه بصورت zip است را در شاخه‌اى كه مىخواهيد php را نصب كنيد قرار دهيد c:\php خوب است
پس از اين كار فايل‌هاى php4ts.dll و sapi/php4isapi.dll و dlls/*.dll را در شاخه system ذخيره كنيد

c:\windows\system for Windows 9x/ME
c:\winnt\system32 for Windows NT/2000
c:\windows\system32 for Windows XP
فايل php.ini-recommended را به php.ini تغيير نام داده و در شاخه WINDOWS ذخيره كنيد
در فايل php.ini تغييرات زير را ايجاد كنيد:
شما بايد extension_dir را به شاخه extension هاى مورد نظر خود تغيير دهيد چنانچه مطابق با توضيحات پيش رفته باشيد اين مسير c:\php\extensions مىباشد
فايل browscap.ini را در

c:\windows\system\inetsrv\browscap.ini on Windows 9x/Me,
c:\winnt\system32\inetsrv\browscap.ini on NT/2000,
c:\windows\system32\inetsrv\browscap.ini on XP.
جنانجه پس از نصب PHP فايلهاى شما در شناختن variable ها مشكل داشتيد در فايل php.ini پارامتر register_globals را از off به on تغيير دهيد
سپس در IIS در قسمت

Home Directory > configuration > App Mappings :

Executable : C:\WINNT\system\php4isapi.dll
Extension : .php
را اضافه كنيد در قسمت ISAPI نيز

Filter Name : php
Executable : C:\WINNT\system\php4isapi.dll

پس از يك بار stop / start كردن IIS شما مىتوانيد PHP را بر روى PC خود اجرا كنيد
موفق باشيد

مصطفى افتخارى زاده

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نصب و تنظیم | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
نصب PHP تحت Windows به چند روش

نصب PHP تحت Windows...
در اين مقاله به نصب PHP تحت سيستم عامل Windows و بر روي Web Server استاندارد IIS مي پردازيم ...
نويسنده: سهيل صادق‌زاده
mailto:Clash_IDOL@hotail.com

با سلام خدمت شما دوستان و علاقه‌مندان طراحي و برنامه‌نويسي تحت Web ...
در اين مقاله من سعي دارم روش نصب ساده و مختصر مفسر زبان PHP را توضيح دهم و نوآموزان و دوستاني كه علاقه‌مند به آشنايي با اين زبان قدرتمند هستند به راحتي بتوانند مفسّر آنرا بر روي Web Server شخصي خود نصب كنند. در اين نسخه از مقاله به نصب PHP تحت سيستم عامل Windows خواهيم پرداخت و در نسخه بعدي روش نصب بر روي سيستم عامل Linux را توضيح خواهم داد.

ما در اين دو مقاله به نصب استاندارد PHP بر روي Web Serverهاي پيش فرض خواهيم پرداخت و براي نيل به اين منظور بر روي سيستم عامل Windows از IIS و تحت سيستم عامل Linux از Apache استفاده مي‌كنيم. گرچه خيلي از علاقه‌مندان Slackware پيشنهاد مي‌كنند كه حتّي بر روي سيستم عامل ويندوز از Apache استفاده شود بنده به هيچ وجه اين مسئله رو براي تازه كاران پيشنهاد نمي‌كنم. بدون شك نمي‌توان از قدرت اين Server حتّي تحت سيستم عامل MS Windows چشم پوشي كرد ولي براي كاربران معمولي و همچنين طراحان حرفه‌اي اي كه سعي در ارتقاء Solutionهاي خود دارند استفاده كردن از استانداردها بسيار مناسبتر خواهد بود. شايد در مقاله مفصّلي درباره اين مزيتها و معايب مجالي براي صحبت بود. بنابراين در مقاله حاضر تحت سيستم عامل ويندوز به نصب PHP بر روي IIS و Personal Web Managerخواهيم پرداخت.

PHP چيست و چگونه كار مي‌كند؟
PHP مخفّف Hypertext Preprocessor يك زبان Scripting و Server-Side مي باشد. يك Script به كدي از برنامه مي‌گويند كه بصورت ابتدايي Compile نمي‌شود و فقط در صورت فراخواني و يا درخواستي براي اجرا توسط مفسّر زبان مورد نظر ترجمه مي شود و به خروجي فرستاده مي شود. اين به اين معني مي‌باشد كه شما دقيقاً كد برنامه خود را در جاي مورد نياز به كار مي‌بريد و رابط اجرايي برنامه آنرا به مفسّر مورد نظر ارجاء مي‌دارد. درباره مثال ما مفسّر مذكور مفسّر PHP يا برنامه PHP.exe مي باشد و رابط اجرايي Web Server مورد نظر و در اينجا Internet Information Service (IIS) است. براي اينكه بتوانيد Scriptهاي PHP خود را اجرا كنيد نياز به نصب مفسّر PHP بر روي Web Server خود داريد. توجّه كنيد كه اين مفسّر بر روي Web Server شما نصب خواهد شد. شما مي‌توانيد به PHP.exe مانند يك Plug-in يا Add-on نگاه كنيد چرا كه روش كار هر دو به يك صورت مي‌باشد. بعد از نصب مفسّر PHP شما قادر خواهيد بود كه از كدهاي PHP به همراه كدهاي HTML خود در صفحات Web استفاده كنيد و همچنين مي‌توانيد Scriptهاي صرفاً PHP خود را به عنوان ترمينالهاي تفسير كننده داده ها و رابطهاي ورودي و خروجي بر روي سرور خود قرار دهيد. اكنون به روش نصب PHP تحت Windows توجه كنيد.

روش نصب ...

دور خيز ...
همانطور كه گفتيم شما مفسّر PHP را بر روي Web Serverخود نصب خواهيد كرد. تحت سيستم عامل Windows اعم از هسته‌هاي 9X و يا NT شما اين قابليت را داريد كه از Web Serverهاي اختراع Microsoft يعني IIS يا Personal Web Manager استفاده كنيد. همچنين مي‌توانيد از هر دوي اين نرم‌افزارها در كنار يكديگر استفاده نماييد. اگر هنوز Web Serverي بر روي سيستم خود نصب نكرده‌ايد بايد قبل از شروع پروسه نصب PHP اين كار را انجام دهيد. براي نصب به CD-ROM و يا پكيج اصلي ويندوز مورد استفاده خود نياز داريد و از بخش Add/Remove Programs در Control Panel مي توانيد IIS را در قسمت Windows Components بيابيد. بعد از نصب حتماً بايد يكبار سيستم خود را Restart كنيد تا Socketها و Portهاي مورد نياز بر روي OSشما براي سرويس دهنده Implement شوند. بعد از راه اندازي مجدّد بايد از صحّت عملكرد Web Server خود اطمينان حاصل كنيد. براي اينكار در پنجره‌اي از Browser خود، Internet Explorer و يا Netscape Navigator آدرس http://localhost و يا http://127.0.0.1 را امتحان كنيد، اگر Browser شما صفحه خوش آمد گويي IIS را نمايش داد Web Server شما به سلامت مشغول كار است. براي دسترسي به تنظيمات IIS مي توانيد به بخش Administrative Tools در Control Panel مراجعه كنيد و از آنجا Internet Information Service Consol را اجرا نماييد. بصورت پيش فرض مسير اصلي و قابل خواندن IIS در X:\inetpub\wwwroot قرار دارد. شما مي‌توانيد صفحات خود را در اينجا قرار دهيد و همچنين از كنسول تنظيمات IIS اين آدرس را تغيير دهيد و يا Virtual Directoryهاي ديگري به آن بيافزاييد. در ادامه به نصب PHP مي‌پردازيم.

مواد مورد نياز ...
PHP بصورت كاملاً رايگان و Open Source ارائه مي‌شود بنابراين شما بدون پرداخت هزينه‌اي مي توانيد هميشه با آخرين نگارش اين مفسّر Update باشيد. هنگام نوشتن اين مقاله آخرين نسخهء منتشر شده PHP 4.2.2 مي‌باشد كه بنده شديداً پيشنهاد مي كنم كه همين نسخه رو تهيه كنيد. شما مي‌توانيد براي Download كردن بخشهاي مورد نياز از Package كامل PHP به سايت رسمي آن در آدرس http://www.php.net/ مراجعه كنيد. در صفحه Download لينكهاي مختلفي براي دريافت بخشهاي مختلف Package وجود دارد شما براي نصب تحت Windows نياز به پكيج Binary for Win32 داريد. دو نسخه از اين پكيج براي PHP 4.2.2 وجود خواهد داشت. اولين نسخه مفسر اصلي PHP به همراه تمامي Add-ONهاست كه در حدود 5 مگابايت حجم دارد و ديگري تنها مفسّر اصلي PHP به همراه قابليت ارتباط ذاتي با پايگاه داده MySQL است كه اين نسخه نيز حدود 1 مگابايت مي باشد. براي شروع پكيج 1 مگابايتي تمام نيازهاي شما را برآورده خواهد كرد، بايد بدانيد كه با نصب اين پكيج شما قابليت اجراي تمامي دستورات ذاتي PHP و همچنين ارتباط كامل با MySQL را داريد بنابراين اگر دليل موجّهي براي استفاده از Add-ONها نداريد به دريافت همين پكيج بسنده كنيد. توجه كنيد كه در اين قسمت دو روش نصب براي شما وجود خواهد داشت.

- نصب بصورت Automatic و استفاده از Wise Installer
- نصب بصورت دستي (Manual)

براي استفاده از حالت اوّل و نصب بصورت Automatic شما مي‌توانيد از هر دو پكيج استفاده نماييد ولي اگر قصد داريد PHP را بصورت دستي و Manual نصب كنيد تنها مي‌توانيد از پكيج كامل يعني پكيج 5 مگابايتي استفاده نماييد. تفاوت دو پكيج كاملاً آشكار است. شما با نصب پكيج كامل قابليتهايي مثل امكان استفاده از ISAPI و NSAPI براي امنيت هرچه بيشتر و همينطور نسخه‌اي از Apache API را بدست مي‌آوريد. نسخه كامل PHP داراي رابطهايي در استفاده بهينه از Apache 2 نيز مي باشد و علاوه بر تمامي قابليتهاي PHP كه در نسخه Installer نيز نصب خواهد شد داراي چندين Extension قابل اديت و OpenSource ديگر است كه براي كاربران حرفه‌اي بسيار مفيد مي باشند. امّا من پيشنهاد مي‌كنم اگر شما براي اوّلين بار قصد نصب PHP را داريد اقدام به دريافت Installer كنيد. اين برنامه نصب با يك Wizard ساده تمامي تنظيمات را براي شما انجام خواهد داد و به سادگي PHP را بر روي Web Server شما نصب خواهد كرد و البته بعد از نصب تمامي تنظيمات قابل تغيير خواهد بود. مزيت ديگر استفاده از اين برنامه قابليت Uninstall كردن PHP است كه در صورت بروز اشتباهي در آينده بدون تغيير در Web Server مي توانيد PHP را حذف كنيد. پكيج Installer قابليتهاي نسخه كامل PHP را ندارد ولي تمامي نيازهاي ما حتّي براي يك Solution متوسّط را برآورده مي‌كند. با نصب PHP توسّط Windows Installer شما مي توانيد تمامي دستورات PHP را استفاده كنيد و همچنين يك رابط Built-in و ذاتي از MySQL و PHP در اختيار داشته باشيد. مفسّر PHP در نسخه چهارّم براي پشتيباني از پايگاه داده MySQL نياز به هيچ Extensionي نخواهد داشت . در نسخه‌هاي قبلي شما براي استفاده از MySQL ملزم بوديد كه يك Extension به نام php_mysql.dll را به پكيج خود بيافزاييد ولي با نصب PHP 4 به اين كار نيازي نيست. شما به چيزي بيش از اين احتياج نخواهيد داشت. نصب PHP با اين روش يك نسخه قابل اجرا از PHP.exe را كه با فرم بندي CGI توليد شده در اختيار شما قرار خواهد داد كه دقيقاً همين سرور در پكيج كامل نيز ضميمه شده است. در ادامه روش نصب با هر دو پكيج را توضيح خواهم داد.

روش اوّل : نصب Automatic با استفاده از Wise Installer ...
در صفحه Download بر روي سايت رسمي در آدرس http://www.php.net/downloads.php مي توانيد در قسمت Windows Binaries دو پكيج مذكور را بيابيد و از روي Mirror مورد نظر آنرا دريافت كنيد. پيشنهاد مي‌كنم براي Mirror از سرورهاي مالزي يا سنگاپور استفاده كنيد، ساير Backboneهاي ذكر شده آسيايي از رابطهاي اروپايي منشاء مي گيرند و سرعت و اطمينان لازم را ندارند. شما با دريافت Installer ويندوز فايل اجرايي php-4.2.2-installer.exe را دراختيار خواهيد داشت. با اجراي اين برنامه پروسه نصب PHP آغاز خواهد شد.
در طول نصب تنها از شما خواسته مي‌شود كه روش نصب Standard و يا Advanced را انتخاب نماييد. تفاوتي نخواهد كرد كه شما كدام روش را انتخاب نماييد ولي پيشنهاد مي‌شود كه از روش Standard براي دريافت تمامي حالات پيش فرض استفاده نماييد. بعد از انتخاب روش Standard از شما محل نصب مفسر اصلي پرسيده خواهد شد. باز هم هيچ تفاوتي نخواهد كرد كه اين محل كجاي سيستم شما باشد ولي توجّه كنيد كه محل هدف براي نصب مفسر بايد داخل شبكه خود شما قرار داشته باشد. اگر كامپيوتر شما جزو شبكه نيست به راحتي هر نقطه‌اي را كه مايل هستيد انتخاب نماييد.
اگر پروسه نصب بدون هيچ اشكالي پايان يابد اكنون Web Server شما قادر به اجراي Scriptهاي PHP مي‌باشد. برنامه نصب تمامي تنظيمات IIS و ساير تنظيمات مورد نياز را انجام خواهد داد. اكنون شما تنها نياز به چند تست ساده داريد. ابتدا يادآور شوم كه تمامي تنظيمات مفسر اصلي PHP در فايلي به نام PHP.ini قرار دارد. شما با Edit كردن اين فايل مي‌توانيد تنظيمات اصلي مفسر را تغيير دهيد. بعد از نصب PHP تحت سيستم عامل Windows اين فايل در شاخه اصلي سيستم يعني شاخه Windows و يا WINNT قرار خواهد گرفت. (%systemroot%). اين فايل را در محل ذكر شده بيابيد و با يك Editor استاندارد فايلهاي Text آنرا باز كنيد. در اينجا براي هر قسمت توضيحات لازم وجود دارد امّا شما تنها نياز به چك كردن چند قسمت جزئي داريد. در ابتدا مقدار زير را بيابيد و آنرا دقيقاً مانند اين قسمت تغيير دهيد.

magic_quotes_gpc = on

سپس با به خاطر آوردن محلي كه براي نصب مفسّر PHP در طول برنامه نصب انتخاب كرديد مقدار زير را هم چك كنيد. اين مقدار محلّ فايل PHP.exe را مشخص خواهد كرد كه بصورت پيش فرض C:\PHP قرار داشت. اگر شما اين مقدار را تغيير نداده باشيد بايد اين مقدار دقيقاً مانند زير باشد.
extension_dir = "c:\php"

توجّه كنيد كه محل نصب مفسر PHP با استفاده از Installer در بخش Pathهاي پيش فرض ويندوز قرار خواهد گرفت بنابراين محل مشخص شده در extension_dir مي تواند بصورت مقدار زير نيز قرار داشته باشد.
extension_dir = ./

اگر هنوز اطمينان نداريد كه مشكلي در نصب PHP وجود داشته باشد اين مقدار را تغيير ندهيد گرچه تغيير آن به Path كامل نيز هيچ اشكالي در اجراي مفسر بوجود نخواهد آورد ولي استفاده از تنظيمات پيش فرض براي مراجعه بعدي مفيدتر خواهد بود.

مقدار بعدي كه بايد در فايل PHP.ini چك شود محل شاخه اصلي مراجعه Web Server شماست. اگر شما IIS را بصورت پيش فرض نصب كرده باشيد و تغييري در Pathهاي Server نداده باشيد اين آدرس ..\inetpub\wwwroot مي‌باشد و در اينصورت مقدار مورد نظر بايد عيناً شبيه مقدار زير باشد.
doc_root = "c:\inetpub\wwwroot"

اين مقدار كه در واقع مهمترين بيشترين مشكل را براي كاربران در نصب PHP بوجود مي‌آورد بسيار مهم مي‌باشد. توجه كنيد كه مفسّر PHP بايد بر روي اين دايركتوري اصلي شما دسترسي Write داشته باشد. اگر شما از NTFS براي دايركتوري اصلي Web Server خود استفاده مي‌كنيد بايد حتماً به اين دقّت كنيد كه Authentication بر روي Web Server و همينطور File System را براي سيستم آزاد بگذاريد. در اين صورت مشكلي بوجود نخواهد آمد. همچنين براي قرار دادن Permissionها توجّه كنيد كه Web Server مورد نظر توانايي Execute بر روي دايركتوري‌اي كه حاوي فايل PHP.exe است را داشته باشد.

اصولاً تفاوت چنداني بين نصب نسخه‌هاي جديد PHP و نسخه‌هاي قديمي‌تر وجود ندارد ولي در صورتي‌كه شما از PHP 4 و جديدتر استفاده مي‌كنيد نياز داريد كه مقدار زير را نيز در فايل PHP.ini تغيير دهيد.

register_globals = on

تغيير اين مقدار به on به شما اين امكان را مي‌دهد كه از متغيّرهاي خود بصورت پايدار در بين فرمهاي مختلف استفاده كنيد و در فرستادن متغييرها چه با $HTTP_POST_VARS و چه بصورت $Variables مشكلي نداشته باشيد.

اكنون تنها كاري كه باقي مانده است Restart كردن Web Server مورد نظر است. اين كار را مي‌توانيد با باز كردن كنسول Internet Information Service (IIS) و Right-Click بر روي شاخه اصلي (كه همنام كامپيوتر شماست) و انتخاب گزينه Restart انجام دهيد.

اگر تمام مراحل را با دقّت اينجا پيش رفته باشيد نبايد مشكلي با اجراي Scriptهاي PHP داشته باشيد. براي آزمايش كردن Web Server خود كد زير را در فايلي با پسوند *.php كپي كنيد و آنرا در دايركتوري اصلي Web Server كپي نماييد. اگر فرض كنيم شما نام فايل را phpinfo.php قرار داده باشيد با بازكردن Browser و همچنين تايپ http://localhost/phpinfo.php بايد جدولي پر از خصوصيات Server و همچنين تعدادي از متغيّرهاي اصلي صفحات را مشاهده كنيد.

PHP Info Test

خب ... تبريك مي‌گم، شما موفّق شديد مفسر زبان PHP را بر روي Web Server خود نصب كنيد و يك Solution بسيار مناسب را براي يادگيري هرچه عميقتر اين زبان كه اعجابي در تكنولوژيهاي Scripting است ايجاد كنيد. شما اكنون مفسر زبان PHP را بصورت كامل در اختيار داريد، اين مفسّر به شما اجازه مي‌دهد كه از Extensionهايي كه هر چند وقت يكبار براي ضميمه شدن و هماهنگ كردن شما با نيازهايتان منتظر مي‌شود استفاده كنيد. از اين لحاظ مي‌توان PHP را يك زبان كاملاً Expandable دانست. در ادامه قصد داريم به روش دوّم نصب PHP تحت ويندوز بپردازيم. از بخش اوّل تنها اين نكته باقي مانده كه شما بعد از نصب PHP توسط Installer قادر خواهيد بود كه از Extensionهاي موجود در پكيج كامل PHP مانند php_ldap.dll و خيلي نمونه‌هاي ديگر استفاده كنيد. بنابراين براي يك نصب كامل و بدون نقص پكيج كامل PHP را نيز دريافت كنيد تا در صورت نياز به Extension خاصي درآينده با مشكلي برخورد نكنيد.

روش دوّم : نصب بصورت دستي و Manual

براي نصب PHP بصورت Manual دو روش اصلي وجود خواهد داشت. روش اوّل استفاده كردن از برنامه CGI و فايل PHP.exe است كه در پكيج اصلي ضميمه شده و روش دوم استفاده از SAPI Moduleهاست. نصب بصورت مدول SAPI از نسخه 4.1 به بعد بهينه‌سازي شده است و در نسخه‌هاي قبلي از PHP 4 به همراه خطاهاي آشكاري اجرا خواهد شد و البته در نسخه‌هاي قبل از 4 نيز اصلاً موجود نمي‌باشد. براي استفاده از حالت نصب SAPI بايد از پشتيباني Web Server خود اطمينان حاصل كنيد. نسخه‌هاي جديد Windows به همراه نسخه‌هاي جديد Web Serverها مانند IIS 4 و IIS 5 از اين روش نصب پشتيباني مي‌كنند. مراحل زير را براي هر دوروش نصب بكار ببنديد.

- محتواي پكيج دريافتي از سايت رسمي PHP را بر روي فهرستي خارج از فهرستهاي سيستم باز كنيد. c:\php جاي مناسبي براي اين كار به نظر مي‌رسد. توجه كنيد كه اگر در هنگام UnZIP كردن پكيج فايلهاي را به همراه Pathپيش فرض آنها كپي كنيد دايركتوريهاي مختلفي در c:\php خواهيد ديد. از جمله Dlls، Extensions، Sapi و غيره. شما در ادامه نياز داريد كه جاي برخي از اين فايلها را تغيير دهيد بنابراين تفاوتي نخواهد كرد كه دقيقاً همين Structure را براي فايلهاي داخل پكيج بكار ببنديد. ما فرض مي‌كنيم كه شما پكيج اصلي را با در نظر گرفتن Pathهاي پيش فرض باز كرده‌ايد.

- در مرحله دوّم شما بايد روش نص بخود را مشخّص كنيد. در صورتي كه مايل به نصب PHP بصورت يك Module بر روي SAPI و يا Apache هستيد با توجه كنيد كه فايلهاي DLL مورد نظر شما در دايركتوري sapi قرار گرفته اند و اگر مايل به استفاده از نسخه CGI مي‌باشيد، فايل php.exe را در ثسمت اصلي خواهيد يافت. فايل php4ts.dll در همه موارد نصب مورد نياز مي‌باشد همچنين توجّه كنيد كه اگر مايل به نصب Extension خاصي هستيد بايد DLLهاي مربوط به آنرا نيز در نظر بگيريد. بعد از مشخّص كردن بخشهاي مختلف مورد نيازتان فايلهاي مورد نظر را در يكي از شاخه‌هاي Path ويندوز كپي كنيد. دايركتوري اصلي ويندوز هدف مناسبي براي اين كار مي‌باشد. توجّه كنيد كه همه فايلها و DLLها بايد در شاخه‌اي قرار گرفته باشند كه فايل اصلي PHP.exe در آنجا وجود دارد. شما قادر خواهيد بود اين شاخه را در هر كجا كه مايل بوديد قرار دهيد ولي پيشنهاد مي‌شود كه براي حصول اطمينان يك نسخه را نيز بر روي Pathهاي ويندوز كپي كنيد.

- مرحله بعدي كپي كردن DLL اصلي PHP مي باشد كه بايد در دايركتوري سيستم ويندوز قرار گيرد اين دايركتوري در Windowsهاي 9X و ME در X:\Windows\System، در Windowsهاي 2000 و NT در X:\WINNT\System32 و در Windows XP در X:\Windows\System32 مي‌باشد. DLL اصلي PHP به نام php4ts.dll بايد با توجه به سيستم عامل مورد استفاده در دايركتوري سيستم كپي شود. اگر اين فايل از ابتدا بر روي سيستم شما موجود بود آنرا Overwrite كنيد و همچنين هر يك از DLL هاي موجود در شاخه Dlls نيز اگر در هنگام كپي كردن معادلي بر روي كامپيوتر شما داشت با خيال راحت آنها را نيز Overwrite كنيد.

- آخرين بخش براي كپي كردن فايل ini تنظيمات PHP مي‌باشد. دو نسخه از اين فايل بر روي پكيج اصلي موجود است يكي به نام php.ini-dist و ديگري به نام php.ini-optimized. شما قادر خواهيد بود با هر دوي اين فايلها يك سرور كامل و مناسب داشته باشيد ولي استفاده از نسخه Optimized به شما كمك خواهد كرد كه از تنظيمات پيش فرض براي داشتن بهترين امنيت و بالاترين ضريب اطمينان استفاده كنيد. من پيشنهاد مي‌كنم كه از همين فايل استفاده كنيد. اين فايل را به شاخه Windows بر روي سيستم خود كپي كنيد و نام آنرا به php.ini تغيير دهيد. دايركتوري Windows براي ويندوزهاي 9X، ME و XP X:\Windows و براي ويندوزهاي NT و 2000 ،X:\WINNT مي‌باشد.

- بعد از بخش كپي كردن فايلها شما بايد فايل php.ini را Edit كنيد تابا چند تنظيم ساده php را بيشتر با سيستمتان آشنا كنيد. در بخش اولي مقدار extension_dir را به Pathي كه بر روي آن فايلهاي DLL و بخشهاي اصلي را قرار داده‌ايد تغيير دهيد.

- سپس مقدار doc_root را به آدرس دايركتوري اصلي Web Server خود بصور مثال c:\inetpub\wwwroot تغيير دهيد.

- در بخش آخر شما مي‌توانيد فايل X:\Windows\System32\Inetsrv\browscap.ini را با توجه به نيازتان تغيير دهيد. يك نسخه كامل از اين فايل نيز در Package دريافتي شما موجود مي‌باشد. براي نصب PHP بصورت SAPI Module نيز شما بايد به كنسول IIS مراجعه كنيد و يك Application Mapping بصورت Executable به سرور خود بيافزاييد. اين Mapping بايد به فايل php4isapi.dll اشاره كند. ساير بخشها نيز از اين قسمت به بعد مانند نصب خودكار براي CGI خواهد بود.

اميدوارم مشكلي با نصب PHP با اين روش نداشته باشيد. سعي خواهم كرد كه درباره نصب PHP بر روي Linux و همچنين Apache Web Server نيز مقاله‌هايي بنويسم. قصدم اين بود كه يك راهنماي كامل براي نصب PHP تحت ويندوز و IIS تهيه كنم و براي رسيدن به اين هدف از شما تقاضا دارم كه اگر اشكالي در روش نصب مي‌بينيد و يا مطلبي براي تكميل آن در آختيار داريد آنرا در اختيار بنده قرار بدهيد تا به اين مقاله بيافزايم. همچنين اگر مشكلي با نصب PHP داشتيد مي‌توانيد از انجمن سايت Iranphp.net استفاده كنيد.

موفّق باشيد

© all rights reserved for author... براي هر گونه استفاده از اين مقاله كسب اجازه از مؤلّف الزاميست
مؤلّف اين مقاله هيچ مسئوليتي در قبال مشكلات احتمالي بوجود آمده متعهّد نمي‌باشد

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نصب و تنظیم | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
PHP و مقایسه آن با Perl CGIی

مقدمه ای بر PHP و مقایسه آن با Perl CGI

امروزه با توجه به اینکه روز به روز بر تعداد میزبانهایی که PHP رو ساپورت میکنند
افزوده میشود ، صحبت در مورد PHP و قابلیتهای آن در میان طراحان وب و برنامه نویسان
زیاد است.

برای کسانی که فقط نامی از PHP شنیده اند و از تواناییها و مزیت های PHP آگاهی
ندارند در این مقاله PHP رو به طور مختصر شرح شرح میدهم و آن را با اسکریپتهای
CGI مقایسه میکنم.

PHP یک زبان طرف خادم (server side ) می باشد و شما میتوانید برای ساخت صفحات
دینامیک وب از آن استفاده کنید. برای مثال مدیریت و ساماندهی اطلاعات دریافتی از
یک form اچتمل با PHP بسیار آسان است.

1- زبان:

اگر شما با زبانهای C , C++ , Perl یا Java کار میکنید یاد گرفتن زبان PHP میتواند
مانند زنگ تفریح باشد! در واقع شما خیلی سریع میتوانید اسکریپت نویسی را با PHP
شروع کنید.

متغیرها در PHP مانند PHP هستند (با پیشوند $ ) و انواع مختلف داده ها را میتوانند
در خود ذخیره کنند. برای مثال $whatever میتواند انواع داده ها شامل رشته ای ،
عددی و غیره را در خود نگه دارد.

اگر مقدار $whatever یک عدد باشد شما میتوانید مقدار آن را اینگونه افزایش دهید:

$whatever ++;

یا

$whatever =+1;

یا

$whatever=$whatever+1;

که دقیقا همان روشی است که در C ، C++ ، Perl یا Java به کار میبردید.

2- تسهیلات توکار (Built-in facilities )

بر خلاف Perl که یک زبان همه منظوره است و شما میتوانید تقریبا هر برنامه ای را
با آن بنویسید ، PHP از ابتدا با هدف اسکریپت نویسی برای صفحات وب درست شده ، از
اینرو اسکریپت نویسی برای صفحات وب در PHP بسیار آسانتر از Perl می باشد.

برای مثال میخواهیم از یک فرم در یک صفحه وب ایمیلی را به آدرس خودمان ارسال کنیم.
به کمک Perl شما احتمالا کدی شبیه زیر را مینویسید :

open ( MAIL,\"|/usr/sbin/sendmail -t\");
  print MAIL \"To: myself\@mydomain.com\n\" ;
  print MAIL \"From: visitor\@hisdomain.com\n\" ;
  print MAIL \"Subject: Comments from Web Form\n\n\" ;
  print MAIL $mainmessage ;
  close ( MAIL ) ;

اما همین برنامه در PHP به شکل زیر نوشته می شود :

<?php
mail ( 'myself@mydomain.com', 'Comments from Web Form',
  $mainmessage, 'From: visitor@hisdomain.com' ); ?>

خب حتما تفاوت این دو زبان در سادگی و راحتی را متوجه شده اید!

این سادگی و روانی برای بقیه کارها هم صادق است ، مانند فرستادن یا بازیابی یک
پرونده با FTP یا HTTP.

همانطور که گفته شد این سادگی از اونجا ناشی میشه که PHP فقط برای برنامه نویسی
برای صفحات وب طراحی شده است.

تسهیلات دیگر آن در اداره کردن input های یک form می باشد ، برای مثال یک فرم
مانند زیر را در نظر بگیرید:

<input type=text name=\"dateofbirth\">

شما خیلی راحت و سریع می توانید به محتویات این فرم در متغیر $dateofbirth دسترسی
داشته باشید. نیازی به تجزیه و تحلیل input های فرم نیست.

تمام فیلد ها در یک فرم به طور اتوماتیک به متغیرهایی تبدیل میشوند که شما خیلی
راحت میتوانید به آنها دسترسی داشته باشید.

بازگشت به صفحه اصلی مقالات صفحه بعدی (2/2) >>
[ باز گشت به مقایسه با دیگر رقیبان | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
کلاسها در PHP چهار

کلاسها در PHP

یکی از مسائلی که در PHP فهمیدن آن خیلی راحت نیست " مزیت استفاده از کلاسها
" در برنامه نویسی می باشد . من قبلا با هیچ بانک اطلاعاتی در PHP کار نکرده
بودم اما بعد از کمی تلاش دیدم که یادگیری دستورات مقدماتی آن چقدر راحت است .
اما در مقابل برنامه نویسی OOP (‌برنامه نویسی شیء گرا‌) نیز تا بحال انجام نداده
بودم ولی پی بردم که فهمیدن مفاهیم و چرائی استفاده از آن بسیار مشکل بود . من
فکر می کردم که برنامه نویسی شیء گرا حتما خیلی قدرتمند است و مزایای زیادی دارد
اما از اونجائی که سعی می کردم قبل از تجربه هر چیز خودم را قانع کنم که اون چیز
به دردم می خوره هیچ موقع دنبال اون نبودم .

تا اینکه چند روز پیش هنگامی که داشتم یک Function‌ ساده می نوشتم و اون رو تغییر
می دادم به ذهنم رسید که ببینم می شود این کار را توسط یک Object ( شیء )‌ انجام
داد یا نه . سعی می کنم نتایجی رو که در هنگام این کار بهش رسیدم رو براتون به
زبان ساده شرح بدم .

Class (‌کلاس)‌ در حقیقت تعدادی از Variable ( متغیر)‌ها به همراه تعدادی Function
(‌عملگر)‌است که این عملگر ها بر روی آن متغیر ها کار می کنند . اونها در حقیقت
مفهوم یک چیز در دنیای واقعی هستند . به عبارت دیگر کلاسها یک شیء رو معرفی می
کنند . نشانه یک کلاس زندگی واقعی و یا نفس کشیدن است که زیر ساختهای اون کلاس
هستند .

فرض کنید که ما می خواهیم یک دوچرخه را شرح دهیم . کلاس مرتبط با یک دوچرخه می
بایست متغیر های زیر را داشته باشد :‌

$pedals, $chain, $front_wheel, $rear_wheel, $brakes, $handle_bars

)بدنه نگهدارنده ، ترمزها ، چرخ عقب ،‌چرخ جلو ، زنجیر ، پدالها )

عملگر هایی که یک دوچرخه دارد از قرار زیر است :

Stop(), Accelerate(), Coast(), TurnLeft(), TurnRight()

( ایستادن ، شتاب دادن ، راندن ، پیچیدن به سمت راست ، پیچیدن به سمت چپ )

شما هم اکنون می توانید فرض کنید کنید که توسط این اجزاء این دوچرخه می تواند
حرکت کند و در حقیقت معنای دوچرخه بدهد . مثلا عملگر Accelerate می تواند متغیری
به عنوان $Braking_Force به عنوان ورودی دریافت کند و مثلا از متغیرهای $brakes
و $wheels هم استفاده کند و مثلا نتیجه مطلب را به عنوان مقدار بازگشتی به برنامه
برگرداند .

بسیار جالب به نظر می رسه . اما به نظر شما نمی شه که همه اینها را به صورت منظم
توسط تعدادی متغیر و عملگر انجام داد ؟ مسلما این کار امکان پذیر هستش . اما در
صورتیکه شما فقط یک دوچرخه را بخواهید در برنامه خودتون استفاده کنید فرقی به حال
شما ندارد که از کلاس استفاده کنید یا نه . اما اگر از تعدادی از دوچرخه ها بخواهید
در برنامه استفاده کنید چطور ؟ در اون صورت تعقیب اینکه هر دوچرخه هم اکنون در
چه مرحله ای است و چه متغیری از آن باید به کدام عملگر فرستاده شود توسط برنامه
نویس بسیار سخت و پیچیده می شود . اما در کلاس دیگر این مشکلات وجود ندارد و هر
متغیر برای هر دوچرخه در اختیار عملگر های آن است و هر دوچرخه به صورت جدا متغیر
هایش برای عملگرها فرستاده می شود بدون اینکه شما نیازی به کنترل‌ آنها داشته باشید
. همچنین استفاده از کلاس در برنامه های مختلف راحت است چرا که شما با یک کلاس
آماده که قبلا در جای دیگر کار می کرده به راحتی می توانید کار کنید و نیازی به
تغییر آن ندارید .

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

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

راه حل موجود استفاده از یک کلاس PHP برای تنظیم خروجی های HTML است . من این
کلاس رو Style نامگذاری می کنم . این کلاس شامل متغیرهای زیر است که مهمترین تنظیمات
HTML خروجی از برنامه می باشند :

<?php
class Style {
var $text;
  var $alink;
  var $vlink;
  var $link;
  var $bgcol;
  var $face;
  var $size;
  var $align;
  var $valign;
}
?>

مطمئن هستم که شما با HTML آشنا هستید و این متغیرها برای شما آشنا هستند . هم
اکنون سعی می کنم که عملگری به نام Style برای تعیین نوع خروجی درست کنم :

<?php
class Style {
function Style ($text="#000000\",$alink=\"#AA00AA\",
  $vlink=\"#AA00AA\",$link=\"#3333FF\",
  $bgcol=\"#999999\",$face=\"Book Antiqua\",$size=3,$align=\"CENTER\",$valign=\"TOP\")
  {
$this->text=$text;
  $this->alink=$alink;
  $this->vlink=$vlink;
  $this->link=$link;
  $this->bgcol=$bgcol;
  $this->face=$face;
  $this->size=$size;
  $this->align=$align;
  $this->valign=$valign;
}
}
  ?>

هنگامی که شما عملگری همنام با کلاس خودتون تعریف می کنید ، این عملگر همزمان
با تعریف شیء ای از نوع این کلاس اجرا خواهد شد . این عملگر ، عملگر constructor
یا سازنده نام می گیرد . این عملگر به شما این امکان را می دهد که در هنگام ایجاد
شیء ، برای همه متغیر ها یک مقدار اولیه داشته باشید .

<?php $Basic = new Style; ?>

در اینجا شما شیء‌ ای با نام $basic توسط دستور new از نوع کلاس Style درست کرده
اید .

همچنین این امکان وجود دارد در هنگامیکه می خواهید یک شیء جدید توسط یک کلاس ایجاد
کنید مقدار اولیه متغیرهای آن را نیز در هنگام ایجاد خوتان انتخاب کنید . اما در
صورتیکه مقدار یکی از آنها را شما بخواهید در هنگام ایجاد انتخاب کنید باید همه
متغیرهای دیگر را نیز خودتان مقدار اولیه هایشان را تعیین کنید و این امکان وجود
ندارد که فقط یکی یا چند تا رو شما تعیین کنید و بقیه رو مقدار اولیه مقدار دهی
کند . به همین خاطر راه بهتری را برای این مشکل پیشنهاد می کنیم و آن استفاده از
یک عملگر به نام Set در کلاس است که مقدار یک متغیر را در کلاس تغییر می دهد :

<?php
Function Set($varname,$value) {
$this->$varname=$value;
}
?>

بنابراین برای تغییر مقدار هر یک از متغیر ها می توانیم از نمونه زیر استفاده
کنیم :

<?php $Basic->Set('size','2'); ?>

شما می توانید از علامت -> برای اشاره به متغیر و یا عملگر یک شیء استفاده
کنید . بنابراین خط بالا به اجرا کننده برنامه می گوید که عملگر Set مربوط به شیء
$Basic را اجرا کن . از آنجایی که ما $Basic را قبلا از نوع Style تعریف کردیم
بنابراین عملگر Set این کلاس اجرا می شود و پارامتر های ورودی شما را می گیرد و
برای شیء مورد درخواست تغییرات لازم را اجرا می کند . همچنین شما می توانید این
کار را برای متغیر های دیگر مانند $Basic->text نیز انجام دهید و مقدار اولیه
آنرا تغییر دهید .

بازگشت به صفحه اصلی مقالات صفحه بعدی (2/3) >>
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس

استفاده از تابع تبدیل تاریخ شمسی به میلادی و بالعکس در PHP

برای دریافت توابع کافیست که کد توابع را از این آدرس دریافت کنید :

http://www.iranphp.net/modules/sections/index.php?op=viewarticle&artid=19

بوسیله یک Copy و Paste متن این توابع را درون یک فایل جدید بنام به عنوان مثال
jalali.php ذخیره کنید .

برای اینکه بتوانید از این توابع در برنامه خود استفاده کنید کافیست در ابتدای
برنامه خود دستور زیر را وارد کنید :

<?php require_once "jalali.php\";?>

با این کار دو تابع با نامهای gregorian_to_jalali و jalali_to_gregorian در اختیار
شما قرار می گیرند که به ترتیب برای تبدیل تاریخ میلادی به شمسی و شمسی به میلادی
مورد استفاده قرار می گیرند .

برای اینکه بتوانم نحوه استفاده از این دو تابع را شرح دهم به ذکر مثالهایی در
این مورد می پردازم .

1- تبدیل تاریخ میلادی به شمسی

برای این کار باید از تابع gregorian_to_jalali استفاده کنید . این تابع 3 متغیر
را از ورودی دریافت می کند که به ترتیب سال، ماه و روز می باشد که همگی از نوع
عددی می باشند .

برای مثال اگر بخواهیم تاریخ 2002-11-25 را که درون یک متغیر داریم به شمسی تبدیل
کنیم و سپس آنرا درون یک متغیر قرار دهیم ابتدا باید عناصر تاریخ میلادی رو جدا
کنیم . برای این کار می توانیم در دستور زیر استفاده کنیم :

<?php $gdate='2002-11-25';
list( $gyear, $gmonth, $gday ) = preg_split ( '/-/', $gdate );
?>

در اینجا از دستور preg_spilit برای جدا کردن عناصر تاریخ $gdate توسط جداکننده
– استفاده کرده ایم . همانطور که می بینید syntax این دستور به این صورت است که
2 متغیر به عنوان ورودی دریافت می کند . اولی به عنوان delimiter می باشد که چون
می توان به صورت regex نیز آنرا وارد کرد باید بین دو slash (/) قرار گیرد و متغیر
دوم هم که همان متغییری است که تاریخ میلادی ما در آن قرار دارد .

چون خروجی این دستور یک آرایه است از دستور list استفاده کرده ایم تا عناصر آرایه
را هر کدام در یک متغیر قرار دهیم . هم اکنون روز، ماه و سال میلادی را هر کدام
در یک متغیر داریم . حال می توانیم از تابع gregorian_to_jalali استفاده کنیم :

<?php
list( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);
?>

در اینجا مشخص است که 3 متغیر سال، ماه و روز میلادی را به عنوان متغیر های ورودی
تابع grogorian_to_jalali وارد کرده ایم و چون خروجی این تابع از نوع آرایه است
توسط دستور list هر کدام از عناصر این آرایه را در یک متغیر قرار می دهیم . این
متغیر های حاوی اطلاعات سال،‌ ماه و روز همان تاریخ به شمسی می باشند . برای اینکه
آنها را به صورت قابل نمایش در یک متغیر قرار دهیم می توانیم این خط را به برنامه
اضافه کنیم :

<?php
$jdate = $jyear."/\".$jmonth.\"/\".$jday;
?>

در صوتیکه مقدار $jdate را نمایش دهید همان تاریخ از نوع شمسی خواهد بود که چیزی
شبیه به مقدار زیر است :

4/9/1381

حال در صورتیکه بخواهید تاریخ همین لحظه را به صورت شمسی بدست آورید می توانید
از برنامه زیر استفاده کنید :

<?php
list($gyear, $gmonth, $gday ) = preg_split ('/-/', date("Y-m-d\"));
list( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);

$jdate = $jyear.\"/\".$jmonth.\"/\".$jday;
?>

همانطور که ملاحظه کردید از دستور date با آرگومان داده شده تاریخ فعلی سیستم
استخراج می شود و در همان روال توضیح داده شده تبدیل به شمسی شده و در متغیر $jdate
قرار می گیرد .

برای اینکه کارتان کمی ساده تر شود می توانید تابعی به شکل زیر تعریف کنید :

<?php
function get_jalali_date( $gdate='now' )
{

if ( $gdate == 'now' )
{
list($gyear, $gmonth, $gday ) = preg_split ('/-/', date("Y-m-d\"));
}
else
{
list( $gyear, $gmonth, $gday ) = preg_split ( '/-/', $gdate );
}
list( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);
return $jyear.\"/\".$jmonth.\"/\".$jday;

}
?>

تابعی با نام get_jalali_date تعریف کردیم که یک متغیر به عنوان ورودی دریافت
می کند که این همان تاریخ به میلادی است . در صوتیکه هنگام صدا کردن این تابع تاریخ
میلادی را به عنوان ورودی برای این تابع وارد کرده باشید،‌ تابع همان تاریخ را
به شمسی تبدیل کرده و در خروجی بر می گرداند،‌ ولی اگر هیچ متغیری به عنوان ورودی
به این تابع ندهید،‌ تاریخ همان لحظه را به شمسی برای شما در خروجی بر می گرداند
.

مثلا برای تبدیل همان تاریخ 2002-11-25 به شمسی و قرار دادن آن در یک متغیر می
توانیم با استفاده از تابع بالا اینگونه عمل کنیم :

<?php $jdate = get_jalali_date("2002-11-25\");?>

و یا برای بدست آوردن تاریخ همین لحظه و قرار دادن آن در یک متغیر اینگونه عمل
می کنیم :

<?php $jdate = get_jalali_date();?>

همانطور که می بینید کار بسیار ساده تر شد.

2- تبدیل تاریخ شمسی به میلادی :

با توضیحاتی مشابه می توانید از تابع jalali_to_gregorian استفاده کنید . مانند
تابع قبل این تابع هم سه متغیر به عنوان ورودی دریافت می کند که عبارتند از سال،
ماه و روز که همگی به شمسی هستند . سپس در جواب آرایه ای شامل سه قسمت که سال،‌
ماه و روز میلادی همان تاریخ هستند را بر می گرداند .

برای نمونه اگر بخواهیم تاریخ 4/9/1381 را به میلادی تبدیل کنیم کاری مشابه برنامه
زیر انجام می دهیم :

<?php
$jdate="1381/9/4\";
list( $jyear, $jmonth, $jday ) = preg_split ( '/\//', $jdate );
list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, $jday);
$gdate = $gyear.\"-\".$gmonth.\"-\".$gday;
?>

تنها تفاومت موجود با تابع بالا استفاده از / برای جداسازی اجزاء تاریخ شمسی می
باشد . همانطور که گفتیم تابع preg_split آرگومان اول خود که همان delimiter (‌
جدا کننده )‌ می باشد را به صورت regex می گیرد که باید بین دو علامت / باشد ،‌
در اینجا باید قبل / که نشان دهنده کاراکتر delimiter ما می باشد یک \ (‌back slash
)‌ قرار می دهیم که جداکننده مشخص باشد .

توضیح خاص دیگری هم ندارد و همانند تابع تبدیل میلادی به شمسی اینجا هم می توانیم
تابعی با نام get_gregorian_date بسازیم که کار را راحتتر کند . ایجاد این تابع
را به خواننده واگذار می کنم J

با آرزوی توفیقات الهی

سید حمید رضا هاشمی گلپایگانی

دوشنبه 4 آذرماه 1381

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به PHP و فارسی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
نمایش چند صفحه ای اطلاعات

با توجه به مطالب مطرح شده در انجمن اين سايت و جالب بودن بحث صفحه به صفحه نمايش
دادن اطلاعات نتيجه شده از جستجو در DataBase تصميم گرفتم که مقاله ای در اين خصوص
تهيه کنم و اميدوارم که اين مطالب مورد استفاده دوستان قرار بگيرد .

در اين مقاله از MySQL استفاده شده اما اين روش را می توان با هر DataBase بکار
برد .

جزء LIMIT :

جزء LIMIT در عبارت Select کليد حل مشکل ماست ، به وسيله اين جزء است که ما می
توانيم سطرهای مورد نظر خود از DataBase را در Query خود داشته باشيم .

LIMIT به دو شکل به کار می رود با يک آرگومان و يا با دو آرگومان ،اين آرگومانها
عدد هستند ، اگر LIMIT با يک آرگومان استفاده شود تعداد جواب به آن عدد محدود می
شود :

SELECT * FROM table LIMIT 5

عبارت Select در اين حالت 5 سطر اول Table را در جواب بر می گرداند ،اما اگر LIMIT
با دو آرگومان استفاده شود آرگومان اول مشخص کننده سطر آغازين است و آرگومان دوم
تعداد سطرهايی را که بايد برگردانده شوند را مشخص می کند ، البته بايد به اين نکته
توجه کرد که در SQL سطرها از صفر (0) شروع می شوند نه از يک (1) .

SELECT * FROM table LIMIT 5, 5

اين عبارت SQL سطرهای 6 تا 10 از DataBase را برمی گرداند .

کار با جزء LIMIT مشکل نيست ولی برای اينکه به هدف مطرح شده در اين مقاله نيل
کنيم لازم است که چگونگی عملکرد آن را درک کنيد .

گام اول متغير $start :

در اينجا می دانيم که از چه چيزی بايد برای بدست آوردن سطرهای مورد نظر خود از
DataBase استفاده استفاده کنيم . اما سوال اين است که چگونه متوجه می شويم که از
کجا بايد LIMIT کنيم يا به عبارت ديگر از کدام سطر بايد شروع کنيم ؟ پاسخ خيلی
روشن است ما از يک متغير به نام $start استفده می کنيم و اين متغير را از صفحه
ای به صفحه ديگر می فرستيم .

حال که روش کار مشخص شده شروع به نوشتن کد در PHP می کنيم :

<?php
  $query = "SELECT * FROM table LIMIT \" . $start . \", 10\";

  ?>

اين شکل query ماست و اين query 10 سطر ازtable را از جايی که مساوی مقدار start
باشد را select می کند . اما برای مشخص کردن مقدار start دو راه وجود دارد(در هنگامی
که اولين 10 سطر را بازيافت می کنيم ) يا آن را در URL می نويسيم و يا با شرطی
چک می کنيم که اگر قبلا مقداری به آن داده نشده ما مقدار آن را صفر می کنيم لازم
است برای اين کار از کدی شبيه به کد زير استفاده می کنيم :

<?php
  if(!isset($start)) $start = 0;
  ?>

حالا وقتی کسی صفحه ما را مشاهده کند مقدار $start به صورت خودکار صفر خواهد شد
.

بازگشت به صفحه اصلی مقالات صفحه بعدی (2/2) >>
[ باز گشت به کار با Database ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
UPLOAD كردن MySQL س

UPLOAD كردن MySQL

با سلام خدمت دوستان گرامى

با توجه به اينكه Upload كردن اطلاعات در MySQL يكى از مواردى بود كه در انجمن
زياد سؤال پرسيده مىشد من روشى كه خودم براى Upload كردن اطلاعات استفاده مىكنم
را براى شما شرح مىدهم

ابتدا توسط mysqldump اطلاعات مربوطه را در يك فايل txt ذخيره سازى مىكنيم

Shell > mysqldump --opt DBname TBname > (c:\data.txt or /home/user/data.txt)

نكته:

1 – براى ذخيره سازى تمامى table هاى يك DB بايد اسم database مورد نظر را بدون
اسم table ها ذكر كنيد

2 - براى ذخيره سازى چندين database بايد اسم DB ها را پشت سر هم ذكر كنيد

Shell > mysqldump --opt --databases DB1 DB2 > (c:\data.txt or /home/user/data.txt)

3 - شما مىتوانيد تمامىdatabase ها را بصورت ذير ذخيره سازى كنيد

Shell > mysqldump --opt --all-databases > (c:\data.txt or /home/user/data.txt)

حال اطلاعات مربوط به table مورد نظر را در يك فايل txt ذخيره سازى كرده‌ ايم
انرا بر روى host مورد نظر FTP مىكنيم

سپس با يك دستور ساده اطلاعات را وارد MySQL مىكنيم

Shell > mysql database < data.sql

نكته :

براى استفاده از username & password جهت استفاده از MySQL بايد بصورت زير
عمل كنيد

Shell > Mysql –h host -u user -p database < backup-file.sql

نكته :

چنانچه شما براى انجام اين كار بر روى host دسترسى به Shell نداريد مىتوانيد از
اين راه استفاده كنيد

از يك PHP استفاده مىكنيد بصورت زير :

<?php
shell_exec(“Mysql –h host -u user -p database < backup-file.sql”);
?>

?>

اين روش ساده ای بود كه من براى upload كردن اطلاعات استفاده مىكنم

اميدوارم كه مورد استفاده دوستان قرار بگيرد

با تشكر

مصطفى افتخارى زاده

o_eftekhari@yahoo.com

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کار با Database ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
تابع mail در PHPی

اين مقاله به آدرس زير انتقال يافته است :
http://www.iranphp.net/modules/sections/index.php?op=viewarticle&artid=42
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
مديريت فايل هاي ارسالي توسط كاربران

مديريت فايل هاي ارسالي توسط كاربران
حتما تا بحال سايت هايي را ديده ايد كه به كاربران اجازه Upload فايل از طريق
صفحات (فرم هاي) Html را مي دهند به عنوان مثال در قسمت Profile هاي ياهو كه شما
به عنوان يك كاربر عادي مي توانيد تصوير خود را كه يك فايل با فرمت Gif يا Jpg
است و يا نمونه پيغام صوتي خود را به Profile تان اضافه كنيد و يا بخش آرشيو سايت
هاي تحقيقاتي كه به اعضاي خود اجازه مي دهند نتايج كار خود را در قالب يك فايل
PDF و يا بصورت Zip شده بر روي سايت قرار دهند .
به مطالب گفته شده در بالا حتما به اين نتجه رسيده ايد كه در اينگونه سيستم ها
سه نكته اساسي قرار داد .
1- چكونگي ارسال فايل با استفاده از پروتكل HTTP به جاي FTP.
2- بررسي فرمت فايل و جلوگيري از Upload فايل هاي غير مجاز.
3- بررسي اندازه فايل و جلوگيري از ارسال فايلهاي حجيم.

براي دريافت فايل از كاربر ابتدا بايد فرمي به شكل زير ايجاد كرد :

<form name=\"form1\" method=\"post\" action=\"_URL_\"

enctype=\"multipart/form_data\">

<input type=\"file\" name=\"userfile\">
<input type=\"submit\" name=\"Submit\" value=\"Submit\">
</form>

عبارت multipart/form_data فرم بالا را از فرمهايي كه تا بحال با آن كار كرده
ايم متمايز مي كند . در فرم بالا قبل از دكمه Submit كادر مخصوص در يافت فايل قرار
گرفته در واقع اين همان فايلي است كه كاربر قصد ارسال به سرور را دارد.
در اين فرم _URL_ اشاره به برنامه PHP اي دارد كه قصد داريد عمل دريافت فايل را
در آنجا انجام دهيد .
تا اينجا فرم مورد نياز طراحي شده است حال با يك برنامه ساده مثل نمونه زير مي
توان فايل را از Client خوانده و بر روي سرور ذخيره كرد.

<?
  if(isset( $Submit ))   {
if ($_FILES['userfile']['type'] == "image/gif\"){   copy ($_FILES['imagefile']['tmp_name'], \"files/\".$_FILES['imagefile']['name'])
  or die (\"Could not copy\");

  echo \"\";
  echo \"Name: \".$_FILES['imagefile']['name'].\"\";
  echo \"Size: \".$_FILES['imagefile']['size'].\"\";
  echo \"Type: \".$_FILES['imagefile']['type'].\"\";
  echo \"Copy Done....\";
  }
  else {
  echo \"\";
  echo \"Could Not Copy, Wrong Filetype (\" .$_FILES['imagefile']['name'].\")\";

  }
  }?>

اين برنامه در صورتي كه فايل ارسالي يك فايل GIF باشد آنرا با همان نامي كه روي
كامپيوتر كاربر قرارداشته در شاخه Files بر روي سرور ذخيره مي كند .
البته همانطور كه ميدانيد متغيير هايي كه براي Upload فايل تعريف مي شوند بسته
به نسخه PHP و تنظيمات آن متفاوت مي باشند .
بعد از يك Upload موفق ، هنگامي كه track_vars فعال باشد آرايه هاي $_FILESو $HTTP_POST_FILES
ايجاد مي گردند . سرانجام اگر register_globals فعال باشد متغييرها به صورت globals
ايجاد خواند شد.

توجه : track_vars از نسخه 4.0.3 به طور پيش فرض فعال است . از PHP 4.1.0 به بعد
ترجيحا از متغيير عمومي $_FILES به جاي $HTTP_POST_FILES استفاده مي گردد .

$HTTP_POST_FILES/$_FILES : به منظور مهيا كردن مشخصات فايل (هاي) ارسال شده ايجاد
شده اند . محتواي اين دو متغيير به شرح زير است البته توجه كنيد كه ‘userfile’
نام انتخابي ما در هنگام ساخت فرم HTML است .

<? $HTTP_POST_FILES['userfile']['name'] ?>

نام اصلي فايل بر روي كامپيوتر كاربر.

<? $HTTP_POST_FILES['userfile']['type'] ?>

شناسه محتواي (MIME type) فايل . در برنامه فوق تنها به فايلهاي GIF اجازه ذخيره
شدن داده مي شود حال چنانچه بخواهيم كاربر را محدود به ارسال فايل هاي Wavنماييم
بايد مقدار اين متغيير را با "audio/wav" مقايسه كنيم .

<? $HTTP_POST_FILES['userfile']['size'] ?>[code]
اندازه فايل برحسب بايت .

[code]<? $HTTP_POST_FILES['userfile']['tmp_name'] ?>

نام موقتي كه فايل در هنگام Upload موقتا با آن نام بر روي سرور ذخيره مي گردد
.

توجه : متغيير $_FILES تنها در نسخه هاي 4.1.0 و بالاتر شناخته شده است و نيز
نسخه 3 PHP از $HTTP_POST_FILES حمايت نمي كند .

همچنين اگر در فايل PHP.INI پارامتر register_globals فعال باشد متغييرهاي زير
موجود خواهند بود :

<? $userfile
$userfile_name
$userfile_size
$userfile_type ?>

فايل ها به طور پيش فرض در دايركتوري فايلهاي موقت سرور ذخيره مي شوند مگر اينكه
مكان ديگري توسط upload_tmp_dir در فايل PHP.INI تعيين شده باشد . در پايان اجراي
اسكريپت چناچه فايل ارسال شده از طرف كاربر را به مكان ديگري انتقال ندهيد و يا
نام آن را تغيير ندهيد توسط سيستم اين فايل پاك خواهد شد.

در صورت استفاده از PHP4.1.0 و بالاتر مي توانيد خط اول برنامه فوق را بصورت زير
بنويسيد :

<?
if(is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'])) <br />
  { <br />
  //In PHP 4.1.0 or later, $_FILES should be used instead of $HTTP_POST_FILES.

ارسال چنين فايل به طور همزمان :

همانطور كه ميدانيد يك برنامه را مي توان به چنيدن روش مختلف پياده سازي كرد ولي
چه خوب است كه اين پياده سازي همراه با استفاده بهينه از گرامر زبان باشد .
براي اينكه كاربر بتواند بيش از يك فايل را در يك لحظه ارسال كند فرمي به شكل
زير طراحي كنيد .

<form name=\"form1\" method=\"post\" action=\"_URL_\"

enctype=\"multipart/form_data\">

<input type=\"file\" name=\"userfile[]\">
<input type=\"file\" name=\"userfile[]\">
<br />
  <input type=\"submit\" name=\"Submit\" value=\"Submit\">
</form>

همانطور كه مشاهده مي شود اين فرم داراي دو كادر دريافت فايل است كه به نام آنها
به صورت يك آرايه است . پس از ارسال اين فرم بر روي سرور متغيير هاي :

<? $HTTP_POST_FILES['userfile']['name'][0]
$HTTP_POST_FILES['userfile']['size'][0]
$HTTP_POST_FILES['userfile']['type'][0]
$HTTP_POST_FILES['userfile']['tmp_name'][0]?>

دلالت بر مشخصات فايل اولي و متغييرهاي :

<? $HTTP_POST_FILES['userfile']['name'][1]
$HTTP_POST_FILES['userfile']['size'][1]
$HTTP_POST_FILES['userfile']['type'][1]
$HTTP_POST_FILES['userfile']['tmp_name'][1]?>

دلالت بر مشخصات فايل دوم دارند .
همينطور الي آخر مي توان چندين فايل را ارسال كرد .

روش HTTP PUT
روش ديگري نيز براي ارسال فايل به سرور وجود دارد كه بسيار ساده تر از روش بالا
عمل مي كند ولي چون اين روش براي حفظ امنيت سرور نياز به تنظيمات خاصي در سرورها
دارد از توضيح آن در اينجا صرف نظر كرده ام . چنانچه مايل به آشنايي با اين روش
هستيد به آدرس زير مراجعه كنيد
http://www.php-center.de/en-html-manual/features.file-upload.put-method.html

درهنگام نوشتن چنين برنامه هايي مراقب مجوز هايي كه به دايركتوري ذخيره اين فايل
ها مي دهيد و همچنين بررسي اينكه فايل ارسال شده از طرف كاربر همان چيزي است كه
بايد باشد باشيد .فراموش نكنيد كه هميشه عده اي بر روي اينترنت به دنبال راهي براي
نفوذ به كامپيوتر و يا وب سايت شما هستند بد نيست نگاهي هم به مقاله زير داشته
باشيد
http://securityresponse.symantec.com/avcenter/security/Content/2208.html

موفق باشيد
مهدي ساغري
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کار با فایلها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
ذخیره سازی مشخصات بازدید کنندگان

ذخیره سازی مشخصات بازدید کنندگان بر روی فایل ساده

اين مقاله به عزيزاني كه ميخواهند اطلاعاتي در مورد سيستم بازديدكننده هاي سايت خود به دست آورند كمك بزرگي خواهد كرد. وقتي شما هزينه اي را براي گرفتن فضا پرداخت كرده ايد و از يك فضا بر روي يك سرور استفاده ميكنيد نميتوانيد از فايلهاي Log سرور استفاده نماييد، اگر سرور در اختيار خودتان باشد اين كار امكان پذير است و حتي اطلاعات مفيدي نيز ذخيره ميشود، ولي وقتي سرور در اختيارتان نباشد ميبايست از طريق برنامه نويسي اقدام به اينكار نماييد ، در اين مقاله به بررسي برنامه نويسي اين سيستم توسط PHP خواهيم پرداخت. با استفاده از اين روش ميتوانيد آماري از ترافيك سايتتان را بدست آوريد و همچنين متوجه شويد كه كاربر از كجا به سايتتان آمده و چه صفحاتي را مشاهده كرده اند. با خواندن اين مقاله ميتوانيد اعمال فوق را بدون استفاده از بانك اطلاعاتي MySQL انجام دهيد، ما فقط به يك فايل متني معمولي براي ذخيره ترافيك استفاده ميكنيم و دو متد را مورد بررسي قرار ميدهيم. اولين متد در رابطه با Session منحصر به فرد هر كاربر و دومين متد در رابطه با اطلاعات وارد شدن كاربران به همه صفحات ميباشد. در اين مقاله علاوه بر مرور اين سيستم ، اطلاعات مناسبي در مورد متغيرهاي از پيش تعريف شده در PHP در اختيار شما قرار خواهد گرفت.

متد 1 : (Session Logging)

با استفاده از اين متد ميتوانيد اطلاعات منحصر به فرد در بازديد كننده سايت را بدست آوريد :

<?php
session_start();
if(!session_is_registered('counted')){
    $agent = $_SERVER['HTTP_USER_AGENT'];
    $uri = $_SERVER['REQUEST_URI'];
    $user = $_SERVER['PHP_AUTH_USER'];
    $ip = $_SERVER['REMOTE_ADDR'];
    $ref = $_SERVER['HTTP_REFERER'];
    $dtime = date('r');

    if($ref == "\"){
        $ref = \"None\";
    }
    if($user == \"\"){
        $user = \"None\";
    }

    $entry_line = \"$dtime - IP: $ip | Agent: $agent  | URL: $uri | Referrer: $ref | Username: $user n\";
    $fp = fopen(\"logs.txt\", \"a\");
    fputs($fp, $entry_line);
    fclose($fp);
    session_register('counted');
}
?>

اجازه دهيد كه در مورد سورس كد بالا كمي صحبت كنيم :

<?session_start(); ?>

با استفاده از اين دستور به PHP اعلام ميكنيد كه Session فردي را آماده كند كه ما اطلاعات مرورگر و سيستم آن را بدست آوريم.

<?if(!session_is_registered('counted')){ ?>

در اين كد ما Session مورد نظر را چك ميكنيم كه اگر قبلا Session با نام Counted وجود نداشته باشد دستورات داخل شرط اجرا شود و اطلاعات سيستم كاربر، ذخيره شود.

<?
$agent = $_SERVER['HTTP_USER_AGENT'];
$uri = $_SERVER['REQUEST_URI'];
$user = $_SERVER['PHP_AUTH_USER'];
$ip = $_SERVER['REMOTE_ADDR'];
$ref = $_SERVER['HTTP_REFERER'];
$dtime = date('r');
?>

كدهاي بالا همان متغيرهاي از پيش تعريف شده هستند كه توسط خود PHP براي ما فراهم شده اند و ميتوانيم از آنها استفاده كنيم. در ادامه در مورد هر كدام از اين متغيرهاي از پيش تعريف شده ، توضيح
كمي خواهم داد.

<? $agent = $_SERVER['HTTP_USER_AGENT']; ?>

نوع مرورگر را نشان ميدهد.

<? $uri = $_SERVER['REQUEST_URI']; ?>

URL صفحه اي كاربر در آن است را نشان ميدهد.

<? $ip = $_SERVER['REMOTE_ADDR']; ?>

آدرس IP كامپيوتر مورد نظر را ميدهد.

<? $ref = $_SERVER['HTTP_REFERER']; ?>

مشخص ميكند كه كاربر از چه سايتي به سايت شما آمده.

<? $dtime = date('r'); ?>

اين دستور فقط يك ساختار تاريخي است كه زمان دسترسي كاربر به سايت را در متغير $dtime ذخيره ميكند.

<?
if(!$ref){
    $ref = "None\";
}
if(!$user){
    $user = \"None\";
} ?>

بعد از قرار دادن متغيرهاي از پيش تعريف شده در متغيرهاي برنامه در كد بالا، ميتوانيم متغيرهايي كه مقاديري در آن قرار نگرفته شناسايي كرده و مقدار None را در آنها قرار ميدهيم.

<?php
$entry_line = "$dtime - IP: $ip | Agent: $agent  | URL: $uri | Referrer: $ref | Username: $user n\";
$fp = fopen(\"logs.txt\", \"a\");
fputs($fp, $entry_line);
fclose($fp);
session_register('counted');
?>

در دستورات بالا مقادير بدست آورده از سيستم كاربران را در يك فايل متني ذخيره ميكنيم. در متغير $entry_line مشخص ميكنيم كه چه اطلاعاتي در فايل ذخيره شود و اين اطلاعات را در ابتدا در اين متغير ذخيره ميكنيم، اين اطلاعات ميتواند تغيير داده شود و به دلخواه خودتان اطلاعات مورد نظر ذخيره شود. در خط بعدي با استفاده از دستور fopen يك فايل متني را انتخاب كرده و آن را در حالت درج اطلاعات قرار ميدهيم و مقدار را در يك اشاره گر فايل كه $fp ميباشد قرار ميدهيم. در خط بعد با استفاده از تابع fputs در پارامتر اول اشاره گر فايل و در پارامتر دوم متغيري را كه حاوي مقداري است كه مايل به ذخيره سازي در فايل ميباشيم را قرار ميدهيم. در خط بعدي و با تابع fclose فايل مورد نظر را ميبنديم و در خط بعدي يعني session_register('counted'); باعث ميشود كه مشخص گردد كه اطلاعات اين كاربر ذخيره شده است كه مجددا اقدام به ذخيره سازي اطلاعات اين كاربر نكند.
تا اينجا تمام موارد مربوط به متد 1 و ذخيره اطلاعات منحصر به فرد هر كاربر ميباشد. حال به بررسي متد 2 ميپردازيم.

متد 2 : (All Page Logging)
در اين روش هر صفحه اي كه مورد بازديد قرار ميگيرد اطلاعات را ثبت ميكند، اين متد بسيار شبيه متد 1 ميباشد با اين تفاوت كه Session را از سورس برنامه حذف ميكنيم. البته روش متد 2 هميشه مناسب نيست چونكه بسرعت باعث افزايش حجم فايل Log ميگردد.

<?php
    $agent = $_SERVER['HTTP_USER_AGENT'];
    $uri = $_SERVER['REQUEST_URI'];
    $user = $_SERVER['PHP_AUTH_USER'];
    $ip = $_SERVER['REMOTE_ADDR'];
    $ref = $_SERVER['HTTP_REFERER'];
    $dtime = date('r');

    if($ref == "\"){
        $ref = \"None\";
    }
    if($user == \"\"){
        $user = \"None\";
    }

    $entry_line = \"$dtime - IP: $ip | Agent: $agent  | URL: $uri | Referrer: $ref | Username: $user n\";
    $fp = fopen(\"logs.txt\", \"a\");
    fputs($fp, $entry_line);
    fclose($fp);
?>

همانطور كه متوجه شده ايد كدهاي زير از سورس كد اصلي حذف شده اند.

<?php
session_start();
if(!session_is_registered('counted')){

session_register('counted');
}
?>

در پايان بد نيست كمي در مورد تنظيمات فايل Log صحبت كنيم. در ابتدا شما ميبايست يك فايل خالي به
وب سرور خود ارسال كنيد و سعي كنيد در اشاره گر فايل $fp آدرس كامل فايل را مثل /www/htdocs/logs.txt وارد نماييد. بعد از انجام اين عمليات در نهايت با اجراي دستور CHMOD 755
روي فايل Permission لازم را ايجاد نماييد.

فرشاد فكري نجات

http://www.fekrinejat.com/

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
شروعي ساده با MySQL پایگاه داده

مقدمه:
در اين مقاله سعي شده است كه اصول و مباني كار با MySQL به صورتي ساده و قابل
فهم براي كساني كه تازه شروع به كار با پايگاه‌هاي داده را كرده‌اند، گفته شود.

PHP به صورت از پيش تعريف شده، اكثر پايگاه‌هاي داده را پشتيباني مي‌كند‌: dBase,
FilePro, mSQL, MySQL,Oracle, PostgreSQL,Sybase.اگر شما بخواهيد از پايگاه‌ هاي
داده‌اي كه
به صورت از پيش تعريف شده پشتيباني نمي شوند، استفاده كنيد (مانند Access و يا
SQL Server) بايد از توابع PHP ODBC (Open DataBase Connectivity) به همراه راه‌اندازهاي
پايگاه داده (ODBC Drivers) استفاده كنيد.
MySQL يكي از انواع سرويس دهنده‌هاي پايگاه داده است كه با وجود اينكه نسبت به
ساير‌DBMS هاي موجود زياد قدرتمند نميباشد، اما به علت قيمت و عملكرد مناسب آن،
مورد استفاده گسترده قرار مي‌گيرد.

طريقه اتصال به MySQL

قبل از شروع هر كاري بايد به ‌MySQL متصل شويم. براي اين كار از دستور

<?
  $Conn=mysql_connect($Location,$Username,$Password); ?>

استفاده مي‌كنيم. تابع mysql_connect داراي سه آرگومان مي‌باشد. آرگومان اول ،
ميزبان (Host) را مشخص مي‌كند. دو آرگومان بعدي، نام كاربري و كد رمز را براي اتصال
به پايگاه داده، ارسال مي‌كنند. در صورتي كه اتصال با شكست مواجه شود، پيغام خطايي
درbrowser نشان داده مي‌شود.
با استفاده از دستور

<? mysql_select_db($database)?>

بانك اطلاعاتي مورد نظر انتخاب خواهد شد و از اين پس كارهاي شما همه بر روي اين
بانك انجام خواهد گرفت. در صورتي كه بانك مورد نظر پيدا نشد، پيغام خطايي نشان
داده مي‌شود.

ايجاد يك بانك اطلاعاتي در MySQL

<? if (mysql_creat_db($database,$Conn)
{ print(“The database,$database,was { successfully created!<BR>n”);
else
{ print(" The database,$database, could not be created! <BR>\n”);}

?>

پس از اتصال به MySQL شما مي‌توانيد با استفاده از دستور

<? mysql_creat_db($database,$Conn); ?>

يك بانك اطلاعاتي جديد ايجاد كنيد. اين دستور شامل دو آرگومان : نام بانك اطلاعاتي
و نام لينك مورد نظربه پايگاه داده مي‌‌باشد. در صورتي كه عمل ايجاد با موفقيت
انجام شده باشد، پيغامي مبني بر اين موضوع نمايش داده مي‌شود و در غير اينصورت،
به كاربر اعلام مي‌شود كه عمليات نتيجه نداشته است.

انجام كارهاي مختلف بر روي بانك اطلاعاتي در MySQL

براي انجام كارهاي مختلف بر روي بانك اطلاعاتي ازدستورات SQL استفاده مي‌كنيم.
روند استخراج اطلاعات از يك پايگاه داده به اين صورت است كه ابتدا يك query به
زبان SQL نوشته مي‌شود وسپس اين query با استفاده ازدستور

mysql_db_query($database,$Query);

عمليات لازم را بر روي بانك اطلاعاتي انتخاب شده، انجام مي‌دهد.
فرم كلي به صورت زير است:

<?$Query=”text for the query goes here in SQL format";
if (mysql_db_query($database,$Query))
}
print( “The query was successfully executed!<BR>\n”);
{
else
}
print(“The query could not be executed!<BR>\n”);
{ ?>

· ايجاد يك جدول

براي ايجاد يك جدول ، اين query را مي نويسيم:

<?
  $Query=”CREATE table $Tablename(id INT PRIMARY KEY ,
  Firstname char(12), Lastname char(15))”;
  ?>

با استفاده ازاين query، جدول جديدي ايجاد مي‌شود كه شامل يك فيلد به نام id (
كه Primary keyاست) و فيلدي به نام Firstname از نوع كاراكتري با طول 12 و همچنين
فيلدي به نام Lastname با طول 15 مي باشد.

· ارسال داده‌ها به بانك اطلاعاتي

براي ارسال داده‌ها به بانك اطلاعاتي اين q uery را مي‌ نويسيم:

  <?$Query=“INSERT into $Tablename(‘value1’, ‘value2’, ‘value3’,…)”;?>

توجه داشته باشيد كه تعداد مقاديري كه در اين q uery مشخص
مي‌شوند، بايد با تعداد ستونهاي جدول و همچنين نوع آن برابر باشد. در غيراينصورت
query كارنمي‌كند.

· بازيابي اطلاعات و نمايش آن

به قطعه كد زير توجه كنيد:

<?
  $query = "SELECT * FROM $Tablename“;
  $result = mysql_query($query);
  $numrows = mysql_num_rows($result);
  while($row = mysql_fetch_array($result))
  {
  echo \"You have $numrows user(s) in the database”;
  echo \"ID number : $row[id]”;
  echo \"firstname: $row[firstname]”;
  echo \"Lastname: $row[lastname]”;
  }
  ?>

در خط اول، queryاي نوشته شده است كه تمام ركوردهاي موجود درTable را انتخاب مي‌كند
و سپس در خط دوم، اين query برروي بانك اطلاعاتي اجرا مي‌شود و در خط سوم تعداد
ركوردهاي موجود درTable ، در متغيير numrows ذخيره مي‌گردد و سپس با استفاده از
حلقهً while ( كه تعداد loop آن به اندازه ركوردهاي Table است) ركوردها، خوانده
شده و نمايش داده مي‌شود.

· تغيير اطلاعات موجود در بانك اطلاعاتي
براي اين كار كافي است كه از queryاي استفاده كنيم كه در آن دستورUPDATE به كار
برده شده باشد.بطور مثال:

<?$Query=“UPDATE $Tablename SET firstname=’mina’ WHERE
  firstname=’maryam’”; ?>

اين query ، اسامي موجود درTable مورد نظر را در صورتي كه برابر با mina باشد،
به maryam تغيير مي‌دهد.

نكته:
· بعد از اتمام كار، به وسيله دستور

<?mysql_close($Conn);?>

اتصال بهMySQL را قطع كنيد. اين دستور شامل يك
آرگومان است، كه همان متغيراشاره گر،به MySQL مي‌باشد.

· بيشترين اشتباهات و خطاهاي به وجود آمده، مربوط به نحوه
نوشتن queryها مي‌ باشد. چنانچه در دستورات PHP ‌، هيچ
نوع اشكال منطقي‌اي مشاهده نكرديد، q uery مورد نظر را
بررسي كنيد. به احتمال زياد مشكل حل خواهد شد.

· شما مي‌ توانيد به جاي دستور

<?mysql_db_query( );

از دستور

<?mysql_query( );?>

استفاده كنيد. البته هر كدام از اين دستورات، كاربردهاي خاص خود را دارند كه توصيه
مي‌شود براي آگاهي،h elp مربوطه را در PHP ، مطالعه بفرماييد.

· توجه داشته باشيد كه باز و بسته شدن‌هاي متعدد Database موجب به وجود آمدن
حفره‌هايي مي‌شود كه امنيت اطلاعات را به خطر مي‌اندازد ( براي آگاهي بيشتر، مي‌توانيد
از منابعي در مورد Security، استفاده كنيد.) لذا توصيه مي‌شود با دسته‌بندي مناسب
عمليات مورد نياز روي D atabase،تعداد دفعات باز و بسته شدن D atabase را به حداقل
برسانيد.

· يك نكته ساده و در عين حال جالب(مخصوص مبتدي‌‌‌ها):

يك Database و يا يك Table را نمي‌شود بيش از يك باربه وجود آورد.!! بنابراين
در صورتي كه هنگام به وجود آوردن Database و يا Tableاي ، مدام با Error برخورد
مي‌كنيد و هيچ نوع توجيه‌اي براي آن نمي‌يابيد، پيشنهاد مي‌شود كه با بررسي Mysql_Front
از وجود نداشتن Database و يا Tableمورد نظر مطمئن شويد.

شيلان جوانمردي
Sh_javanmardi@srtnet.net
بهمن 81

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کار با Database ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
كارتهاي الكترونيكي با php وmysql م

آيا شما تا به حال خواسته ايد كه كارتهاي الكترونيكي براي سايت تان بسازيد ؟ اين
كار را اخيرا من انجام داده ام و همزمان با آن همه يك روش كار درست بدست آوردم
. بنابراين اينجا يك خودآموز سريع است و از اين جهت شما مجبور نيستيد كارهايي را
كه من انجام داده ام را بپذيريد . همچنين در اين خودآموز شما ممكن است براي نكات
بيشتر ارجاعهايي به “ Floppydogs” داشته باشيد . ولي آنچه بر روي آن است نيز از
روي كد من در Floppydogs.com آمده است .
حال آيا اينكه شما فكر كنيد كه اين كار يك قطعه session ساده و آسان مي خواهد،
درست است ؟ خير ، اينكار را نكنيد، خود من هم دقيقا علت آن را نمي دانم چرا كه
اگر من در session_destory( ) اين كار را انجام مي دادم session ID از پذيرفتن
آن به اين روش امتناع مي ورزيد .
اشكال اين ايجاد كردن ها زماني بود كه كاربر يك e_card را ارسال مي نمود و موقعي
كه سعي مي كرد كه برگردد و يك كارت جديد را ايجاد كند اينكار را نمي توانست انجام
دهد زيرا كه خطايي مبني بر ID مشابه پيش مي آمد ( چه زحمتي! ) .
براي اينكار اول از همه من، بايد عكسها را بسازم و آشكار است كه همه آنها بر روي
صفحه index.php نمايش داده مي شود ، كد اينجا :

<A HREF=\"makecard.php?image=imagename.jpg\">

به طور معمول هر تصوير يك imagename متفاوت دارد حالا من براي ساختن makecard.php
در جائيكه كاربر مي رسد و در his/her/its اطلاعات شخصي را وارد مي كند از session
ها استفاده نمودم كه در صورت صرفنظر از اين قسمت اين خودآموز ديگر بلا استفاده
مي شود .

<?
  session_start();
  session_register("image\");
  ?>
  <HTML>

رجيستر سازي تصوير به اين معني است كه موقعي session خراب شده است، كاربر عكس
را انتخاب و به نام متغير آن به چسباند . همه اطلاعات session بايد همزمان با شروع
HTML شروع به رفتن كند . حال كد زير :

  <CENTER>

  <IMG SRC=\"<?echo $image;?>\">
  </CENTER>
  <form action=\"sendcard.php\" method=GET>
Your Name:
  <input type=text name=s_name size=25 maxlength=50>
  <?escapeshellcmd($s_name);?>
  <p>
  Your Email Address:
  <input type=text name=s_email size=25 maxlength=50><?escapeshellcmd($s_email);?>
  <p>
  Receiver's Name: <input type=text name=r_name size=25 maxlength=50>
  <?escapeshellcmd($r_name);?>
  <p>
  Receiver's Email Address: <input type=text name=r_email size=25 maxlength=50>
  <?escapeshellcmd($r_email);?>
  <p>
  Your Personal Message:<BR>
  <TEXTAREA name=message cols=50 rows=5 wrap></TEXTAREA>
  <?escapeshellcmd($message);?>
  <P>
<input type=submit value=\"Send my card!\">
  <input type=reset value=\"Clear it\">
  </form>

اگر شما بدانيد كه چگونه از فرم ها استفاده كنيد در اغلب مواقع ضروري بيشتر بايد
از آن استفاده كنيد .
در اينجا يكي از خصيصه هاي امنيتي Escapeshellcmd( ) اينست كه كاربران بدجنس نمي
توانند دستورات mysql را وارد فيلد ها بكنند و از آن طريق اطلاعات شما را بگيرند
.اگر شما همه جزئيات آن را بخواهيد ، مي توانيد در راهنماي دستي آن نگاه كنيد .
در ادامه من در يك جا به اين مسأله برخورد كردم كه اگر كاربر يك تصوير را انتخاب
كند و در آن موقع به ذهنش برسد كه بايد برگردد و his/her/its را تغيير داده بايد
چكار كند زيرا كه تصوير يك متغير رجيستر شده است و در تصوير اول هيچ موضوعي نمانده
كه انتخاب نشده باشد . با اين وجود خوشبختانه اين حالت نيز آسان مي باشد و در بالاي
صفحه index.php من به راحتي كد زير را اضافه كردم :

<?
  session_start();
  session_destroy();
  ?>

و سپس به ياد مي آورد كه قبل از هر كاري از HTML آن را وارد كند و حالا كارت را
مي فرستد .
قدم اول اين بود كه يك جدول درون mysql ايجاد كنيد ، شما مي توانيد خودآموز هاي
بيشتر را از روي devshed پيدا كنيد .براي گرفتن يك ID منحصر به فرد براي هر كارت
من از يك تابع استفاده كردم ( كه دوباره هر كدام قبل از HTML مي روند ) و آن را
به صورت session_destory( ) ذكر كردم تا نتواند ظاهر شود و ID خودش را خراب كند
. به همين دليل اطلاعات در داخل session هستند اگر شما كتاب Core php programming
را كه منبع اصلي من نيز مي باشد را داشته باشيد اين تابع را خواهيد شناخت .

<?php
  session_start();
  function CreateID($length=16){
  $Pool = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\";
  $Pool .= \"1234567890floppydogs\";
  for($index = 0; $index < $length; $index++){
  $sid .= substr($Pool,(rand()%(strlen($Pool))), 1);
  }
  return($sid);
  }
  $sid=CreateID();
  ?>

اساسا اين تابع يك مجموعه طبقه بندي شده از 16 كاراكتر را توليد مي كند كه از
كاراكتر هاي انتخابي من ساخته شده است مشروط بر اينكه درون $Pool باشد .حال هر
چيزي مي خواهيد وارد جدول mysql بكنيد و ترتيب نگهداري متغير هايتان را به ياد
داشته باشيد . اگر در آنجا يك عنصر با همان ID وجود داشته باشد mysql بصورت اتوماتيك
در صورتي كه اجرا شود يك خطا برمي گرداند كه در مورد ( نتيجه !) است و يك ID جديد
مي سازد .

<?
$result = mysql_query("INSERT INTO ecards VALUES('$sid', '$s_name', '$s_email','$r_name',
  '$r_email','$message', '$image')\");
  if(!$result){
  $sid=CreateID();
  $result = mysql_query(\"INSERT INTO ecards VALUES('$sid', '$s_name', '$s_email','$r_name',
  '$r_email','$message', '$image')\");
  }
?>

حال با پست كردن موفقيت آميز يك پيام با عنوان him/her/its گيرنده مي فهمد كه
he/she/it يك e_card دارد ! و در پايان نمي تواند session را خراب كند همچنين كاربر
مي تواند در صورتي كه he/she/it بخواهد برود و كارتي ديگر بسازد .

<?php
  $mailTo = "$r_email\";
  $mailSubject = \"You Have A FloppyDog!\";
  $mailHeader = \"From: $s_name\";
  $message = \"You lucky person, you! Someone has thought of you in a warm
  and fuzzy way and sent you a floppydog studios (TM) e-card! You can view this
  card at the following webpage: \";
  $message .= \"http://www.floppydogs.com/ecards/viewcard.php?ID=\";
  $message .= $sid;
  mail($mailTo, $mailSubject, $message, $mailHeader);
  session_destroy();
  ?>

اين هم از اين . لحظات خوشي با e_card سازي داشته باشيد .اگر شما بخواهد همه اين
كارها را ببينيد مي توانيد مقداري از كارتهاي الكترونيكي را موقعيكه همه آنها روي
هم گذاشته شد از طريق floppydogs.com براي دوستانتان بفرستيد .

موفق باشيد
حميد اردشيري
ardeshiry@hotmail.com
برگرفته از : http://www.phpdeveloper.org
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
تبدیل windows-1256 به utf-8 ی

استفاده از این تابع می تونید کاراکتر هایی که توسط CodePage Windows-1256 نوشته شده رو بر روی خروجی از نوع UTF8 پیاده سازی کنید .
کافیست یا این کد رو در برنامه پیاده کنید یا اینکه در یک فایل جدا قرار دهید و بعد در برنامه اصلی آنرا Require کنید

<?php

function convert_w1256_to_utf_8($text) {

    $converted_text=preg_replace_callback("/(:\&\#([0-9]{1,4})\;|([\x80-\xFF]))/\",\"replace_content\",$text);

    return $converted_text;
}

function replace_content($matches_content) {

//windows-1256 character set

$windows1256 = array(
'€',    # 0x20AC EURO SIGN
'پ',    # 0x067E ARABIC LETTER PEH
'‚',    # 0x201A SINGLE LOW-9 QUOTATION MARK
'ƒ',    # 0x0192 LATIN SMALL LETTER F WITH HOOK
'„',    # 0x201E DOUBLE LOW-9 QUOTATION MARK
'…',    # 0x2026 HORIZONTAL ELLIPSIS
'†',    # 0x2020 DAGGER
'‡',    # 0x2021 DOUBLE DAGGER
'ˆ',    # 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
'‰',    # 0x2030 PER MILLE SIGN
'ٹ',    # 0x0679 ARABIC LETTER TTEH
'‹',    # 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
'Œ',    # 0x0152 LATIN CAPITAL LIGATURE OE
'چ',    # 0x0686 ARABIC LETTER TCHEH
'ژ',    # 0x0698 ARABIC LETTER JEH
'ڈ',    # 0x0688 ARABIC LETTER DDAL
'گ',    # 0x06AF ARABIC LETTER GAF
'‘',    # 0x2018 LEFT SINGLE QUOTATION MARK
'’',    # 0x2019 RIGHT SINGLE QUOTATION MARK
'“',    # 0x201C LEFT DOUBLE QUOTATION MARK
'”',    # 0x201D RIGHT DOUBLE QUOTATION MARK
'•',    # 0x2022 BULLET
'–',    # 0x2013 EN DASH
'—',    # 0x2014 EM DASH
'ک',    # 0x06A9 ARABIC LETTER KEHEH
'™',    # 0x2122 TRADE MARK SIGN
'ڑ',    # 0x0691 ARABIC LETTER RREH
'›',    # 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
'œ',    # 0x0153 LATIN SMALL LIGATURE OE
'‌',    # 0x200C ZERO WIDTH NON-JOINER
'‍',    # 0x200D ZERO WIDTH JOINER
'ں',    # 0x06BA ARABIC LETTER NOON GHUNNA
' ',    # 0x00A0 NO-BREAK SPACE
'،',    # 0x060C ARABIC COMMA
'¢',    # 0x00A2 CENT SIGN
'£',    # 0x00A3 POUND SIGN
'¤',    # 0x00A4 CURRENCY SIGN
'¥',    # 0x00A5 YEN SIGN
'¦',    # 0x00A6 BROKEN BAR
'§',    # 0x00A7 SECTION SIGN
'¨',    # 0x00A8 DIAERESIS
'©',    # 0x00A9 COPYRIGHT SIGN
'ھ',    # 0x06BE ARABIC LETTER HEH DOACHASHMEE
'«',    # 0x00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
'¬',    # 0x00AC NOT SIGN
'',    # 0x00AD SOFT HYPHEN
'®',    # 0x00AE REGISTERED SIGN
'¯',    # 0x00AF MACRON
'°',    # 0x00B0 DEGREE SIGN
'±',    # 0x00B1 PLUS-MINUS SIGN
'²',    # 0x00B2 SUPERSCRIPT TWO
'³',    # 0x00B3 SUPERSCRIPT THREE
'´',    # 0x00B4 ACUTE ACCENT
'µ',    # 0x00B5 MICRO SIGN
'¶',    # 0x00B6 PILCROW SIGN
'·',    # 0x00B7 MIDDLE DOT
'¸',    # 0x00B8 CEDILLA
'¹',    # 0x00B9 SUPERSCRIPT ONE
'؛',    # 0x061B ARABIC SEMICOLON
'»',    # 0x00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
'¼',    # 0x00BC VULGAR FRACTION ONE QUARTER
'½',    # 0x00BD VULGAR FRACTION ONE HALF
'¾',    # 0x00BE VULGAR FRACTION THREE QUARTERS
'؟',    # 0x061F ARABIC QUESTION MARK
'ہ',    # 0x06C1 ARABIC LETTER HEH GOAL
'ء',    # 0x0621 ARABIC LETTER HAMZA
'آ',    # 0x0622 ARABIC LETTER ALEF WITH MADDA ABOVE
'أ',    # 0x0623 ARABIC LETTER ALEF WITH HAMZA ABOVE
'ؤ',    # 0x0624 ARABIC LETTER WAW WITH HAMZA ABOVE
'إ',    # 0x0625 ARABIC LETTER ALEF WITH HAMZA BELOW
'ئ',    # 0x0626 ARABIC LETTER YEH WITH HAMZA ABOVE
'ا',    # 0x0627 ARABIC LETTER ALEF
'ب',    # 0x0628 ARABIC LETTER BEH
'ة',    # 0x0629 ARABIC LETTER TEH MARBUTA
'ت',    # 0x062A ARABIC LETTER TEH
'ث',    # 0x062B ARABIC LETTER THEH
'ج',    # 0x062C ARABIC LETTER JEEM
'ح',    # 0x062D ARABIC LETTER HAH
'خ',    # 0x062E ARABIC LETTER KHAH
'د',    # 0x062F ARABIC LETTER DAL
'ذ',    # 0x0630 ARABIC LETTER THAL
'ر',    # 0x0631 ARABIC LETTER REH
'ز',    # 0x0632 ARABIC LETTER ZAIN
'س',    # 0x0633 ARABIC LETTER SEEN
'ش',    # 0x0634 ARABIC LETTER SHEEN
'ص',    # 0x0635 ARABIC LETTER SAD
'ض',    # 0x0636 ARABIC LETTER DAD
'×',    # 0x00D7 MULTIPLICATION SIGN
'ط',    # 0x0637 ARABIC LETTER TAH
'ظ',    # 0x0638 ARABIC LETTER ZAH
'ع',    # 0x0639 ARABIC LETTER AIN
'غ',    # 0x063A ARABIC LETTER GHAIN
'ـ',    # 0x0640 ARABIC TATWEEL
'ف',    # 0x0641 ARABIC LETTER FEH
'ق',    # 0x0642 ARABIC LETTER QAF
'ك',    # 0x0643 ARABIC LETTER KAF
'à',    # 0x00E0 LATIN SMALL LETTER A WITH GRAVE
'ل',    # 0x0644 ARABIC LETTER LAM
'â',    # 0x00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
'م',    # 0x0645 ARABIC LETTER MEEM
'ن',    # 0x0646 ARABIC LETTER NOON
'ه',    # 0x0647 ARABIC LETTER HEH
'و',    # 0x0648 ARABIC LETTER WAW
'ç',    # 0x00E7 LATIN SMALL LETTER C WITH CEDILLA
'è',    # 0x00E8 LATIN SMALL LETTER E WITH GRAVE
'é',    # 0x00E9 LATIN SMALL LETTER E WITH ACUTE
'ê',    # 0x00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
'ë',    # 0x00EB LATIN SMALL LETTER E WITH DIAERESIS
'ى',    # 0x0649 ARABIC LETTER ALEF MAKSURA
'ي',    # 0x064A ARABIC LETTER YEH
'î',    # 0x00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
'ï',    # 0x00EF LATIN SMALL LETTER I WITH DIAERESIS
'ً',    # 0x064B ARABIC FATHATAN
'ٌ',    # 0x064C ARABIC DAMMATAN
'ٍ',    # 0x064D ARABIC KASRATAN
'َ',    # 0x064E ARABIC FATHA
'ô',    # 0x00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
'ُ',    # 0x064F ARABIC DAMMA
'ِ',    # 0x0650 ARABIC KASRA
'÷',    # 0x00F7 DIVISION SIGN
'ّ',    # 0x0651 ARABIC SHADDA
'ù',    # 0x00F9 LATIN SMALL LETTER U WITH GRAVE
'ْ',    # 0x0652 ARABIC SUKUN
'û',    # 0x00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
'ü',    # 0x00FC LATIN SMALL LETTER U WITH DIAERESIS
'‎',    # 0x200E LEFT-TO-RIGHT MARK
'‏',    # 0x200F RIGHT-TO-LEFT MARK
'ے',    # 0x06D2 ARABIC LETTER YEH BARREE
); #windows1256

    return $windows1256[ord($matches_content[1])-0x80];

}
?>

یک نمونه کد برای نحوه استفاده این تابع از اینجا قابل دریافت است.
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
گرفتن متحوای یک سایت

<?php
function get_web_content($website_address) {
    $site_content=''; // to make notice happy
    $file_handle=fopen($website_address,"r\");
    while ($line=fgets($file_handle,1000))
    {
        $site_content.=$line;
    }

    fclose ($file_handle);

    return $site_content;
}

$website_address='http://www.yahoo.com';
$site_content=get_web_content($website_address);

?>

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
تابع های تبدیل تاریخ شمسی به میلادی و برعکس

<?php
// \"jalali.php\" is convertor to and from Gregorian and Jalali calendars.
// Copyright (C) 2000  Roozbeh Pournader and Mohammad Toossi
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// A copy of the GNU General Public License is available from:
//
//    http://www.gnu.org/copyleft/gpl.html
//

function div($a,$b) {
    return (int) ($a / $b);
}

function gregorian_to_jalali ($g_y, $g_m, $g_d)
{
    $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);

   $gy = $g_y-1600;
   $gm = $g_m-1;
   $gd = $g_d-1;

   $g_day_no = 365*$gy+div($gy+3,4)-div($gy+99,100)+div($gy+399,400);

   for ($i=0; $i < $gm; ++$i)
      $g_day_no += $g_days_in_month[$i];
   if ($gm>1 && (($gy%4==0 && $gy%100!=0) || ($gy%400==0)))
      /* leap and after Feb */
      $g_day_no++;
   $g_day_no += $gd;

   $j_day_no = $g_day_no-79;

   $j_np = div($j_day_no, 12053); /* 12053 = 365*33 + 32/4 */
   $j_day_no = $j_day_no % 12053;

   $jy = 979+33*$j_np+4*div($j_day_no,1461); /* 1461 = 365*4 + 4/4 */

   $j_day_no %= 1461;

   if ($j_day_no >= 366) {
      $jy += div($j_day_no-1, 365);
      $j_day_no = ($j_day_no-1)%365;
   }

   for ($i = 0; $i < 11 && $j_day_no >= $j_days_in_month[$i]; ++$i)
      $j_day_no -= $j_days_in_month[$i];
   $jm = $i+1;
   $jd = $j_day_no+1;

   return array($jy, $jm, $jd);
}

function jalali_to_gregorian($j_y, $j_m, $j_d)
{
    $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);

   $jy = $j_y-979;
   $jm = $j_m-1;
   $jd = $j_d-1;

   $j_day_no = 365*$jy + div($jy, 33)*8 + div($jy%33+3, 4);
   for ($i=0; $i < $jm; ++$i)
      $j_day_no += $j_days_in_month[$i];

   $j_day_no += $jd;

   $g_day_no = $j_day_no+79;

   $gy = 1600 + 400*div($g_day_no, 146097); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */
   $g_day_no = $g_day_no % 146097;

   $leap = true;
   if ($g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */
   {
      $g_day_no--;
      $gy += 100*div($g_day_no,  36524); /* 36524 = 365*100 + 100/4 - 100/100 */
      $g_day_no = $g_day_no % 36524;

      if ($g_day_no >= 365)
         $g_day_no++;
      else
         $leap = false;
   }

   $gy += 4*div($g_day_no, 1461); /* 1461 = 365*4 + 4/4 */
   $g_day_no %= 1461;

   if ($g_day_no >= 366) {
      $leap = false;

      $g_day_no--;
      $gy += div($g_day_no, 365);
      $g_day_no = $g_day_no % 365;
   }

   for ($i = 0; $g_day_no >= $g_days_in_month[$i] + ($i == 1 && $leap); $i++)
      $g_day_no -= $g_days_in_month[$i] + ($i == 1 && $leap);
   $gm = $i+1;
   $gd = $g_day_no+1;

   return array($gy, $gm, $gd);
}

?>

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
تابع مرتب سازی فارسی

<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
<?php
$test2[0]="پيمان\" ;
$test2[1]=\"ali\";
$test2[2]=\"xxxi\";
$test2[3]=\"آرزو\";
$test2[4]=\"چرچيل\";
$test2[5]=\"ژاله\";
$test2[6]=\"گرمايش\";
$test2[7]=\"ماندني\";
$test2[8]=\"رضا\";
$test2[9]=\"پژوهش\";
$test2[10]=\"ياد\";
for($i=0;$i<=10;$i++) $test2[$i] =fa_encode($test2[$i] );

sort($test2);

for($i=0;$i<=10;$i++)
{
echo fa_decode($test2[$i]) .\"<br>\" ;
}

function fa_decode($str){
$_to_farsi=array(
chr(131).chr(48) => chr(216).chr(162),
chr(131).chr(49) => chr(216).chr(167),
chr(131).chr(50) => chr(216).chr(168),
chr(131).chr(51) => chr(217).chr(190),
chr(131).chr(52) => chr(216).chr(170),
chr(131).chr(53) => chr(216).chr(171),
chr(131).chr(54) => chr(216).chr(172),
chr(131).chr(55) => chr(218).chr(134),
chr(131).chr(56) => chr(216).chr(173),
chr(131).chr(57) => chr(216).chr(174),
chr(131).chr(65) => chr(216).chr(175),
chr(131).chr(66) => chr(216).chr(176),
chr(131).chr(67) => chr(216).chr(177),
chr(131).chr(68) => chr(216).chr(178),
chr(131).chr(69) => chr(218).chr(152),
chr(131).chr(70) => chr(216).chr(179),
chr(131).chr(71) => chr(216).chr(180),
chr(131).chr(72) => chr(216).chr(181),
chr(131).chr(73) => chr(216).chr(182),
chr(131).chr(74) => chr(216).chr(183),
chr(131).chr(75) => chr(216).chr(184),
chr(131).chr(76) => chr(216).chr(185),
chr(131).chr(77) => chr(216).chr(186),
chr(131).chr(78) => chr(217).chr(129),
chr(131).chr(79) => chr(217).chr(130),
chr(131).chr(80) => chr(218).chr(169),
chr(131).chr(81) => chr(218).chr(175),
chr(131).chr(82) => chr(217).chr(132),
chr(131).chr(83) => chr(217).chr(133),
chr(131).chr(84) => chr(217).chr(134),
chr(131).chr(85) => chr(217).chr(136),
chr(131).chr(86) => chr(217).chr(135),
chr(131).chr(87) => chr(219).chr(140));
return strtr($str,$_to_farsi);
}

function fa_encode($str){
$_to_safe=array(
chr(216).chr(162) => chr(131).chr(48),
chr(216).chr(167) => chr(131).chr(49),
chr(216).chr(168) => chr(131).chr(50),
chr(217).chr(190) => chr(131).chr(51),
chr(216).chr(170) => chr(131).chr(52),
chr(216).chr(171) => chr(131).chr(53),
chr(216).chr(172) => chr(131).chr(54),
chr(218).chr(134) => chr(131).chr(55),
chr(216).chr(173) => chr(131).chr(56),
chr(216).chr(174) => chr(131).chr(57),
chr(216).chr(175) => chr(131).chr(65),
chr(216).chr(176) => chr(131).chr(66),
chr(216).chr(177) => chr(131).chr(67),
chr(216).chr(178) => chr(131).chr(68),
chr(218).chr(152) => chr(131).chr(69),
chr(216).chr(179) => chr(131).chr(70),
chr(216).chr(180) => chr(131).chr(71),
chr(216).chr(181) => chr(131).chr(72),
chr(216).chr(182) => chr(131).chr(73),
chr(216).chr(183) => chr(131).chr(74),
chr(216).chr(184) => chr(131).chr(75),
chr(216).chr(185) => chr(131).chr(76),
chr(216).chr(186) => chr(131).chr(77),
chr(217).chr(129) => chr(131).chr(78),
chr(217).chr(130) => chr(131).chr(79),
chr(218).chr(169) => chr(131).chr(80),
chr(218).chr(175) => chr(131).chr(81),
chr(217).chr(132) => chr(131).chr(82),
chr(217).chr(133) => chr(131).chr(83),
chr(217).chr(134) => chr(131).chr(84),
chr(217).chr(136) => chr(131).chr(85),
chr(217).chr(135) => chr(131).chr(86),
chr(219).chr(140) => chr(131).chr(87));
return strtr($str,$_to_safe);
}

?>

این تابع توسط آقای شیرازی و امید متقی در انجمن IranPHP تهیه شده است .
كساني كه با NotePad كار ميكنند بايد فايل را به صورت UTF-8
ذخيره كنند. فرانت پيچي ها هم اگر charset=utf-8 را درج كنند
مشكلي نخواهند داشت.(بايد به خطار داشته باشيد كه اگر متن فارسي يه شكل
كد شود يعني عددي تمايش داده شود برنامه قادر به سورت صحيح نخواهد بود
و فقط وقتي به صورت uTF-8 و حرفي باشد جواب صحيح خواهد داد.)

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
تابع چک کردن صحت ادرس e-mail ی

<?php

function checkemail($email){
   list($mailbox,$domain) = split('@',$email,2);
   $state = 'domain';

   // find preferred mailserver
   if(getmxrr($domain,$mailhosts,$pref)){
       asort($pref);
       foreach($pref as $preferred){
           $mailserver =  $mailhosts[key($pref)];
           break;
       }
       $state = "trying mailserver $mailserver\";
       $state = mailconnect($mailserver,$email);
    }else{
       // no mail exchange found try as host
       $state = \"No MX, trying $domain\";
       $state = mailconnect($domain,$email);
    }
    return $state;
}

function mailconnect($mailserver,$email){
   $myhostname = $SERVER_NAME;
   $connection = fsockopen($mailserver, 25);
   if($connection){
       $state = \"connected to $mailserver\";
       // Nothing to do with greeting
       //$smtpgreeting = fread($connection, 512);

       //if($smtpgreeting){
       fputs($connection, \"HELO $myhostname\r\n\");
       $hello = fgets($connection, 512);
       if($hello){
           $state = \"chatting to $mailserver: $hello\";
           fputs($connection, \"MAIL FROM: <webserver@$myhostname>\r\n\");
           $youok = fgets($connection, 512);
           if($youok){
               $state = \"chatting to $mailserver: $youok\";
               fputs($connection, \"RCPT TO: <$newaddress>\r\n\");
               $recepient = fgets($connection, 512);
               $state = \"chatting to $mailserver: $recepient\";
               if(ereg('250',$recepient)){
                   fputs($connection, \"QUIT\r\n\");
                   $deliverable = true;
                   $state = false;
               }elseif(ereg('220',$recepient)){
                   fputs($connection, \"QUIT\r\n\");
                   $deliverable = true;
                   $state = false;
               }else{
                   $deliverable = false;
                   $state = \"RCPT? $recepient $newaddress\";
               }
           }
       }else{
           $state = \"$mailserver not accepting mail now, please try again.\";
       }
       //}else{
           //$state = 'mailserver not greeting me';
           //break;
       //}
   }else{
       $state = \"$mailserver not listening\";
   }
   return $state;
}
?>

با استفاده از تابع checkmail می توانید وضعیت هر آدرس پست الکترونیکی را پیدا کنید . دقت کنید که این تابع وضعیت رو بر می گرداند شما می توانید با تغییر هر وضعیت به true یا false از صحت یا سقم آدرس پست الکترونیک با خبر شوید و آنرا در برنامه خود استفاده کنید .

سید حمید رضا هاشمی گلپایگانی
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
نحوه اتصال به بانک اطلاعاتی MySQL ی

<?php
   $link = mysql_connect("localhost\", \"mysql_user\", \"mysql_password\")
       or die(\"Could not connect\");
   print (\"Connected successfully\");
   mysql_close($link);
?>

در این مثال شما کافیست متغییر اول در دستور mysql_connect رو آدرس MySQL Server خودتون قرار بدید و بعد به ترتیب Username و Password اتصال به آنرا نیز وارد کنید .

سید حمید رضا هاشمی گلپایگانی
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
ایجاد ارتباط پایدار با MySQL سرور

<?php
   $link = mysql_pconnect("localhost\", \"mysql_user\", \"mysql_password\")
       or exit(\"Could not connect\");
?>

این تابع دو فرق عمده با دستور mysql_connect دارد .
1- این دستور یک ارتباط پایدار با سرور ایجاد می کند به این نحوه که در صورتی که قبلا ارتباطی با همین Username و Password با این Mysql سرور ایجاد شده باشد ارتباط جدید ایجاد نمی کند و همان Connection در جواب در داخل متغیر $linke قرار می دهد .
2- در اینجا تا موقعی که برنامه شما در حال اجراست این Conncetion‌ پایدار می ماند و با استفاده از دستور mysql_close نمی توانید این ارتباط را قطع کنید . فقط در صورت اتمام اجرای Script ارتباط قطع می شود . کنترل آن هم دست خود سیستم است .
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
ایجاد بانک اطلاعاتی جدید در MySQL سرور

<?php
   $link = mysql_pconnect("localhost\", \"mysql_user\", \"mysql_password\")
       or exit(\"Could not connect\");

   if (mysql_create_db(\"my_db\")) {
       print (\"Database created successfully\n\");
   } else {
       printf (\"Error creating database: %s\n\", mysql_error ());
   }
?>

در اینجا در صورتی که Username و Password شما دسترسی به ایجاد بانک جدید در MySQL داشته باشد بانکی با نام my_db ایجاد خواهد شد .

سید حمید رضا هاشمی گلپایگانی
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
انتخاب بانک اطلاعاتی مورد نظر در MySQL سرور

<?php

mysql_connect("your host\", \"username\", \"password\") or die(mysql_error());
mysql_select_db(\"your database\") or die(mysql_error());

?>

بانک اطلاعاتی your database پس اجرای دستور mysql_select_db انتخاب خواهد شد و پس از آن کارهای شما همه بر روی این بانک انجام خواهد شد . در صورتیکه نیاز به تغییر بانک دارید دوباره باید از همین دستور استفاده کنید .

سید حمید رضا هاشمی گلپایگانی
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
گرفتن یک Query ساده و نوشتن جواب آن از MySQLی

<?php

# Connect to your MySQL database server
mysql_connect ('localhost', 'username', 'password')
or die ('I cannot connect to the database. Make sure that mysql is installed and that you are trying to log in as a valid user.');

# Select a default database to work with
mysql_select_db ('database_name')
or die ('The database specified in database_name must exist and must be accessible by the user specified in mysql_connect');

# make a query on a table in your database
$query = "SELECT * FROM table_name\";
$query_result_handle = mysql_query ($query)
or die ('The query failed! table_name must be a valid table name that exists in the database specified in mysql_select_db');

# make sure that we recieved some data from our query
$num_of_rows = mysql_num_rows ($query_result_handle)
or die (\"The query: '$query' did not return any data\");

print \"The query: '$query' returned $num_of_rows rows of data.
\";

# use mysql_fetch_row to retrieve the results
for ($count = 1; $row = mysql_fetch_row ($query_result_handle); ++$count)
{
print \"
<b>Fetching row #$count from the query.</b>
\";
print \"Value stored at the first index position of \$row: '$row[0]'
\";
print \"Value stored at the second index position of \$row: '$row[1]'
\";
print \"Value stored at the third index position of \$row: '$row[2]'
\";
print \"Value stored at the fourth index position of \$row: '$row[3]'
\";
print \"Value stored at the fifth index position of \$row: '$row[4]'
\";
print \"Value stored at the sixth index position of \$row: '$row[5]'
\";
print '...
';
}

?>

در اینجا یک نمونه کامل از ایجاد ارتباط با MySQL و سپس انتخاب بانک مورد نظر و بعد گرفتن یک Query توسط دستور mysql_query و سپس نوشتن نتایج حاصل از اجرای Query توسط دستور mysql_fetch_row می باشد .
در این نمونه برنامه از دستور mysql_num_rows برای پیدا کردن تعداد سطر های پیدا شده حاصل از اجرای query استفاده شده است .
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
فرستادن query های Update و Insert ی

<?php

mysql_connect("your host\", \"username\", \"password\") or die(mysql_error());
mysql_select_db(\"your database\") or die(mysql_error());

//********************
//Example 1
//********************

$rs = mysql_query(\"SELECT id FROM users WHERE name = 'pete'\");

if($row = mysql_fetch_array($rs))
{
mysql_query(\"UPDATE users SET visits=visits+1 WHERE id = '\".$row[\"id\"].\"'\");
}
else
{
mysql_query(\"INSERT INTO users (name) VALUES ('pete')\");
}

//********************

//********************
//Example 2
//********************

$rs = mysql_query(\"UPDATE users SET visits=visits+1 WHERE name = 'pete'\");

if(mysql_affected_rows() == 0)
{
mysql_query(\"INSERT INTO users (name) VALUES ('pete')\");
}

//********************

?>

نمونه ای از ارسال query های update و insert توسط دستور mysql_query به MySQL سرور
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
ی Login - Logout ی

<?php

   //need this to get session variables
   session_start();
   //Solution for -Page has Expired- error
   header("Cache-Control: \");
   header(\"pragma: \");

   //Check if session is ok or not
   if (!$PHPSESSID) {
       session_register(\"username\");
   } else if (!$visitors) {
       session_register(\"username\");
   }

   //is login button pressed
   if($login){
       if($loginname){
           if($password){
               if($loginname==\"test\" && $password==\"test\"){
                   $username=\"Test User\";

                   /* If you like jump to another page uncomment this and change www.intelligent-networks.com
                   *  to point where you like it
                   *
                   header(\"Location: http://www.intelligent-networks.com/\");
                   exit;
                   * */
               } else {
                   $msg=\"Wrong username or password\";
                   $username=\"\";
               }
           }else {
               $msg=\"Password missing\";
               $username=\"\";
           }
       } else {
           $msg=\"Username missing!\";
           $username=\"\";
       }
   }

   //*If logout unset all session variables
   if($logout){
       $username=\"\";
   }
?>

<html>
<head>
</head>
<body>
<form name=\"logaction\" method=\"post\">
<?php
if(!$username){
?>
Username<br>
<input type=\"text\" name=\"loginname\" size=\"10\">
<br>
Password<br>
<input type=\"password\" name=\"password\" size=\"10\">
<br>
<input type=\"submit\" name=\"login\" value=\"Login\">
<br><br>
Try <br>
   username:test<br>
   password:test<br>
<?php
   //display login messages
   echo \"<br>\".$msg.\"<br>\n\";

} else {
   //display user name
   echo \"User:\".$username.\"<br>\n\";
?>
<input type=\"submit\" name=\"logout\" value=\"Logout\">

<!--
Enter here data here
-->
<?php
}
?>
</form>
</body>
</html>

Just For Beginners

مجید قنبری ( Ranux )
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
Some Date-Related functionsی

<?
/*
Module name: DateUtil.inc

Copyright (c) 2002 Muhammad Khaaledy (khaaledy@ferdowsi.um.ac.ir, http://www.um.ac.ir/~khaaledy)
Last Modified: 02-20-2002

Hint:
All functions are coded based on the fact that, for every integer N, 22 + [33 * N / 8] will yield a
Solar leap year. Here by [x] I mean, the maximum integer not greater than x.
The C version is also available. If you want it, just email me!

License:
This program is free software; you can redistribute it and/or modify it under the terms of the GNU
General Public License as published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

If you don't have a copy of the GNU General Public License, write to the Free Software Foundation,
Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
   define("BASE_DAY\", 5);
   define(\"START_YEAR\", 1);
   define(\"BASE_YEAR\", 1370);
   /*
   GetNOfYear: Gets a Solar Year, and returns the corresponding N
   */
   function GetNOfYear($Year) {
       return round((8 * ($Year - 22)) / 33 + ($Year >= 22 ? 0.5 : -0.5));
   }
   /*
   GetLeapYear: Gets an N, and returns the corresponding Solar Leap year
   */
   function GetLeapYear($N) {
       return round(22 + 33 * $N / 8);
   }
   /*
   IsLeap: Checks whether a Solar Year is leap or not
   */
   function IsLeap($Year) {
       return $Year == GetLeapYear(GetNOfYear($Year));
   }
   /*
   IsSpecialLeap: As you may know, after 7 4-year-leap we have one 5-year-leap (hence, SPECIAL LEAP).
   This function, checks whether the Solar Year is a special leap or not
   */
   function IsSpecialLeap($Year) {
       return ($Year - 22) % 33 == 0;
   }
   /*
   IsChristianLeap: Checks whether the Christian Year is leap or not
   */
   function IsChristianLeap($Year) {
       return (!($Year % 4) && $Year % 100 || !($Year % 400));
   }
   /*
   NearestLeapYear: Calculates the smallest Solar leap year greater than a given Solar Year
   */
   function NearestLeapYear($Year) {
       while(!IsLeap($Year++));
       return $Year;
   }
   /*
   FirstDayOfYear: Calculates the first day of a Solar Year (0 = Saturday, 1 = Sunday, 2 = Monday etc.)
   */
   function FirstDayOfYear($Year) {
       return ((BASE_DAY +
           $Year - BASE_YEAR +    // Years Between
           GetNOfYear(NearestLeapYear($Year)) -
           GetNOfYear(NearestLeapYear(BASE_YEAR)) // Leaps Between
           ) % 7 + 7) % 7;
   }
   /*
   PassedDaysOfYear: Calculates the number of passed days from the start of a Solar year
   */
   function PassedDaysOfYear($Day, $Month) {
       return ($Month - 1) * 30 + ($Month < 7 ? $Month - 1 : 6) + $Day;
   }
   /*
   DayOfWeek: Calculates the day of week of a given date (year, month, and day)
   */
   function DayOfWeek($Year, $Month, $Day) {
       return (FirstDayOfYear($Year) + PassedDaysOfYear($Day, $Month) - 1) % 7;
   }
   /*
   LeapYearsBetween: Calculates the number of leap years between 2 given Solar Years
   */
   function LeapYearsBetween($FirstYear, $SecondYear) {
       return abs(GetNOfYear(NearestLeapYear($FirstYear)) - GetNOfYear(NearestLeapYear($SecondYear)));
   }
   /*
   IncrementDate: Increments a Solar date (year, month, and day), by one
   */
   function IncrementDate($Day, $Month, $Year) {
       if(++$Day <= 29)
           return array($Day, $Month, $Year);
       switch($Day) {
           case 30:
               if($Month != 12 || IsLeap($Year))
                   break;
               $Day = $Month = 1;
               $Year++;
               break;
           case 31:
               if($Month < 7)
                   break;
               $Day = 1;
               if($Month < 12) {
                   $Month++;
                   break;
               }
               $Month = 1;
               $Year++;
               break;
           case    32:
               $Day = 1;
               $Month++;
               break;
       }
       return array($Day, $Month, $Year);
   }
   /*
   DecrementDate: Decrements a Solar date (year, month, and day), by one
   */
   function DecrementDate($Day, $Month, $Year) {
       if(--$Day >= 1)
           return array($Day, $Month, $Year);
       if($Month == 1) {
           $Month = 12;
           $Day = 29 + IsLeap(--$Year);
       }
       else {
           $Month--;
           $Day = 31 - ($Month > 7);
       }
       return array($Day, $Month, $Year);
   }
   /*
   DateBackward: Calculates the date of 'Gap' days BEFORE a given Solar date
   */
   function DateBackward($Day, $Month, $Year, $Gap) {
       for($i = 0; $i < $Gap; ++$i)
           list($Day, $Month, $Year) = DecrementDate($Day, $Month, $Year);
       return array($Day, $Month, $Year);
   }
   /*
   DateForward: Calculates the date of 'Gap' days AFTER a given Solar date
   */
   function DateForward($Day, $Month, $Year, $Gap) {
       for($i = 0; $i < $Gap; ++$i)
           list($Day, $Month, $Year) = IncrementDate($Day, $Month, $Year);
       return array($Day, $Month, $Year);
   }
   /*
   DaysPassedFromTheFirst: Calculates the number of days passed from the start of a Solar Date
   */
   function DaysPassedFromTheFirst($Day, $Month, $Year) {
       return PassedDaysOfYear($Day, $Month) + ($Year - 1) * 365 + LeapYearsBetween($Year, START_YEAR);
   }
   /*
   DifferenceDate: Calculates the difference between two given Solar dates
   */
   function DifferenceDate($Day1, $Month1, $Year1, $Day2, $Month2, $Year2) {
       return DaysPassedFromTheFirst($Day1, $Month1, $Year1) - DaysPassedFromTheFirst($Day2, $Month2, $Year2);
   }
   /*
   XPassedDaysOf: Calculates the number of passed days from the start of a Christian year
   */
   function XPassedDaysOf($Day, $Month, $Year) {
       $XMonths = array(31, 28 + IsChristianLeap($Year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
       for($Days = $Cnt = 0; $Cnt < $Month - 1; $Cnt++)
           $Days += $XMonths[$Cnt];
       return $Days + $Day;
   }
   /*
   ConvertX2SDate: Converts a Christian Date to the corresponding Solar one
   */
   function ConvertX2SDate($Day, $Month, $Year) {
       $XDaysPassed = XPassedDaysOf($Day, $Month, $Year);
       $Year -= 622;
       $Month = 10;
       $Day = 11 + IsLeap($Year);
       return DateForward($Day, $Month, $Year, $XDaysPassed - 1);
   }
   /*
   ConvertS2XDate: Converts a Solar Date to the corresponding Christian one
   */
   function ConvertS2XDate($Day, $Month, $Year) {
       $today = date(\"Ymd\");
       $yy = substr($today, 0, 4);
       $mm = substr($today, 4, 2);
       $dd = substr($today, 6, 2);
       list($dd, $mm, $yy) = ConvertX2SDate($dd, $mm, $yy); // Today's Solar date
       $Diff = DifferenceDate($Day, $Month, $Year, $dd, $mm, $yy);
       return date(\"Ymd\", mktime(0, 0, 0, date(\"m\"), date(\"d\") + $Diff, date(\"Y\")));
   }
?>

Dear friends,
I wish here were a way to make me able to UPLOAD the source code for you. This is because pasting the code to the above textarea, will make it somewhat NASTY! :)
Ok, hopefully the code would be useful. I will be very pleased if you give me some feedbacks on it!
Regards,
Muhammad Khaaledy

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
تبديل html به text ی

// $document should contain an HTML document.
// This will remove HTML tags, javascript sections
// and white space. It will also convert some
// common HTML entities to their text equivalent.

$search = array (\"'<script[^>]*?>.*?</script>'si\",  // Strip out javascript
                \"'<[\/\!]*?[^<>]*?>'si\",           // Strip out html tags
                \"'([\r\n])[\s]+'\",                 // Strip out white space
                \"'&(quot|#34);'i\",                 // Replace html entities
                \"'&(amp|#38);'i\",
                \"'&(lt|#60);'i\",
                \"'&(gt|#62);'i\",
                \"'&(nbsp|#160);'i\",
                \"'&(iexcl|#161);'i\",
                \"'&(cent|#162);'i\",
                \"'&(pound|#163);'i\",
                \"'&(copy|#169);'i\",
                \"'&#(\d+);'e\");                    // evaluate as php

$replace = array (\"\",
                 \"\",
                 \" \",
                 \"\\"\",
                 \"&\",
                 \"<\",
                 \">\",
                 \" \",
                 chr(161),
                 chr(162),
                 chr(163),
                 chr(169),
                 \"chr(\\1)\");

$text = preg_replace ($search, $replace, $document);

اين مثال را در php manual ديدم كه به علت پر مصرف بودن و جالب بودن آنرا ميفرستم علاوه بر استفاده آن با قدرت دستور preg_replace هم آشنا شويد.

وحيدى
vahidi_2000 at NOSPAM yahoo dot com
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
اتصال با بانك هاي Access با استفاده از Ado ی

$conn = new COM(\"ADODB.Connection\");
$connstr = \"DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=\". realpath(\"DataBase_Name.Mdb\") .\" ;DefaultDir=\". realpath(\"./\");
$conn->open($connstr);

$result = $conn->execute(\"SELECT * FROM Table_Name\");
$result_fld0 = $result->Fields(0);
$result_fld1 = $result->Fields(1);
//.....2
//.....3

while (!$result->EOF) {
print \"$result_fld0->value      $result_fld1->value      <br>\n\";
$result->MoveNext();  //Goto Next Record

}
$result->close();
$conn->close();

راه معمول براي اتصال با بانك هاي Access استفاده از اتصالات ODBC است كه اين روش در شرايطي كه دسترسي به سرور ممكن نباشد ميتواند مشكل ساز باشد با استفاده از اتصالات Ado ميتوان به راحتي به بانكهاي Access و يا انواع ديگر بانكها اتصال مستقل از DSN را بر قرار كرد در اين مثال فرض بر ان است كه فايل Mdb. در مسير فايل PHP قرار دارد

علي اشرف زاده
Ali_Ashrafzadeh at NOSPAM hotmail dot com
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

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

این مقاله را میتوانید در آدرس زیر مشاهده کنید.

http://www.ccwmagazine.com/Issues/Issue14/software/PHP.ASP

با سپاس از آقای شیرازی
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به مقایسه با دیگر رقیبان | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
ساخت ورودی تاریخ

تابع استفاده شده در این مقاله رو میتونین در آدرس زیر پیدا کنید :
http://www.iranphp.net/modules/sections/index.php?op=viewarticle&artid=34

تا حالا شده بخواهيد يک تاريخ رو از کاربر بگيرين؟ خوب چه کارمی کنيد؟ نکنه يک فيلد از نوع text رو ميزارين و ميگين وارد کن!
همونطور که می دونيد اين روش خوبی نيست آخه بيچاره طرف چطوری بفهمه که به چه استايلی بايد وارد کنه و تازه اگر هم بدونه باز هم احتمال خطا زياد ميشه.

خوب پس چه بايد كرد؟
كاري كه معمولا انجام ميشه اينه كه سه تا select box رو توي فرم ميزارن و اونها رو به ترتيب به روز, ماه و سال اختصاص ميدن:
روز از 1تا 31 مي باشد.
توي ماه آرايه ماههاي خودمون رو مي ريزيم.
در مورد سال بستگي به جايي داره كه مي خواهيم از اون استفاده كنيم, من اينجا اون رو از دو سال قبل تا سال جاري گذاشتم, البته اگر برنامه مون طوري باشه كه مثلا بخواهيم از يه تاريخ تا تاريخ ديگه رو توي DataBase جستجو كنيم(داده هاي بين دو تاريخ رو بكشيم بيرون), دراين حالت مي تونيم اول سالهاي موجود در DataBase رو بخونيم و بعد بر طبق اون select box رو پر كنيم.

حالا فرض كنيد كه مي خواهيم action صفحه رو خودش بگذاريم, يعني بعد از اينكه كاربر تاريخ رو انتخاب كرد و فرم رو ارسال نمود برگرديم توي همين صفحه و select box ها دوباره چاپ بشن, دراين حالت بهتره كه select box ها رو طبق مقاديري كه كاربر فرستاده مقدار دهي كنيم كه كارير بدونه چه تاريخي رو انتخاب كرده.

خب اين تا اينجاي كار; حالا اگه بخواهيد بجاي يك تاريخ از كاربر چند تاريخ رو به طور همزمان بگيرين چي؟ آره درست حدس زدين! بايد تمام اين مراحل رو به همون تعداد باز از نو انجام بدين, به اضافه اينكه مجبور مي شين براي هر كدوم از فيلد ها دونه به دونه نامگذاري كنيد كه بعد از ارسال فرم (submit) بتونين اونارو از get يا post بگيرين.

حالا نوبتي هم باشه نوبت فانكشن بنده هست كه وارد عمل بشه وتمام اين كارها رو براتون انجام بده! تنها كاري كه شما بايد بكنيد اينه كه داخل يك فرم كه يك كليد submit هم داره اونو به اين صورت اجرا كنيد:

<form action=\"<?=$_SERVER[PHP_SELF]?>\" method=\"POST\">
<? MakeDateBox(method:[$_GET | $_POST],group name)?>
<input type=\"Submit\" value=\"Submit\">
</form>

method: همون method اي هست كه شما براي فرمتون ميزارين(get يا post)
group name: نام گروهي هست كه مي خواهيد واسه اون تاريخ بزارين.
در اينجا با متغير سازي كه توي فانكشن انجام ميشه سه متغير در get يا post دريافت خواهيد كرد, مثلا اگر فانكشن رو اينجوري اجرا كنين:

MakeDateBox($_POST,\"test\");

بعد از ارسال فرم سه متغير به اين صورت خواهيد داشت:

$_POST[ytest]: سال
$_POST[mtest]:ماه
$_POST[dtest]:روز

حالا اگه فانكشن رو n بار با n عدد اسم مختلف اجرا كنيد (n*3) متغير به طريق مذكور دريافت خواهيد كرد و n تعداد هم "date group" توي فرمتون چاپ خواهد شد.
از اونجايي كه مي گن: شنيدن كي بود مانند ديدن, بهتره كه فايل فانكشن رو با مثالي كه همراهش گذاشتم اجرا كنين و نتيجه رو ببينيد.

ضمنا اگر با متغير سازي (dynamic variables) و توابعي همچون sprintf كه در برنامه به كار برده شده آشنايي ندارين به اين آدرس ها يه سري بزنين:
http://ir.php.net/variables.variable
http://ir.php.net/manual/en/function.sprintf.php

موفق وپيروز باشيد, محمد دهقانپور.
m_dehghanpour@hotmail.com

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
تابع ساخت ورودی تاریخ

برای استفاده از این تابع میتوانید مقاله ای که در آدرس زیر هست مطالعه کنید :
http://www.iranphp.net/modules/sections/index.php?op=viewarticle&artid=33

<?php
   //  Make Date Box function
   //  Written by Mohammad Dehghanpour
   //  Email: m_dehghanpour@hotmail.com

  function MakeDateBox($method,$name="\")
  {

     $CurrentYear = Date(Y);
     $monthArray = array(\"\", \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\");

     $yContainer= \"y\".$name; // make var for year.
     $mContainer= \"m\".$name; // make var for month.
     $dContainer= \"d\".$name; // make var for day.

    // Put previous value of user submit in these dynamic vars.
        $$yContainer= $method[$yContainer];
     $$mContainer= $method[$mContainer];
     $$dContainer= $method[$dContainer];

     // make the day field
       echo \"<select name=\". $dContainer .\">\";
     echo \"<option value=''>Day</option>\";
     for ($i=1; $i<=31; $i++)
     {
           $str = \"<option value=\" . sprintf(\"%02d\", $i);

         // check for previous value of user submit.
           if ($i == $$dContainer)
             $str .= \" selected\";

         $str .= \">\" . sprintf(\"%02d\", $i) . \"</option>\";
          echo $str;
     }
     echo \"</select>\";

     // make the month field
     echo \"<select name=m\". $name .\">\";
     echo \"<option value=''>Month</option>\";
       for ($i=1; $i<=12; $i++)
     {
            $str = \"<option value=\" . sprintf(\"%02d\", $i);

         // check for previous value of user submit.
         if ($i == $$mContainer)
               $str .= \" selected\";

          $str .= \">\" . $monthArray[$i] . \"</option>\";
         echo $str;
     }
     echo \"</select>\";

     // make the year field
     echo \"<select name=y\" . $name . \">\";
     echo \"<option value=''>Year</option>\";
     for ($i=$CurrentYear; $i>=($CurrentYear-2); $i--)
     {
         $str = \"<option value=$i\";

         // check for previous value of user submit.
         if ($i == $$yContainer)
              $str .= \" selected\";

         $str .= \">\" . sprintf(\"%04d\", $i) . \"</option>\";
         echo $str;
     }
     echo \"</select>\";

  }// End function.
?>

   <!----------------------- An example ---------------------->
<div align='center'>
<form action=\"<?=$_SERVER[PHP_SELF]?>\" method=\"POST\">
<?
     // you can left the first argument empty if you wanna make only one date group, like this: MakeDateBox($_POST);
     // and then you will get tree vaiable named [y, m, d] from post or get.
     echo \"From:\";
     MakeDateBox($_POST,\"From\");
     echo\"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;To:\";
     MakeDateBox($_POST,\"To\");
?>
&nbsp;&nbsp;&nbsp;<input type=\"Submit\" style='border:1px solid #eeeee5;color:000000;' value=\"   Hit  \">
</form>
</div>
<?
     if(!empty($_POST))
     {
         // get maked variables.
         echo \"From:\".$_POST[yFrom].\"-\".$_POST[mFrom].\"-\".$_POST[dFrom];
         echo \"</br>\";
         echo \"To:\".$_POST[yTo].\"-\".$_POST[mTo].\"-\".$_POST[dTo];
     }
?>

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
استفاده از mysql بخش نخست

Lesson1

نوشته های زیر ترجمه آزادی از مرجع کامل php موجود در php.net/docs.php و همچنین برگزیده ای منابع زیر است

کتب:

1. php & mysql web development(sams)******

بهترین کتابی که من در این زمینه دیده ام

2. php Developers cookbook(sams)****

همان طور که از نامش پیداست برای برنامه نویسان نوشته شده است و در کل

کتاب بسیار جالبی است

3. MySQL and PHP Database Applications(M&T Books)***

بیشتر به بحث در رابطه با بانک اطلاعاتی mysql به همراه php می پردازد. در نوع خود کتاب بسیار خوبی است

4. MySQL&mSQL(O'reilly)***

این کتاب بیشتر به بحث در رابطه با ابنک های اطلاعاتی می پردازد تا php

این کتاب به طور موازی mysql و msql را و کاربرد های آنها را آموزش میدهد

5. Oreilly-PHP Pocket Reference(**)

به نظر من کتاب بسیار خوبی برای شروع است اما برای ادامه نه!

6. مرجع کامل php4 ترجمع گروه مهندسی ساحر****

من اکثر کتاب های ترجمه شده توسط این گروه را دارم در کل ترجمه این گروه روان و قابل فهم است اما در مورد کتاب اینکه کتاب بسیار کاملی است ولی من ترجیح میدهم بسیاری از مطالب را در کتاب دیگری بخوانم(به خصوص مبحث شی گرایی را)

سایت ها:

php.net******(Complete Reference)

(Project Center)******Sourceforge.net

(Main php Spenser)******www.zend.com

(It is little yet but it is wonderful)****iranphp.net

(Quick php Guide)***www.netkadeh.com

(Scripts Reference)*****www.hotscripts.com

...

* = کیفیت از نظر شخصی من

در این سلسله مقالات طریقه کار با بانک اطلاعاتی mysql را phpبحث می کنم فرض من براین است که شما اصول بانک های اطلاعاتی ودستور زبان SQL وهمچنین برنامه نویسی با php را بلدید.یکی از خصوصیات ممتاز php را میتوان توانایی کار با اکثر بانک های اطلاعاتی مثل sql server ویا mysql وبسیاری از دیتابیس های دیگر ذکر کرد.php برای بانک اطلاعاتی mysql توابع خاصی را درنظر گرفته است که در اینجا به معرفی متداول ترین و کاربردی ترین آنها با ذکر مثال وکد نمونه می پردازم برای شرع تعدادی از توابع را معرفی وپس ازاتمام معرفی توابع در ادامه تکنیک های خاص استفاده از آنها را ذکر خواهم کرد.در طول معرفی توابع از تعدادی مثال استفاده خواهد شد اما برای اینکه واقعا چیزی یاد بگیرید تنها باید از فکر خودتان استفاده کنید و بنا به کاربرد هایی که برای توابع ذکر میشود برنامه هایی را نوشته واجرا کنید.

حتما توجه کنید که این لیست فقط مانند یک فهرست عمل می کند و برای آگاهی بیشتر از توابع ذکر شده باید به مستندات php مراجعه کنید . البته در ادامه پرکاربرد ترین و عمومی ترین آن ها را توضیح خواهم داد.این مطالب را می توانید در مستندات php به زبان اصلی بخوانید هدف از این مطالب آشنایی شما با برخی توابع کاربردی است که در قسمت های آتی تکنیک های استفاده از آن ها را به شما یاد خواهم داد و در انتها با هم یک پروژه را انجام میدهیم.برخی از مطالب و توابعی را هم که در اینجا ذکر نکرده ام را (مثل حلقه foreach) در ادامه و در طی کار به شما خواهم گفت.

توابع مورد کاربرد در php نسخه چهار و سی وسه()

[break]

Php 4.3.3 functions for working with mysql

*=توابعی که در این بخش راجع به آن ها صحبت خواهم کرد

**=قسمت هایی که در صورت ترجمه به اصل مطلب صدمه می خورد

*mysql_affected_rows – تعداد رکورد های تحت تاثیر قرار گرفته در آخرین پرس و جوی انجام داده را می گیرد

mysql_change_user – کاربر فعال را در ارتباط جاری با بانک اطلاعاتی را عوض میکند عوض می کند

mysql_client_encoding –  تنظیمات کاراکتری پیش فرض را از ارتباط جاری را باز میگرداند

*mysql_close – ارتباع جاری با پایگاه داده  را قطع میکند

*mysql_connect – یک ارتباط جدید با پایگاه داده برقرار می کند

mysql_create_db – یک بانک اطلاعاتی میسازد

mysql_data_seek – نشانگر (پیوینتر) داخلی مجموعه جواب را حرکت می دهد

mysql_db_name – اطلاعات جواب پرس و جو را می گیرد

mysql_db_query – پرس و جو را ارسال می کند

mysql_drop_db – بانک اطلاعاتی را حذف میکند

mysql_errno – شماره خطای ایجاد شده در آخرین عملیات را باز می گرداند

mysql_error – متن خطای ایجاد شده در آخرین عملیات را باز میگرداند

mysql_escape_string –یک رشته را برای کار با بانک اطلاعاتی تطبیق می کند

*mysql_fetch_array – یک مجموعه جواب بازگشتی را در آرایه ای انجمنی یا اندیسی یا هر دو می ریزد

*mysql_fetch_assoc - یک مجموعه جواب بازگشتی را در آرایه ای انجمنی می ریزد

mysql_fetch_field – اطلاعات یک ستون را از یک مجموعه جواب میگیرد و یک شی را باز میگرداند

mysql_fetch_lengths – طول هر کدام از جواب های خروجی را باز می گرداند

*mysql_fetch_object – یک مجموعه جواب را در یک شی می ریزد

*mysql_fetch_row – یک مجموعه جواب را به صورت یک آرایه شمارشی در می آورد

mysql_field_flags – نمایه فیلد معرفی شده در مجموعه جواب را باز می گرداند

mysql_field_len – طول فیلد مشخص شده را باز میگرداند

mysql_field_name – نام فیلد مشخص شده در مجموعه جواب را باز می گرداند

mysql_field_seek – نشانه گر جواب را در فیلد مبدا مشخص شده قرار می دهد

mysql_field_table – نام جدولی را که فیلد در آن قرار دارد را باز می گرداند

mysql_field_type – نوع فیلد موجود در مجموعه جواب را باز می گرداند

mysql_free_result – حافظه را از مجموعه جواب خالی می کند

mysql_get_client_info – اطلاعات خدمات گیرنده پایگاه داده را بدست می آورد

mysql_get_host_info - اطلاعات میزبان  پایگاه داده را بدست می آورد

mysql_get_proto_info – پروتکل(قوانین) مورد استفاده در پایگاه داده را میگیرد  نسخه

mysql_get_server_info - اطلاعات خدمات دهنده  پایگاه داده را بدست می آورد

mysql_info – اطلاعاتی در مورد جدیدترین پرسش و پاسخ را باز می گرداند

*mysql_insert_id – شناسه آخرین فیلد اضافه شده را باز می گرداند

*mysql_list_dbs – بانک های اطلاعاتی موجود را نشان می دهد

*mysql_list_fields – ستون های جدول را نشان می دهد

mysql_list_processes – پردازش های انجام شده را نشان می دهد

*mysql_list_tables - لیست جدول های یک بانک اطلاعاتی را نشان می دهد

*mysql_num_fields – تعداد فیلد های یک مجموعه جواب را باز می گرداند

*mysql_num_rows - تعداد سطرهای یک مجموعه جواب را باز می گرداند

*mysql_pconnect – یک اتصال دائمی با پایگاه داده بر قرار می کند

*mysql_ping – یک ارتباط را پینگ می کند و در صورت برقرار نبودن ارتباط آنرا برقرار میسازد

*mysql_query – یک پرس و جو را ارسال میکند

mysql_real_escape_string کاراکتر های ویژه را در یک رشته برای استفاده از پایگاه داده بهینه میکند و در این عمل از تنظیمات کاراکتری موجود در پایگاه داده استفاده می کند.

*mysql_result - اطلاعات مجموعه جواب را باز میگرداند

*mysql_select_db – یک بانک اطلاعاتی را نتخاب می کند

mysql_stat – وضعیت سیستم جاری را باز می گرداند

mysql_tablename – نام جدول فیلد را باز میگرداند

**mysql_thread_id –جاری را باز می گرداند thread شناسه

mysql_unbuffered_query – یک پرس و جو را بدون واسطه به پایگاه داده ارسال می کند

در نسخه پنجم php که هنوز در مرحله بتا است توابع بسیار قدرتمند دیگری نیز اضافه شده است که معمولا به صورت Mysqli_* می باشند.در کل php 5 خیلی به سمت شی گرایی رفته است بنابراین توابع مورد استفاده در آن نیز تا حد امکان سعی در اضافه نمودن هرچه بیشتر امکانات شی گرایی دارند.پس از پایان این دروس توایع نسخه پنجم را نیز بررسی خواهیم کرد که البته بعلت تغییرات ناچیز یاد گیری و استفاده از آنها چندان مشکل نخواهد بود.

توجه کنید لازم نیست شما تک تک این توابع را حفظ کنید بلکه با دانلود کردن مرجع کامل php از سایت php.net می توانید هر زمان که لازم داشتید توضیحات مربوط به آن را بخوانید من توصیه می کنم که فایل chm را دانلود کنید زیرا استفاده از آن سریع تر و راحت تر است

در اینجا کاربردی ترین توابع را در نسخه جاری php(4.3.3) بحث می کنم

* تابع mysql_ping توجه کنید این تابع تنها کاری که می کند بررسی اتصال به موتور mysql است و معمولا در اسکریپت های تست که برای تست کردن آمادگی سرور بکار می رود استفاده می شود.این تابع یک اتصال به mysql را ping می کند و در صورت موفقیت و بازگشت جواب true و در غیر اینصورتfalse را باز می گرداند.در صورت قطع بودن ارتباط سعی میکند آنرا بر قرار سازد.

mysql_ping()
Ping a server connection or reconnect if there is no connection (PHP 4 >= 4.3.0)
bool mysql_ping ( [resource link_identifier ] )
Example:
<?php
$conn=mysql_connect($db_host, $db_user, $db_password);
$db=mysql_select_db($db_name);
if(mysql_ping($conn)){
echo "your database is online\",
} else {
echo \"your database is offline\",
}
mysql_close($conn);
?>

[break]

* تابع mysql_connect که وظیفه برقراری ارتباط با بانک اطلاعاتی را برعهده دارد و معمولا اولین خط اسکریپت کار با mysql را تشکیل میدهد زیرا تا زمانی که این تابع مقدار true را بازنگرداند شما اصلا به موتور mysql متصل نیستید تا بتوانبد کاری را انجام دهید!توجه کنید پس از پایان اسکریپت یا فراخوانی تابع mysql_close این اتصال قطع خواهد شد.

mysql_connect()
Open a connection to a MySQL Server (PHP 3, PHP 4 )
resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags ]]]]] )
Example:
<?php
$conn = mysql_connect("localhost\",\"mysql username\",\"mysql _password\") or die(Could not connect to database deamon:.mysql_error());
$db = mysql_select_db(\"your database name\",$conn) or die(Could not select database:.mysql_error());
$query = mysql_query (\"select  * from tablename\");
mysql_close ($conn);
?>

* تابع mysql_pconnect که وظیفه برقراری ارتباط دائمی با بانک اطلاعاتی را داراست و بعد از پایان اسکریپت و یا فراخوانی تابعmysql_close ارتباط قطع نمی شود.کاربرد این تابع در مواقعی است که شما می خواهید در زمان صرفه جویی کنید زیرا این تابع باعث می شود در فراخوانی های متعدد از همین ارتباط برای تبادل داده استفاده شود و ارتباط جدیدی بر قرار نگردد. معمولا این تابع زمانی استفاده می شد که چندین صفحه اتصال هایی با آرگومان ها ی مشابه را نیاز داشته باشند.

توجه کنید برای استفاده ازاین تابع شما حتما باید phpرا به عنوان ماژول نصب کنید نه CGI این یکی از راه های سریع کردن و بهینه کردن کد است اما توجه کنید که این امر می تواند باعث مشکل نیز بشود زیرا سبب ایجاد اتصالات بیهوده و بیکار که اصطلاحا آنها را idle می نامند می گردد توجه کنید این اتصالات به هر حال منابع سرور شما را مصرف خواهند کرد بنابراین کاربرد غلط آن می تواند موجب مشکلاتی شود.

mysql_pconnect()
Open a persistent connection to a MySQL server (PHP 3, PHP 4 )
resource mysql_pconnect ( [string server [, string username [, string password [, int client_flags]]]] )
Example:
<?php
$conn=mysql_pconnect("localhost\",\"mysql_username\",\"mysql_password\") or die(Could not connect to database deamon:.mysql_error());
$db = mysql_select_db (\"your database name\",$conn) or die(Could not select database:.mysql_error());
$Query = mysql_query (\"select  * from tablename\");
mysql_close ($conn);
?>
P = persistent = دائمی

* تابع mysql_close که باعث بسته شدن اتصال غیر دائمی به پایگاه داده می شود.

mysql_close()
Close MySQL connection (PHP 3, PHP 4 )
bool mysql_close ( [resource link_identifier ] )
Example:
<?php
$conn = mysql_connect ("localhost\",\"mysql username\",\"mysql_ password\") or die(Could not connect to database deamon:.mysql_error());
$db = mysql_select_db (\"your database name\",$conn) or die(Could not select database:.mysql_error());
$Query = mysql_query(\"select  * from tablename\");
mysql_close ($conn);
?>

[break]

* تابع mysql_select_db که بوسیله این تابع از اتصال جاری یک پایگاه داده را انتخاب می کنیم تا دستورات بعدی ما رو آن پایگاه داده اعمال شود.

mysql_select_db()
Select a MySQL database (PHP 3, PHP 4 )
bool mysql_select_db ( string database_name [, resource link_identifier ] )
Example:
<?php
$conn = mysql_connect("localhost\",\" mysql_user \",\"mysql_ password\") or die(Could not connect to database deamon:.mysql_error());
$db = mysql_select_db(\"your database name\",$conn) or die(Could not select database:.mysql_error());
$query = (\"select  * from tablename\");
$result = mysql_query ($query);
mysql_close ($conn);
?>

· تابع mysql_query که جزو مهترین توابع است زیرا این تابع دستورات sql شما را اجرا می کند این تابع معمولا با توابعmysql_fetch_* به همراه حلقه ها کار اصلی را در رابطه با پایگاه داده انجام میدهند

mysql_query()
Send a MySQL query (PHP 3, PHP 4 )
resource mysql_query ( string query [, resource link_identifier] )
Example:
<?php
$conn = mysql_connect("localhost\",\" mysql_user \",\"mysql_ password\") or die(Could not connect to database deamon:.mysql_error());
$db = mysql_select_db(\"your database name\",$conn) or die(Could not select database:.mysql_error());
$query = (\"insert into tablename values(1,2)\");
$result = mysql_query($query);
mysql_close($conn);
?>

· تابع mysql_result که برای یک رکورد از پردازش انجام شده توسط mysql_query() کاربرد دارد همان طور که قبلا گفتم برای خواندن تمامی رکورد ها باید از توابع mysql_fetch_* به همراه حلقه ها استفاده کرد.آرگومان اول مجموعه جواب اجرا شده بوسیله تابع mysql_query وآرکومان دوم شماره رکوردی که می خواهید بخوانید و آرگومان سوم فیلدی است که میخواهید بخوانید که در شورت معرفی نکردن آرگومان سوم اولین فیلد خوانده خواهد شد.

mysql_result()
Get result data (PHP 3, PHP 4 )
mixed mysql_result ( resource result, int row [, mixed field ] )
Example:
<?php
$conn=mysql_connect("localhost\",\" mysql_user \",\" mysql_password \");
$db=mysql_select_db(\"test\");
$query=\"select * from test\";
$result=mysql_query($query);
if($result)   /*for testing result answer*/{
            $record1=mysql_result($result,0,'name');
            echo \"Rcord 1 is:\",$record1;
            echo \"<p>\";
            $record2=mysql_result($result,1,'name');
            echo \"Rcord 2 is:\",$record2;
}
?>

· تابع mysql_affected_rows که تعداد سطرهایی را که توسط آخرین دستور delete یاreplace, یا insert یا ,update تحت تاثیر قرار گرفته اند را باز می گرداند

mysql_affected_rows()
Get number of affected rows in previous MySQL operation (PHP 3, PHP 4 )
int mysql_affected_rows ( [resource link_identifier ] )
Example:
<?php
   /* connect to database */
   mysql_pconnect("localhost\", \"mysql_user\", \"mysql_password\") or
       die(\"Could not connect: \" . mysql_error());
   mysql_select_db(\"mydb\");
   /* this should return the correct numbers of deleted records */
   mysql_query(\"DELETE FROM mytable WHERE id < 10\");
   printf (\"Records deleted: %d\n\", mysql_affected_rows());
   /* without a where clause in a delete statement, it should return 0 */
   mysql_query(\"DELETE FROM mytable\");
   printf (\"Records deleted: %d\n\", mysql_affected_rows());
?>

· تابع mysql_num_rows این تابع عملکردی مشابه تابع mysql_affected_rows دارد با این تفاوت که این تابع تعداد رکورد های مجمومه جواب بازگردانده شده از یک جستجوی select را بدست می آورد.از این تابع می توان برای بدست آوردن رکورهای یک جدول استفاده کرد.

mysql_num_rows()
Get number of rows in result (PHP 3, PHP 4 )
int mysql_num_rows ( resource result )
Example:
<?php
$conn = mysql_connect("localhost\", \"mysql_user\", \"mysql_password\");
mysql_select_db(\"database\", $conn);
$result = mysql_query(\"SELECT * FROM table\", $link);
$num_rows = mysql_num_rows($result);
echo \"$num_rows Rows\n\";
?>

[break]

· تابع mysql_free_result که وظیفه آزاد سازی حافظه مصرف شده بوسیله نتایج بدست آمده از query را داراست.این تابع در اسکریپت های طولانی که اعمال زیادی را انجام می دهند و حافظه زیادی را مصرف می کنند کاربرد دارد. ولی در اسکریپت های عادی به آن نیازی نیست زیرا درphp پس از پایان اسکریپت به طور خورکار حافظه اختصاص داده شده به query آزاد می شود.

mysql_free_result()
Free result memory (PHP 3, PHP 4 )
bool mysql_free_result ( resource result )
Example:
<?php
$conn = mysql_connect("localhost\",\"mysql username\",\"mysql _password\") or die(Could not connect to database deamon:.mysql_error());
$db = mysql_select_db(\"your database name\",$conn) or die(Could not select database:.mysql_error());
$query = mysql_query (\"select  * from tablename\");
mysql_free_result ($query);
mysql_close ($conn);
?>

· تابعmysql_fetch_array . همان طور قبلا بارها گفتم برای خواندن تمامی سطرهای یک جدول از توابع mysq_fetch_* به همراه حلقه ها استفاده میشود این توابع وظیفه دارند حاصل یک query را در یک آرایه یا مجموعه از اشیا بریزند تا بتوان به کمک حلقه ها تک تک آن ها را خواند.تابع mysql_fetch_array مجموعه جواب یک query را در یک آرایه می ریزد که بوسیله آرگومان دوم می توان طریقه ذخیره و دسترسی رادر آرایه(نوع آرایه) معیین کرد.

در اینجا لغات کلیدی را که در مثال های آتی استفاده می کنم را توضیح میدهم انها به عنوان ثابت در php تعریف شده اند .

ثابت

توضیحات

MYSQL_ASSOC

Columns are returned into the array having the fieldname as the array index.

بوسیله این ثابت می تونید از نام فیلدهای خود برای دسترسی به اطلاعات آن ها استفاده کنید

MYSQL_NUM

Columns are returned into the array having a numerical index to the fields. This index starts with 0, the first field in the result.

بوسیله این ثابت می توانید از شماره اندیس آرایه برای دسترسی به اطلاعات فیلد ها استفاده کنید

MYSQL_BOTH

Columns are returned into the array having both a numerical index and the fieldname as the array index.

بوسیله این ثابت می توانید از نام فیلد با اندیس آن در آرایه برای دسترسی به اطلاعات آن استفاده کنید

mysql_fetch_array()
Fetch a result row as an associative array, a numeric array, or both. (PHP 3, PHP 4 )
array mysql_fetch_array ( resource result [, int result_type ] )
1)Example for MYSQL_NUM:
<?php
   mysql_connect("localhost\", \"mysql_user\", \"mysql_password\") or
       die(\"Could not connect: \" . mysql_error());
   mysql_select_db(\"mydb\");
   $result = mysql_query(\"SELECT id, name FROM mytable\");
   while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
       printf (\"ID: %s  Name: %s\", $row[0], $row[1]);
   }
   mysql_free_result($result); ?>

2)Example for MYSQL_ASSOC:
<?php
   mysql_connect(\"localhost\", \"mysql_user\", \"mysql_password\") or
       die(\"Could not connect: \" . mysql_error());
   mysql_select_db(\"mydb\");
   $result = mysql_query(\"SELECT id, name FROM mytable\");
   while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
       printf (\"ID: %s  Name: %s\", $row[\"id\"], $row[\"name\"]);
   }
   mysql_free_result($result);
?>
3)Example for MYSQL_BOTH:
<?php
   mysql_connect(\"localhost\", \"mysql_user\", \"mysql_password\") or
       die(\"Could not connect: \" . mysql_error());
   mysql_select_db(\"mydb\");
   $result = mysql_query(\"SELECT id, name FROM mytable\");
   while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
       printf (\"ID: %s  Name: %s\", $row[0], $row[\"name\"]);
   }   mysql_free_result($result);
?>

توجه کنید که در صورت معرفی نکردن ثابت به طور پیش فرض از MYSQL_NUM استفاده میشود.

در ادامه تنها دو تابع از سری توابع mysql_fetch_* را معرفی میکنم زیرا تابع mysql_fetch_array تقریبا تمام نیاز های شما را بر طرف می کند اما در قسمت مباحث پیشرفته توابع mysql_fetch_field و mysql_fetch_lengths را نیزمعرفی خواهم کرد. توجه کنید شما هم اکنون هم میتوانید بدون مشکل یک برنامه کامل با php & mysql بنویسید .

· تابع mysql_fetch_row که عملکردی کاملا مشابه mysql_fetch_array به همراه ثابت MYSQL_NUM دارد.

· تابع mysql_fetch_assoc که عملکردی کاملا مشابه mysql_fetch_array به همراه ثابت MYSQL_ASSOC دارد.

· تابع mysql_fetch_object

این تابع رکورد های بازگردانده شده بوسیله یک دستور select را به صورت مجموعه ای از اشیا باز می گرداند که در پایان پس از اتمام رکورد ها بوسیله بازگرداندن false اتمام رکورد ها را اعلام می کند.در صورتی که به برنامه نویسی شی گرا علاقه دارید این تابع را دوست خواهید داشت.

mysql_fetch_object()
Fetch a result row as an object (PHP 3, PHP 4 )
object mysql_fetch_object ( resource result )
<?php
mysql_connect("hostname\", \"user\", \"password\");
mysql_select_db(\"mydb\");
$result = mysql_query(\"select * from mytable\");
while ($row = mysql_fetch_object($result)) {
   echo $row->user_id;
   echo $row->fullname;
  }
?>

· و آخرین تابع که یک تابع کاربردی است به نام mysql_insert_id
این تایع باعث بازگشت ID آخرین فیلد ایجاد شده بوسیله دستور insert می گردد.
*در جدول هایی که به طور ذاتی نمی توان برا ی آنها یک کلید اصلی (Primary key) تعریف کرد معمول است که یک فیلد به نام ID که دارای خاصیت AUTO_INCREMENT است تعریف می کنند که یک فیلد عددی است و برای فهمیدن تعداد رکور های جدول نیز کاربرد دارد.

mysql_insert_id()
Get the ID generated from the previous INSERT operation (PHP 3, PHP 4 )
int mysql_insert_id ( [resource link_identifier ] )
Example:
<?php
   mysql_connect("localhost\", \"mysql_user\", \"mysql_password\") or
       die(\"Could not connect: \" . mysql_error());
   mysql_select_db(\"mydb\");
   mysql_query(\"INSERT INTO mytable (name) values (\"houtan')\");
   printf (\"Last inserted record has id %d\n\", mysql_insert_id());
?>

خب توابعی که فکر می کردم برای شروع کار با mysql لازم میشود را گفتم اما همان طور که قبلا گفتم توابع زیادی در php برای کار با mysql تعبیه شده است در قسمت مباحث پیشرفته توابعی را به شما خواهم گفت که توانایی های جالب و بعضا قدرتمندی دارند اما شما هم اکنون هم می توانید یک برنامه کامل و حرفه ای را با استفاده از این توابع بنویسید که در ادامه یک برنامه برای تمرین با هم خواهیم نوشت اما به یاد داشته باشید تا زمانی که خودتان برنامه ننویسی و به مشکل برنخورید چیز زیادی در عمل یاد نخواهید گرفت در ضمن آخرین نکته اینکه اگر دارید تمرین میکنید و هیچ مشکلی در برنامه هایی که میخواهید بنویسی ندارید و می بینید همه چیز را بلدید فکر کنم باید در نحوه تمرین کردن خود تجدید نظر کنید.

Houtan Alghaspour
houtanal at yahoo dot com
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کار با Database ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
شیی گرایی در PHP بخش نخست

Php یک زبان شی گرای کامل نیست اما امکانات شی گرایی زیادی دارد.که در نسخه پنجم آن بهتر نیز شده است.

در این مقاله فرض من بر این است که شما زبان php تا حدودی بلدید.

شی گرایی زبان های برنامه نویسی را به دنیای واقعی نزدیک کرده است یعنی شما در برنامه نویسی شی گرا اشیایی را می سازید که توانایی هایی را دارند.

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

تعریف کلاس:

در php کلاس ها را به این گونه تعریف می کنیم

<?php
Class classname{

}

Example:

Class a{

//class codes

}
?>

خب حالا یک کلاس داریم.و در آن چند متغییر و تابع تعریف می کنیم.

<?php
Class a{
   var $i="hello,this is I variable\";
   function a1(){
     print \"hi,this is function a1()\";
  }

}?>

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

راه اول:

از کلمه کلیدی new استفاده می کنیم.به مثال توجه کنید

<?php
Class a{

function a1(){
     print "hi,this is function a1()\";
  }
}

$j=new a();

$j->a1();

//This code would print on screen:hi,this is function a1()

?>

کلمه کلیدی new یک شی جدید از کلاس معرفی شده می سازد یعنی مثل این است که کلاس را درون شی کپی میکند (این مثال چندان هم علمی نیست اما برای فهمیدن بد نیست).پس از آن ما با عملگر-> به متد های کلاس دسترسی داریم.

راه دوم

از عملگر::استفاده می کنیم که مستقیما نام کلاس و سپس نام متد را می آوریم.

<?php
Class a{

function a1(){

print "hi,this is function a1()\";

}

}

a::a1();

//This code would print on screen:hi,this is function a1()

?>

شما باید در هنگام کار بنا به نیاز خود از این عملگر ها استفاده کنید ولی ساختن یک شی معمول تر است زیرا در خواندن و فهم کد را راحت تر می کند و در هنگام گسترش پروژه نیز مشکل شما را کم خواهد کرد.

استفاده از $this

با $this ما به شی اجازه بازگشت به خود را می دهیم.یعنی ما می توانیم به اجزا کلاس جاری دسترسی پیدا کرده و آن ها را تغییر دهیم.

<?php

class name{

var $firstname="houtan\";

var $lastname=\"alghaspour\";

function print_name(){

Print \"My First Name is:&nbsp;\".$this->firstname.\"<br>\";

Print \"My Last Name is:&nbsp;\".$this->lastname;

}

function change_name(){

$this->firstname=\"changed first name\";

$this->lastname=\"changed last name\";

}

}

$i=new name();

$i->print_name();

//change name

$i->change_name();

echo \"<p>\";

$i->print_name();

?>

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

ایجاد سازنده(Constractor)

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

<?php

class a{

function a(){

print "You now create a new object\";

}

}

$i=new a();

?>

ایجادDestructor

کار Destructorدقیقا بر عکس سازند است.در php مانند زبانی مثل C# دقیقا Destructor به همان سادگی وجود ندارد اما میتوان بوسیله تابع() register_shutdown_function این کار را انجام داد

کار این تابع این است که در هنگام اتمام کد یک تابع را که برایش تعریف کرده اید اجرا میکند.

<?php

class a{

function a(){

print "Hello world!<p>\";

}

function a2(){

print \"destructoring...\";

}

}

$i=new a();

register_shutdown_function($i->a2());

?>

وراثت(Inheritance)

از قدیم گفته اند "پسر کو ندارد نشان از پدر تو بیگانه خوانش نه پسر"!با استفاده از وراثت ما کلاسی تعریف می کنیم که می تواند از اجزای کلاس والد خود استفاده کند(متغییر ها و متد ها).اما عکس این مطلب صادق نیست.

برای اینکه بگوییم کلاس از کلاس دیگری ارث برده از کلمه کیدی extends استفاده می کنیم.(برنامه نویسان جاوا به خوبی این لغت را می شناسند)

Example:

<?php

class a{

function a(){

print "This class a constructor<p>\";

}

function a1(){

print \"This function a1() from class a<p>\";

}

}

class b extends a{

function b1(){

print \"This is function b1() from class b\";

}

}

  $i=new b();

  $i->a1();

  $i->b1();

?>

به یکی دیگرتوجه کنید

<?php

class a{

   var $name="houtan\";

   function a1(){

   print \"<p>hello world!\";

   }

}

class b extends a{

  function b(){

  $this->name=\"ali\";

   print $this->name;

   }

}

  $i=new b();

  $i->a1();

?>

متغییر های عمومی و خصوصی(Private an public)

در زبان هایی مثل Java/ C++ /C# شما به سادگی می توانید توابع و متغییر های خود را private و یا Publicتعریف کنید از آنجا که php مستقیما روشی برای ایم کار ندارد بین برنامه نویسیا این زبان رسم شده تا از یک کاراکتر _ برای داده های خصوصی(Private) استفاده کنند. مثل نام گذاری لهستانی در C++.دلیل این کار سادگی فهم کد برای سایرین و یا خود شما پس از چند ماه است

(به نقل از کتاب PHP developer's cookbook صفحه209)

اما در مورد تعریف متغییر های عمومی می توانید از لغت کلیدی global استفاده کنید.

<?php

Function name()

{

global $myname;

$myname='houtan';

}

name();

echo $myname;

?>

توجه کنید اگر در خط 7 تابع name() را حذف کنید هیچ چیز روی صفحه نمایش نشان داده نمی شود چون این تابع باید حداقل یک بار اجرا شود تا متغییر myname به صورت عمومی تعریف شود.

شما باید global را قبل از متغییری که می خواهید از آن استفاده کنید بگذارید.

<?php

Function name()

{

global $myname;

$myname='houtan';

}

name();

echo $myname."<p>\";

function secondname(){

global $myname;

echo $myname;

}

secondname();

?>

هوتن اقاسپور
houtanal at yahoo dot com
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
استفاده از mysql بخش پایانی

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

خب در مرحله اول من باید جدول خود را طراحی کنم.جدول من باید حاوی نام, نام خانوادگی,email, شغل و یک فیلد دیگر باشد که مشخص کند آیا کاربر مایل است اخبار جدید سایت برای او ارسال شود یا نه.اما آیا این ها کافی است؟من همیشه یک فیلد به نام ID به جدول خود اضافه می کنم.این فیلد که یک فیلد عددی است را معمولا به عنوان کلید اصلی جدول تعریف می کنم.در ادامه فواید این فیلد اضافه را خواهید دید.

خب من قبل از هر چیزی باید به پایگاه داده ام وصل شوم پس می نویسم:

<?php

$conn=mysql_connect("localhost\",\"root\",\"pass\") or

          die(\"Could not connect;\".mysql_error());

?>

اگر در این مرحله مشکلی پیش بیاید بوسیله تابع die() از اجرای باقی برنامه جلوگیری کرده و پیغام مقتضی را روی صفحه نمایش نشان می دهم نقش تابع mysql_error() این است که پیغام خطای mysql را روی صفحه نمایش دهد و من بوسیله عملگر . از این تایع برای کامل کردن پیغام خطای اتصال استفاده کرده ام.

اکنون من یک بانک اطلا عاتی می سازم تا درون آن جدول یا جداول مورد نیازم را ایجاد کنم.

<?php

   $conn = mysql_pconnect("localhost\", \"root\", \"pass\")

       or die(\"Could not connect: \" . mysql_error());

   if (mysql_create_db(\"my_db\")) {

       print (\"Database created successfully\n\");

   } else {

       printf (\"Error creating database: %s\n\", mysql_error());

   }

?>

*توجه کنید میزبان شما معمولا نرم افزاری مثل phpmyadmin را در اختیار شما میگذارد تا مدیریت خود را روی mysql اعمال کنید.

*فراموش نکنید من فقط یک بار از mysql_create_db() استفاده می کنم تا یک بانک اطلاعاتی بسازم و بعد از آن چون کارهایم را روی آن انجام می دهم دیگر احتیاجی به استفاده از این تابع نیست!

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

<?php

   $conn = mysql_pconnect("localhost\", \"root\", \"pass\")

       or die(\"Could not connect: \" . mysql_error());

    $db=mysql_select_db(\"my_db\") or die(\"Could not select      database:\".mysql_error());

?>

خب برنامه من اکنون آماده است تا فرامینی به زبان sql را بگیرد و برای پردازش به mysql بدهد.برای

ارسال فرامین به mysql برای پردازش از mysql_query() استفاده می شود به مثال توجه کنید.

<?php

   $conn = mysql_pconnect("localhost\", \"root\", \"triadpass\")

       or die(\"Could not connect: \" . mysql_error());

    $db=mysql_select_db(\"my_db\") or die(\"Could not select database:\".mysql_error());

     $query='CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT ,'

        . ' `name` VARCHAR( 15 ) NOT NULL ,'

        . ' `family` VARCHAR( 20 ) NOT NULL ,'

        . ' `email` VARCHAR( 20 ) NOT NULL ,'

        . ' `job` VARCHAR( 20 ) ,'

        . ' `newspost` TINYINT NOT NULL ,'

        . ' PRIMARY KEY ( `id` ) );'

        . ' ';

     if(mysql_query($query)){

     print \"Table successfuly created\";}

     else print \"Error in create table\";

?>

من تا به حال یک بانک اطلاعاتی به همراه یک جدول درون آن را ساخته ام.توجه کنید شما ابزار های زیادی را در اینترنت می توانید پیدا کنید که این کار را بسیا ساده تر و مطمئن تر برای شما انجام دهند مثل phpmyadmin که خود بوسیله php نوشته شده و در آدرس www.phpmyadmin.net میتوانید آخرین نسخه آن را دانلود واستفاده کنید.در اکثر مواقع میزبان شما به عنوان یکی از خذماتش یک برنامه مدیریت بانک اطلاعاتی را برای شما تدارک دیده است.

از این به بعد بحث ما کمی کاربردی تر خواهد شد.

در اولین مرحله من می خواهم فرمی داشته باشم که کاربر مشخصات خود را درآن ثبت کند و پس از ارسال در جدول بانک اطلاعاتی من ذخیره شود.ابتدا فرم را طراحی می کنیم:

<html>

<form name=\"form1\" method=\"post\" action=\"<?=$_SERVER['PHP_SELF']?>\">

  <p>Name:

    <input type=\"text\" name=\"name\">

    Family:

    <input type=\"text\" name=\"family\">

    Email:

    <input type=\"text\" name=\"email\">

    Job:

    <input type=\"text\" name=\"job\">

  </p>

  <p>Do you want to recived the site news via email? <font color=\"#006699\">Yes</font>

    <input type=\"checkbox\" name=\"newspost\" value=\"checkbox\">

  </p>

  <p>

    <center><input type=\"submit\" name=\"Submit\" value=\"Submit\"></center>

  </p>

</form>

</html>

توجه کنید نام فیلد های شما بسیار مهم است زیرا این نام به عنوان متغییر به برنامه پردازش فرم ارسال می شود.اگر به خط دوم توجه کید به این عبارت بر خواهید خورد

این عبارت از یک ارایه به نام $_SERVER[] استفاده می کند.این آرایه شامل اطلاعاتی از قبیل هدرهاومسیرهاو....است که می توانید در مرجع کامل php موجود در php.net با عنوان

Predefined Variables این آرایه وبسیاری دیگر را پیدا کنید.به هر حال من از عنصر PHP_SELF در اینجا استفاده کردم که وظیفه آن باز گرداندن مسیرکد جاری است.

اکنون به کد کامل این فایل توجه کنید:

<?php

$name=$_POST['name'];

$family=$_POST['family'];

$email=$_POST['email'];

$job=$_POST['job'];

$newspost=$_POST['newspost'];

if(!empty($newspost)){

$newspost=1;

}

if(isset($name) && empty($name)==false && isset($family) && empty($family)==false&&

isset($email) && empty($email)==false && isset($job) && empty($job)==false){

   $conn = mysql_pconnect("localhost\", \"root\", \"triadpass\")

       or die(\"Could not connect: \" . mysql_error());

    $db=mysql_select_db(\"my_db\") or die(\"Could not select database:\".mysql_error());

    $query=\"INSERT INTO users VALUES('','$name','$family','$email','$job','$newspost')\";

    $result=mysql_query($query) or die(\"Could not do query!\");

    }

    else

    print \"Complete <b>ALL</b>for adding your self\";

?>

<html>

<form name=\"form1\" method=\"post\" action=\"<?=$_SERVER['PHP_SELF']?>\">

  <p>Name:

    <input type=\"text\" name=\"name\">

    Family:

    <input type=\"text\" name=\"family\">

    Email:

    <input type=\"text\" name=\"email\">

    Job:

    <input type=\"text\" name=\"job\">

  </p>

  <p>Do you want to recived the site news via email? <font color=\"#006699\">Yes</font>

    <input type=\"checkbox\" name=\"newspost\" value=\"checkbox\">

  </p>

  <p>

    <center><input type=\"submit\" name=\"Submit\" value=\"Submit\"></center>

  </p>

</form>

</html>

توجه کنید که من قبل از هر چیزی از $_POST[]برای قرار دادم متغییر های ارسال شده توسط فرم در متغییر های قابل استفاده در php است

(در حقیقت امذ متغییر های ارسال شده توسط فرم را درون یک آرایه می گذارد تا php از آن استفاده کند)در نسخه های قدیمی این امر اجباری نبود اما در نسخه های جدید این امر اجباری شده که بیشترین دلیل آن به خاطر مسائل امنیتی است.

*از نسخه4.2.0 این امر اجباری شده است که به جای register_globald از آرایه های $HTTP_*_VARS[] استفاده شود.با این حال شما با دست کاری در فایل php.ini می توانید این موضوع را تغییر دهید که این کار بدلیل مسائل انیتی اکیدا توصیه نمی شود.مقاله ای در این زمینه را در آدرس /studyinscarlet.txtwww.securereality.com.au

مشاهده کنید.

اما در اینجا مسئله ای که پیش می آید این است که نوشتن $HTTP_POST_VARS[]کمی سخت است بنابراین برای این آرایه ها اسامی مستعاری در نظر گرفته شد مثل$_POST[] برای$HTTP_POST_VARS[] یا...

خب من در ادامه بوسیله توابع empty() و isset() از پر بودن و موجود بودن متغییرهایم اطمینان حاصل کرده ام.اما اگر توجه کرده باشید من به دو روش از تابع empty() استفاده کرده ام.

1-empty($varname) == false

2-!empty($varname)

هر دو این روش ها درست است و من فقط برای یاد دادن به شما از هر دوی آن ها استفاده کرده ام.

تابع empty() یک تابع Boolean است یعنی مقدار بازگشتی آن یا true است یا false

من در روش اول گفته ام مقدار بازگشتی تابع empty() برابر false باشد که به معنای خالی بودن فیلد است

روش دوم هم همین است تنها تفاوت آن این است که من از عملگر نفی (!) استفاده کرده ام.

تابع isset() هم چک می کند که آیا متغیری به این نام تعریف شده است یا نه.

پس از اینکه من از پر بودن فیلد ها و وجود متغییر ها اطمینان حاصل کردم چک می کنم که آیا کاربر می خواهم اخبار سایت برای او ارسال شود یا نه.من برای نه مقدار 0 و برای بله مقدار 1 را در نظر گرفته ام که در ادامه با نحوی استفاده از آن ها آشنا خواهیم شد.

حالا که من از مرحله تست کردن متغییر ها بدون خطا گذشته ام وارد مرحله کار با بانک اطلا عاتی میشوم .

من یک اتصال برقرار کرده ام.بانک اطلا عاتی خود را انتخاب کرده ام و دستورات sql را که می خواهم اجرا شود در متغییری به نام $queryریخته ام.سپس بوسیله تابع mysql_query() آن ها را به mysql داده ام تا اجرا کند.

شما اکنون می توانید از یک فرم برای ذخیره اطلاعات استفاده کنید.من توابع مزتبط با این درس را برای شما مینویسم.اما بدون تمرین و به مشکل برخورد کردن چیزی یاد نخواهید گرفت.در صورتی که سوال یا مشکلی داشتید بوسیله houtanal at NOSPAM yahoo dot com آن را مطرح کنید.

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

تابع mysql_create_db()

این تابع یک بانک اطلاعاتی در پایگاه داده شما ایجاد می کند.

mysql_create_db()
Create a MySQL database (PHP 3, PHP 4 )
bool mysql_create_db ( string database_name [, resource link_identifier ] )
Example:
<?php
   $link = mysql_pconnect("localhost\", \"mysql_user\", \"mysql_password\")
       or die(\"Could not connect: \" . mysql_error());
   if (mysql_create_db(\"my_db\")) {
       print (\"Database created successfully\n\");
   } else {
       printf (\"Error creating database: %s\n\", mysql_error());
   }
?>

تابع isset()

این تابع از تعریف شدن و وجود متغییر اطمینان حاصل می کند.

isset()
Determine whether a variable is set (PHP 3, PHP 4 )
bool isset ( mixed var [, mixed var [, ...]] )
example:
<?php
$var = '';
// This will evaluate to &true; so the text will be printed.
if (isset($var)) {
   print "This var is set set so I will print.\";
}
// In the next examples we'll use var_dump to output
// the return value of isset().
$a = \"test\";
$b = \"anothertest\";
var_dump( isset($a) );      // TRUE
var_dump( isset ($a, $b) ); // TRUE
unset ($a);
var_dump( isset ($a) );     // FALSE
var_dump( isset ($a, $b) ); // FALSE
$foo = NULL;
var_dump( isset ($foo) );   // FALSE
?>

تابع empty()

بررسی می کند آیا مقدار متغیر خالی است یا نه در صورت پر بودن مقدار true و در غیر این صورت false را بر می گرداند.

empty()
Determine whether a variable is empty (PHP 3, PHP 4 )
bool empty ( mixed var )

example:
<?php
$var = 0;
// Evaluates to true because $var is empty
if (empty($var)) {
   echo '$var is either 0, empty, or not set at all';
}
// Evaluates as true because $var is set
if (isset($var)) {
   echo '$var is set even though it is empty';
}
?>

توابع مرتبط بیشتر برای مطالعه:

Mysql_drop_db(),mysql_change_user(),mysql_db_name(),mysql_db_query()
unset(),define(),array_key_exist(),count(),strlen()

هوتن القاسپور
houtanal at NOSPAM yahoo dot com
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کار با Database ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
Smarty يک Templating Engine برای PHP

مقدمه : چرا از Template استفاده کنيم ؟
در يک جمله می توان گفت برای جدا کردن منطق برنامه از نحوه ارائه!
با استفاده از يک Templating Engine می توان به اين هدف درست يافت به ترتيبی که برنامه نويس در گير ارائه و طراح رابط کاربر درگير کار برنامه نويس نشوند و با يک زبان مشترک باهم تعامل خواند داشت. به اين ترتيب برنامه نويس خيلی راح می تواند منطق برنامهرا عوض کند بدون اينکه در گير ارائه شود و طراح نيز می تواند بدون کمک برنامه نويس شکل و شمايل يک سايت را کاملاً عوض کند.
اين چند جمله بايد تا حدی برای شما روشن کرده باشد که با استفاده از اين روش تا چه حد انعطاف در کار بوجود می آيد. جالب نيست؟!

تعداد زيادی Templating Engine برای PHP وجود دارد از کلاسهای PEAR گرفته تا Smarty و بسياری ابزار های ديگر، ولی با توجه به موضوع اين مقاله از ديگر ابزار ها صرف نظر کرده و به Smarty(http://smarty.php.net) می پردازيم .
Smarty از PHP و Zend Engine استفاده می کند و با استفاده از آن، برنامه ها را با کمترين سربار نسبت به حالتی که از Template استفاده نشده باشد اجرا می شوند چون Smarty يک بار الگو را کامپايل کرده و تا وقتی که الگو تغيير پيدا نکد از نسخه کامپايل شده استفاده می نمايد. برای بالا بردن کارايی امکانات caching هم دارد.

Smarty چگونه کار می کند ؟

Smarty بصورت شی گرا طراحی شده و عمل می کند پس برای استفاده از آن بايد يک instance از آن ايجاد کنيم :

<?php
require_once('Smarty.class.php'); // use absolute path here, if necessary
$smarty = new Smarty;
?>

Smarty بصورت پيش فرض در همان شاخه ای که صدا می شود دنبال الگو می گردد ولی بنا به دلايل امنيتی الگوها نبايد در شاخه ای که از طريق وب قابل دسترسی هستند قرار گيرند برای معرفی مسير دايرکتوريهای Smarty به شکل زير عمل می کنيم :

$smarty->template_dir = '/var/www/templates/app1/template/';
$smarty->compile_dir = '/var/www/templates/app1/compile/';
$smarty->config_dir = '/var/www/templates/app1/config/';
$smarty->cache_dir = '/var/www/templates/app1/cache/';

شاخه template شاخه ای است که Smarty در آن به دنبال فایلهای .tpl می گردد.
شاخه compile شاخه ای است که Smarty در آن الگوهای کامپایل شده را ذخیره می کند.
شاخه config شاخه ای است که Smarty در آن به دنبال فایلهای تنظیمات می گردد.
شاخه cache شاخه ای است که Smarty در آن به دنبال فایلهایcache را ذخیره می کند.

روش دیگری نیز برای معرفی این متغیر ها وجود دارد و آن هم استفاده از مفهوم ارث بری است :

<?php
// require the Smarty class
require_once('Smarty.class.php');

// extend the Smarty class
class my_Smarty extends Smarty {

function my_Smarty() {

// create the Smarty object
$this->Smarty();
// set Smarty folders
$this->template_dir = '/var/www/templates/app1/template/';
$this->compile_dir = '/var/www/templates/app1/compile/';
$this->config_dir = '/var/www/templates/app1/config/';
$this->cache_dir = '/var/www/templates/app1/cache/';

// set other Smarty options
$this->use_sub_dirs = false;

}

}
?>

حالا وقت آن رسیده که استفاده از Smarty را در عمل ببینیم :

//test.php
<?php
// require the Smarty class
require_once('Smarty.class.php');
// extend the Smarty class
class my_Smarty extends Smarty {

function my_Smarty() {

// create the Smarty object
$this->Smarty();
// set Smarty folders
$this->template_dir = '/var/www/templates/app1/template/';
$this->compile_dir = '/var/www/templates/app1/compile/';
$this->config_dir = '/var/www/templates/app1/config/';
$this->cache_dir = '/var/www/templates/app1/cache/';

// set other Smarty options
$this->use_sub_dirs = false;

}

}
//creating an instance of my_smarty
smarty=new my_smarty();
// assign values from PHP
$smarty->assign('title', 'this is a sample');
$smarty->assign('testـstatement', 'Hello friends');

// display a template
$smarty->display('test.tpl');
?>

//test.tpl
<html>
<head><title>{ $title }</title></head>
<body> { $testـstatement }!</body>
</html>

هنگامی که مرور گر درخواستی برای صفحه test.php می فرستد مقدار متغیر ها بصورت \ویا توسط PHP مقدار دهی میشود و خروجی برای کار بر به شکل زیر خواه بود :

[/code]

this is a sample
Hello friends !

[/code]

استفاده ازفایلهای Configuration :
این فایلهای برای طراحیان Template بسیار مفید است، چرا که می توانند تنظیماتی را که در سراسر سیستم استفاده می شود مانند رنگها و ... را در این فایلها قرار دهند.

#config.conf
# Sample configuration file
# Pound signs are used for comments
colorA=#cccccc
colorB=#eeeeee
title=\"iranphp – first Persian  PHP Resource\"
[test_section]
test_section_title=\"test\"
test_section_title_Color=#000000

//test.tpl
{config_load file=\"config.conf\"}
<html>
<head><title>{ $title }</title></head>
<body bgcolor=\"{colorA}\"> { $testـstatement }!</body>
</html>

در مثال فوق با اجرای test.php مقادیر متغیر ها توسط PHP و Config فایل تعیین می شود و در نتیجه خروجی زیر تولید می شود :

<html>
<head><title>iranphp – first Persian  PHP Resource </title></head>
<body bgcolor=\"#cccccc\"> test!</body>
</html>

Smarty امکانات بسیار گسترده تراز آنچه در این مقاله به آن اشاره شد دارد از جمله فیلترها ،حلقه ها و عبارات شرطی و بسیاری امکانات دیگر که بررسی آنها خارج از بحث این مقاله است و در اینجا مراد نشان آشنایی با این Templating Engine بود .

منابع :
http://smarty.php.net
http://www.zend.com
http://www.dotgeek.com

موفق باشيد
آرش ميکائيلی

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به Template Engines | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
SQLite پیشنهاد سبک وزن

این درسته که MYSQL و بقیه RDBMS ها برای برنامه های بزرگ و چند کاربره مفید هستند ولی خوب اگر شما می خواین یک سایت کم ترافیک و کوچیک درست کنین، شاید SQLite بهترین راه حل باشه. چون سرعتش نسبت به MYSQL 2تا 3 برابر بیشتره که خوب مزیت بزرگیه.
کار با SQLite در PHP و بوسیله دستور PEAR آسان است. در نصب PEAR بطور پیش فرض SQLite وجود نداره ولی خیلی راحت Pear می تونه پکیج SQLite را download کنه سپس کامپایل کنه و در نهایت نصبش کنه.

[root@zaemis www]# pear download SQLite
File SQLite-1.0.2.tgz downloaded (362412 bytes)
[root@zaemis www]# pear install SQLite-1.0.2.tgz

الان SQLite در شاخه DB از PEAR قابل دسترسی است.

<?php
require_once "DB.php\";
require_once \"DB/SQLite.php\";
$db = new DB_sqlite();
?>

برای کاربران windows یک فایل dll کامپایل شده وجود دارد که شما می تونید اونو از این آدرس download کنید.

SQLite binary for Windows: snaps.php.net/win32/PECL_STABLE/php_sqlite.dll

حالا باید به فایل php.ini اینها رو اضافه کنیم (البته اگر شما از php version 5 استفاده می کنید نیازی به این تغییرات نیست).

; load the SQLite extension (UNIX)
extension=sqlite.so
; windows users will want to use this version instead
; extension=php_sqlite.dll

اتصال به دیتابیس
اتصال به SQLite با MySQL یه مقدار فرق داره. چون MySQL برای محیط های چند کاربره طراحی شده در حالیکه SQLite برای برنامه های کاربردی تک کاربره طراحی شده که نیازی به ID و password هم برای وصل شدن نداره.
در عوض باید از یک آرایه برای ایجاد یک DSN (Data Source Name) استفاده کرد. DSN اشاره گری است برای مشخص کردن محل قرارگیری فایلهای دیتابیس. بعد این DSN رو به متد connect() پاس می کنیم.

<?php
$DSN = array(
"database\" => getcwd() . \"/dbase/mydbase.db\",
\"mode\"=> 0644
);
$db->connect($DSN);
?>

اگر شما به دیتابیسی متصل شوید که وجود خارجی نداشته باشد یک دیتابیس جدید با permission های ذکر شده جاوی mode ایجاد می شود.
متد disconnect() برای قطع کردن اتصال استفاده می شود.

<?php
$db->disconnect();
?>

پرس و جوها
متد query() برای این منظور استفاده می شود. مثل MySQL پرس و جوها می تونن برای ایجاد جداول و وارد کردن دیتا استفاده شوند.

<?php
$query =
"INSERT INTO guestbook (fname, lname, email, comments)
VALUES ('John', 'Smith', 'jsmith@example.org', 'Great Website!')\"
;
$result = $db->query();
?>

متد fetchRow() می تواند برای نشان دادن نتیجه پرس و جو استفاده شود که معادل متد mysql_fetch_row هست.

<?php
$query = "SELECT * FROM guestbook\";
$result = $db->query($query);
while (list($fname, $lname, $email, $comment) = $db->fetchRow(
$result))
{
echo \"<p><a href=\\"mailto:$email"
>$fname $lname</a> said:<br />\";
echo nl2br(htmlspecialchars(stripslashes($comment))) .
\"</p>\";
}
?>

نوشتن کد
در اینجا یک نمونه اسکریپت که با استفاده از SQLite نوشته شده داریم:

<?php
require_once "DB.php\";
require_once \"DB/SQLite.php\";
$db = new DB_sqlite();
$DSN = array(\"database\" => getcwd() . \"/dbase/mydbase.db\");
$db->connect($DSN);
$query = \"SELECT * FROM guestbook\";
$result = $db->query($query);
while (list($fname, $lname, $email, $comment) = $db->fetchRow(
$result))
{
echo \"<p><a href=\\"mailto:$email"
>$fname $lname</a> said:<br />\";
echo nl2br(htmlspecialchars(stripslashes($comment))) .
\"</p>\";
}
$db->disconnect();
?>

دستوراتی از SQL که پشتیبانی نمی شوند
هر برنامه دیتابیسی تفسیر خودش رو از SQL92 استاندارد داره، SQLite هم مستثنا نیست. بعضی از اینها ناشی از مدل طراحی embedded این دیتابیس دارند (مثل فقدان REVOKE و GRANT) بعضی هاشون هم جدا لج آورند (مثل نادیده گرفتن data type ها)
در این آدرس می تونید لیستی از دستورات SQL رو که توسط SQLite پشتیبانی می شوند را ببینید:

(http://www.sqlite.org/lang.html) http://www.sqlite.org/lang.html

اینجا هم لیست دستوراتی است که فعلا توسط SQLite پشتیبانی نمی شوند.

http://www.sqlite.org/omitted.html) http://www.sqlite.org/omitted.html
http://www.sqlite.org/cvstrac/wiki?p=UnsupportedSql
http://www.sqlite.org/cvstrac/wiki?p=UnsupportedSql

SQLite: A Lightweight Alternative
by Timothy Boronczyk
The Swiss army knife of data storage
Wez Furlong

provided by Shilan

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کار با Database ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
PHP در مسیر شئ گرایی(قسمت اول)

اغلب از مفهوم شئ گرايي در زبان مورد علاقه ما چشم پوشي مي شود يا به غلط تفسير مي شود ولي اگر به طور صحيح بکار گرفته مي شود خيلي هم قوي به نظر مي رسد. آينده PHP
درباره شئ گرایی بسیار روشن است این از خصوصیات جدیدی که در PHP5 گنجانده شده کاملأ مشخص است. با ابزار مناسب تنها چیزی که لازم داریم دانش است. در این مقاله
سعی شده که مفهوم واقعی شئ را بررسی کنیم و اینکه چه جوری اونها را شناسایی کنیم همچنین سعی شده ما را با سه رکن اصلی OOP یعنی کپسوله کردن، ارث بری و
پلی مورفیسم بیشتر آشنا کند.
برنامه نویسی شئ گرا همانطور که از اسمش هم پیداست برنامه نویسی با اشیاء است. ولی خوب معنی دقیق شئ چیه؟
بذارید اول بگم شئ چی نیست! شئ فقط یه کلاس نیست که یه مشت تابع داخلش ریخته باشن. شاید به نظر بدیهی بیاد ولی واقعیت اینه که وقتی آدم مقوله OOP رو در یه زبان
رویه ای مثل PHP کشف می کنه هیجان زده میشه که زودتر استفادش کنه بدون اینکه از تئوری اولیه اون خبر داشته باشه!
حالا شئ چیه؟
شئ موجودیتی است که خصوصیات(properties) و رفتارهایی را (behavior) در خودش کپسوله می کند که مخصوص همان موجودیت است.
شاید به نظر عجیب بیاد ولی اشیاء دور و ور ما هستند. بعضی خودشون از اشیاء دیگری تشکیل شدن. روزنامه دستتون، پنجره اتاق خود اتاق در دیوار...
ولی درباره OOP بعنوان یک مفهوم چیزای زیادی هست که باید بدونیم. در طول این سالها (کدوم سالها؟!) متدلوژیهای مختلفی برای نزدیک شدن به شئ گرایی توسعه یافتند، حتی
می شه به سه مرحله تقسیمش کرد: تحلیل شئ گرا(OOA)، طراحی شئ گرا(OOD) و برنامه نویسی شئ گرا(OOP) که برای تبحر در هر کدومشون وقت زیادی لازم است
مثلا مدلهای طراحی هنوز بدجوری رویه ای هستند. می دونید فقط syntax نیست که مهم هست در واقع قسمت سخت ماجرا شئ گرایانه فکر کردن و تمرین کردن و در نهایت
بکارگیری هست. نگذارید این واقعیات شما رو دلسرد کنه چون یادگیری مفاهیم قسمت اعظم موضوعه (که لابد تو این مقاله قراره یاد بگیریم)
شئ گرایی مزایای زیادی داره از جمله: استفاده دوباره، توسعه پذیری و نگهداشت پذیری که مهمترین اونها هستن.

استفاده دوباره: اشیاء می توانند رو پای خوشون بایستند یعنی مجردند؛ و نشاندهنده یک چیز هستند. به این معنی که می توانند به گونه های مختلف ترکیب شوند، که
این همون خاصیت استفاده دوباره را ایجاد میکند. استفاده دوباره از اشیاء کلی توی وقت ما صرفه جویی میکنه چون مجبور نیستیم همه چیز و از اول بسازیم.
توسعه پذیری: بجای نوشتن یک شئ از اول ما می تونیم یک شئ را گسترش بدیم. یه شئ می تواند از یک شئ دیگر مشتق شود و فقط کارایی هایی را که لازم
است به شئ جدید بیفزاییم.
نگهداشت پذیری: طبیعتأ اشیاء چون خوانایی بالایی دارند، خیلی راحتتر تحلیل میشوند و خیلی بهتر میتوان از برنامه های موجود توسعه اشون داد و اینکه
طبیعت "pluggable" دارند کد کمتری برای ویرایش اونها لازم است.

تصور غلط درباره بکارگیری OOP در PHP
قبل از ادامه بحث دوست دارم یه مقدار درباره این موضوع که PHP 4 شئ گرایی را پشتیبانی نمی کند صحبت کنم. بریم سر اصل مطلب:

فقدان وجود کنترلهای دستیابی: گرچه این در php5 تغییر میکنه (private, public و protected اضافه خواهند شد) به عقیده بنده این پارامتری نیست که جلوی
ما را در بکارگیری OOP بگیره، کنترلهای دستیابی به هیچ وجه به منظور ایجاد امنیت بوجود نیامدند، بلکه برای کمک کردن به برنامه نویس درست شدند که
برنامه نویس لازم نباشه نگران باشه که تصادفی به اعضایی دسترسی پیدا شود که نباید دست بخورند. فقط باید حواسمون رو بیشتر جمع کنیم. اینکه مفسر برنامه این
اجازه را از شما نمی گیره به این معنا نیست که شما تئوری oop رو نمی تونید بکار بگیرید.

فقدان کلاسهای مجرد: بازهم این نمی تونه شما رو از کدنویسی شئ گرا باز نگه داره حتی در تئوری! اساسأ یک کلاس مجرد به این معناست که شما باید در هنگام
ایجاد زیرکلاسها متدهای مجرد پیاده سازی کنید، و قادر نباشید از آن instance بسازید(خدا وکیلی اینو خودم هم نفهمیدم چی گفت). بعضی از زبانها مثل جاوا بصورت
built-in این موضوع را پشتیبانی می کنند که خیلی خوبه ولی بدون اون هم زندگی غیر ممکن نیست! بسادگی میشه یک متد خالی در superclass رو در زیر کلاسها
override کنید.(که در قسمت پلی مورفیسم نشان خواهم داد چگونه).

عدم پشتیبانی از ارث بری چندگانه: گرچه بعضی اعتقاد دارند که ارث بری چندگانه مفید هست ولی به عقیده من فقط ایجاد ابهام میکند. شما چندتا مثال سراغ دارین که
در آن یک شئ از دو یا چند superclass ارث ببره و هنوز بتونه رابطه is-a را حفظ کنه (اگر معنی این رابطه را نمی دانید من پایینتر توضیح دادم).

گرچه عقاید متفاوتند ولی من فکر نمی کنم این محدودیتها کاملا قابل چشم پوشی هستند و اصلأ دلیل خوبی برای ترک شئ گرایی درphp نیستند.

درک اشیاء
وقتی داریم تکنیک های جدید برنامه نویسی را یاد می گیریم، معمولأ خوبه که از نمونه های دنیای واقعی کمک بگیریم. اینجا می تونیم یک ماشین را در نظر بگیریم. فکر کنید یک
ماشین چه چیزهایی دارد(properties) و چه کارهایی می تواند انجام دهد(behaviour) .
چیزهایی که ماشین دارد: properties))
پنجره
در
چرخ
موتور
در اینجا لازم به ذکر است که که properties خودشون می توانند شئ باشند با properties و behaviour خودشان. در شئ گرایی این ترکیب نام دارد. شما می توانید
بگویید که ماشین تشکیل شده از... و حتی پا را فراتر بگذارید و بگویید که هر شئ هم از اشیاء دیگر تشکیل شده و .... ولی در موقع برنامه نویسی سعی کنید فقط چیزهایی
را تعریف کنید که بدرد میخورند و بیخودی وارد جزئیات نشوید.

خوب بریم ببینیم یک ماشین چه کار می تواند بکند:
شتاب بگیرد
ترمز کند
درها باز شوند
این رفتارها مخصوص خود ماشین هستند. شما باید قادر به تشخیص اشیاء در واقعیت باشید تا بتوانید خوب از معماری شئ گرا استفاده کنید واقعأ احمقانه نیست که در زندگی
عادی شئ گرا فکر کنیم. کل عالم از اشیاء تشکیل شده، سعی کنید اشیاء را شناسایی کنید!

رکن اول: کپسوله کردن
از اینجا به بعد باید از یک زاویه دیگه به قضیه نگاه کنیم. آیا یک ماشین می تواند خودش براند؟ البته که نه، وقتی شئ گرا نگاه کنیم خود راننده یک موجودیت جداست.
خیلی مهم است که این تفاوت را حس کنیم: اشیاء باید مسوولیت های خودشان را داشته باشند. اونها فقط باید قادر باشند کارهای خودشان را انجام بدهند و نه چیزی بیشتر
در واقع property های یک شئ فقط باید تحت تأثیر رفتارهای همان شئ تغییر کنند. اینکه یک شئ مستقیمأ بتواند روی property های شئ دیگر تأثیر بگذارد بکلی
غلط است. یک شئ باید جزئیاتش را برای خودش حفظ کند و آنچه که بروز می دهد فقط interface اش باشد و یک شئ دیگر فقط به جزئیات آن شئ از طریق این
interface می تواند دسترسی داشته باشد. وقتشه که این تئوری را ازطریق یک کد بازگو کنیم: یک کارخانه اتومبیل می خواهد اتومبیل بسازد ولی فقط در سه رنگ:
قرمز، آبی و سبز. برای اینکه بدونید مسوولیت یعنی چی من اعتراف می کنم مثال اولم مثال خوبی نبود! در ضمن syntax برنامه ربطی به من نداره می تونید
php manual را تحت عنوان Class/object functions مطالعه کنید.

<?php
        class Car
        {
        var $color;
        }

        $specificCar = new Car();
        $specificCar->color = "yellow\";
        ?>

اشتباه! قانون ما این بود که هیچ رنگی غیر از قرمز و آبی و سبز ساخته نشود. خوب معلومه آخر عاقبت اداره کردن مستقیم colour property همینه دیگه! اتومبیل موند رو دستمون.
چون ما یک interface برای مراقبت از مسوولیت ها ایجاد نکردیم. در لیست 1 مثال بهتری را خواهید یافت.
لیست 1

<?php
        class Car
        {
        var $color;
        var $possibleColors = array("red\", \"green\", \"blue\");

        function setColor($color)
        {
        if (in_array($color, $this->possibleColors)) {
        $this->color = $color;
        }
        }
        }

        $specificCar = new Car();
        $specificCar->setColor(\"yellow\"); //would not alter the object

        $specificCar->setColor(\"red\"); //would alter the object
        ?>

سعی کنید که این کد را درک کنید و اینکه چرا این راه بهتر است، این بار اتومبیل ما یک interface دارد که ما از طریق این interface می توانیم مقادیر properties
را تغییر دهیم، متد setColor مراقب هست که چه اتفاقاتی ممکن است برای properties اتومبیل بیفتد. اگر interface امان را خوب بنویسیم، می توان مطمئن بود که
که اگر به غلط هم مقداردهی شود اتفاق بدی برای properties نخواهد بود و interface مراقب اوضاع خواهد بود. متد setColor اصلاح کننده(modifier) نام دارد و
property شئ اتومبیل را اصلاح می کند. در کنار اصلاح کننده، accessor ها را داریم. accessor برای برگرداندن property بجای اصلاح آن بکار می رود.
لیست 2 مثالی برای accessor را نشان می دهد.
لیست 2

<?php
class Car
{
var $color;

/*
* constructor, code inside this function is executed on object
* initialisation
* note that in PHP 5 the constructor will have to have the name
* __construct(), instead of the class name
* although this way of constructing will still work as long as no
*___construct() is found
*/
function Car()
{
$this->color = "red\";
}

// Accessor
function getColor()
{
return $this->color;
}
}
?>

در لیست 2 متد getColor همان accessor است. accessor ها همچنین می توانند داده را قبل از برگرداندن اداره کنند. همیشه بهتر است که بجای ارجاع مستقیم به
property های داخلی یک شئ از accessor ها استفاده کنیم. حالا می دونم بعضی از شما می پرسید که "من واقعأ نمی تونم property های شئ را مستقیمأ اداره کنم؟"
درسته. وقتی این مقاله نوشته می شد php هنوز فاقد اصلاح کننده هایی مثل private بود. هرچند این موضوع در php5 تغییر خواهد کرد شما می توانید محدودیت های
سر سختی برای قسمت های خصوصی خودتان بگذارید تا خیالتان راحت باشد که بهیچ وجه دستکاری نمی شوند.
خیلی مهم است که رفتار شئ شما بخوبی از طریق interface یا متدها تعریف شده باشد. چون خیلی مهم است که یک interface خوب در موقع استفاده دوباره هم خوب
باشد، باید واضح باشد که یک شئ چکار می کند. همیشه سعی کنید اسامی برای کلاسها انتخاب کنید که کار اون کلاس را بطور خلاصه بیان کند. از نوشتن اسامی بلند نترسید
در مجموع کپسوله کردن یعنی:
اشیاء جزئیات را برای خودشون نگه دارند
یک شئ فقط باید چیزی را ارائه کند که لازم است
یک شئ مسوولیت های خودش را دارئ
یک شئ باید interface واضحی داشته باشد

(این که مطالعه فرمودید قسمت اول شئ گرایی بود، سعی میکنم قسمت دوم هم هر چه زودتر آماده کنم:) شیلان کلهر)

Taking PHP the OO way
Leendert Brouwer

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
تابع mail در PHP

اين مقاله را می توانيد در اينجا مطالعه کنيد.
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
Mebership System

اين مقاله را می تواني در
اينجا مطالعه کنيد
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
توابع کار با XML - فایل

<?php
/** {{{ Copyright and License
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2.0 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*
* @copyright 2001-2004 Masoud Alinqian.
* @author Masoud Alinqian < masoud at m2ix dot com >
* @author Dave < dave at ovumdesign dot com >
* @package XML Functions
* }}}
*/

function xml_get_children($vals, &$i) {

   $children = array();

   if (isset($vals[$i]['value'])) $children[] = $vals[$i]['value'];

   while (++$i < count($vals)) {

       switch ($vals[$i]['type']) {

       case 'cdata':

           $children[] = $vals[$i]['value'];

           break;

       case 'complete':

           $children[] = array(

               'tag'        => $vals[$i]['tag'],

               'attributes' => isset($vals[$i]['attributes'])?

                               $vals[$i]['attributes'] : null,

               'value'      => $vals[$i]['value'],

           );

           break;

       case 'open':

           $children[] = array(

               'tag'        => $vals[$i]['tag'],

               'attributes' => isset($vals[$i]['attributes'])?

                               $vals[$i]['attributes'] : null,

               'children'   => xml_get_children($vals, $i),

           );

           break;

       case 'close':

           return $children;

       }

   }

}

function xml_get_tree($file) {

   $file=realpath($file);

   $data = @implode(NULL,file($file));

   $parser = xml_parser_create();

   $data=ereg_replace("(\r|\n)\",\"\",$data);

   xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);

   xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE,   1);

   xml_parse_into_struct($parser, $data, $vals, $index);

   xml_parser_free($parser);

   return array(

       'tag'        => $vals[0]['tag'],

       'attributes' => isset($vals[0]['attributes'])?

                       $vals[0]['attributes'] : null,

       'children'   => xml_get_children($vals, $i = 0),

   );

}

function xml_condense_tree($tree) {

   foreach ($tree['children'] as $index => $node) {

       if (isset($node['children'])) {

           $tree['children'][$index] = xml_condense_tree($node);

       } elseif (isset($node['value']) and !$node['attributes']) {

           $tree['values'][$node['tag']] = $node['value'];

           unset($tree['children'][$index]);

       }

   }

   if (!$tree['children']) unset($tree['children']);

   return $tree;

}

function xml_config_to_array($xml_tree,$root=false){

    $array_name=$xml_tree['tag'];

    if (is_array($xml_tree['children']))

    foreach ($xml_tree['children'] as $children){

        $child_id=$children['attributes']['id'];

        $child_name=$children['tag'];

        $child_name.=($child_id) ? \"__\".$child_id:'';

        if (is_array($children['children'])) {

            $child_array=xml_config_to_array($children);

            $temp_array[$child_name]=$child_array;

        } else {

            $temp_array[$child_name]=$children['value'];

        }

    }

    if (!$root)

        $xml_array=$temp_array;

    else     $xml_array[$array_name]=$temp_array;

    return $xml_array;

}

function xml_to_array($xml_tree){

    $array_name=$xml_tree['tag'];

    if ($xml_tree['attributes'])

    foreach ($xml_tree['attributes'] as $attribute_name=>$attribute_value) {

        $temp_name=\"_$attribute_name\";

        $temp_array[$temp_name]=$attribute_value;

    }

    if ($xml_tree['children'])

    foreach ($xml_tree['children'] as $children){

                $temp_name=$children['tag'];

                if (!is_array($temp_array[$temp_name])) $temp_array[$temp_name]=array();

        array_push($temp_array[$temp_name],xml_to_array($children));

    }

    if ($xml_tree['value']) {

        $temp_array['_']=$xml_tree['value'];

    }

    return $temp_array;

}

function recover_xml_array($xml_array) {

    $array_array=$xml_array;

  foreach ($array_array as $array_key=>$array_value) {

    if (is_array($array_value)){

       if(count($array_value)==1) $array[$array_key]=recover_xml_array($array_value[0]);

       else {

           $temp_array=array();

           $counter=0;

           foreach ($array_value as $child_value){

               $counter++;

               if ($child_value['_name']) {

                   $index_name=$child_value['_name'];

               } elseif ($child_value['_id']) {

                    $index_name=$child_value['_id'];

               } else {

                    $index_name=$counter;

               }

                $temp_array[$counter]=recover_xml_array($child_value);

            }

            $array[$array_key]=$temp_array;

       }

    } else {

        $array[$array_key]=$array_value;

    }

  }

  return $array;

}

function array_to_xml($array_tree,$root='root') {

    if (is_array($array_tree)) {

        $xml_temp='';

        $attributes='';

        foreach($array_tree as $xml_key=>$xml_value) {

            $is_array=is_array($xml_value);

            if ($xml_key=='_') {

                $xml_value=string_to_entity($xml_value);

                $xml_temp.=$xml_value;

            } else if(!$is_array && substr($xml_key,0,1)=='_') { # check for is attribute

                $xml_value=string_to_entity($xml_value);

                $attributes.=substr($xml_key,1,strlen($xml_key)-1).\"=\\"$xml_value" \";

            }else if ($is_array && substr($xml_key,0,1)=='_'){ #check for is array

                foreach($xml_value as $child_value){

                    $xml_temp.=array_to_xml($child_value,substr($xml_key,1,strlen($xml_key)-1));

                }

            } else if ($is_array){

                $xml_temp.=array_to_xml($xml_value,$xml_key);

            }  else {

                $xml_value=string_to_entity($xml_value);

                $xml_temp.=$xml_value;

            }

        }

    }

    if ($xml_temp || $xml_temp==='0') {

        $xml_output=\"<$root $attributes>$xml_temp</$root>\";

    } else {

        $xml_output=\"<$root $attributes />\";

    }

    return $xml_output;

}
?>

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نمونه برنامه ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
راهنمای کامل صب PHP بر روی windows

مقدمات نصب PHP (مشترک در تمامی حالات)
آخرین نسخهء PHP را از سایت رسمی PHP به آدرس http://www.php.net می گیریم. (توجه کنید که نسخهء installer را نگیرید.)
فایل فشرده را باز کرده و در شاخهء دلخواه (در اینجا c:\php) می ریزیم.
به شاخهء c:\php رفته و شاخه ای با نام tmp و شاخه ای با نام uptmp بسازید. (این نام ها اختیاری هستند)
فایل php.ini-recommended که در شاخهء c:\php وجود دارد را با notepade باز کرده، register_globals را پیدا کرده و مقدار جلوی آن را on کنید. سپس متغیر upload_tmp_dir را پیدا کرده و مقدار c:\php\uptmp را در جلوی آن قرار دهید و متغیر session.save_path را نیز پیدا کرده و مقدار c:\php\tmp را جلوی آن بنویسید.

نصب PHP 4 روی IIS به صورت CGI
فایل php.ini-recommended را باز کرده، extension_dir را جستجو کنید و مقدار جلوی آن را به c:\php\extensions تغییر دهید و سپس متغیر cgi.force_redirect را پیدا کرده، ";" جلوی آن را حذف کنید و مقدار آن را برابر با صفر قرار دهید.
فایل php.ini-recommended را به php.ini تغییر نام داده و در شاخهء ویندوز خود بریزید.
در IIS خود به برگهء Home Directory رفته و سپس روی دکمهء configuration کلیک کنید. در قسمت App Mapping مقادیر زیر را وارد کنید:

Executable : C:\php\php.exe
Extension : .php

سرور را دوباره راه اندازی کنید.

نصب PHP 5 روی IIS به صورت CGI
فایل php.ini-recommended را باز کرده، extension_dir را جستجو کنید و مقدار جلوی آن را به c:\php\ext تغییر دهید، سپس علامت ";" را از جلوی خط extension=php_mysql.dll بردارید و سپس متغیر cgi.force_redirect را پیدا کرده، ";" جلوی آن را حذف کنید و مقدار آن را برابر با صفر قرار دهید.
فایل libmysql.dll که در شاخهء c:\php وجود دارد را در شاخهء ویندوز خود کپی کنید.
فایل php.ini-recommended را به php.ini تغییر نام داده و در شاخهء ویندوز خود بریزید.

در IIS خود به برگهء Home Directory رفته و سپس روی دکمهء configuration کلیک کنید. در قسمت App Mapping مقادیر زیر را وارد کنید:

Executable : C:\php\php-cgi.exe
Extension : .php

سرور را دوباره راه اندازی کنید.

نصب PHP 4 روی IIS به صورت ISAPI
فايل‌هاى c:\php\php4ts.dll و c:\php\sapi\php4isapi.dll و c:\php\dlls\*.dll را در شاخه system ویندوز خود ذخيره كنيد.
فایل php.ini-recommended را باز کرده، extension_dir را جستجو کنید و مقدار جلوی آن را به c:\php\extensions تغییر دهید و سپس متغیر cgi.force_redirect را پیدا کرده، ";" جلوی آن را حذف کنید و مقدار آن را برابر با صفر قرار دهید.
فایل php.ini-recommended را به php.ini تغییر نام داده و در شاخهء ویندوز خود بریزید.

در IIS خود به برگهء Home Directory رفته و سپس روی دکمهء configuration کلیک کنید. در قسمت App Mapping مقادیر زیر را وارد کنید:

Executable : C:\{WIN_DIR}\system\php4isapi.dll
Extension : .php

سپس به برگهء ISAPI رفته و مقادیر زیر را وارد کنید:

Filter Name : php
Executable : C:\{WIN_DIR}\system\php4isapi.dll

سرور را دوباره راه اندازی کنید.

نصب PHP 5 روی IIS به صورت ISAPI
فایل php.ini-recommended را باز کرده، extension_dir را جستجو کنید و مقدار جلوی آن را به c:\php\ext تغییر دهید، سپس علامت ";" را از جلوی خط extension=php_mysql.dll بردارید و سپس متغیر cgi.force_redirect را پیدا کرده، ";" جلوی آن را حذف کنید و مقدار آن را برابر با صفر قرار دهید.
فایل php.ini-recommended را به php.ini تغییر نام داده و در شاخهء ویندوز خود بریزید.
فایل های php5isapi.dll و php5ts.dll که در شاخهء c:\php وجود دارد را در شاخهء system ویندوز خود کپی کنید.
فایل libmysql.dll که در شاخهء c:\php وجود دارد را در شاخهء ویندوز خود کپی کنید.

در IIS خود به برگهء Home Directory رفته و سپس روی دکمهء configuration کلیک کنید. در قسمت App Mapping مقادیر زیر را وارد کنید:

Executable : C:\{WIN_DIR}\system\php5isapi.dll
Extension : .php

سپس به برگهء ISAPI رفته و مقادیر زیر را وارد کنید:

Filter Name : php
Executable : C:\{WIN_DIR}\system\php5isapi.dll

سرور را دوباره راه اندازی کنید.

نصب PHP 4 روی Apache به صورت CGI
فایل php.ini-recommended را باز کرده، extension_dir را جستجو کنید و مقدار جلوی آن را به c:\php\extensions تغییر بدهید و سپس نام فایل را به php.ini تغییر داده و به شاخهء نصب Apache منتقل کنید.
در شاخه ‌ای که Apache را نصب کرده‌اید، زیرشاخه‌ای به نام \conf وجود دارد که در آن می‌ توانید فایل httpd.conf که مربوط به پیکربندی این برنامه است را بیابید. با یک notepad می‌ توانید این پرونده را باز کرده و تغییرات زیر را اعمال کنید.
در بخشی که ScriptAlias ها معرفی شده‌اند، سطر زیر را وارد می‌کنیم:

ScriptAlias /php/ \"c:/php/\"

به قسمت AddType application رفته و سطر زیر را می نویسیم:

AddType application/x-httpd-php .php

در بخش Action application هم این خط اضافه می ‌شود:

Action application/x-httpd-php \"/php/php.exe\"

در جلوی مقدار DirectoryIndex مقادیر دلخواه برای index شدن رو قرار می دهیم، خط شما چیزی مشابه زیر خواهد شد:

DirectoryIndex index.html index.htm index.html.var index.php

سرور را دوباره راه اندازی کنید.

نصب PHP 5 روی Apache به صورت CGI
فایل php.ini-recommended را باز کرده، extension_dir را جستجو کنید و مقدار جلوی آن را به c:\php\ext تغییر بدهید، سپس علامت ";" را از جلوی خط extension=php_mysql.dll بردارید و نام فایل را به php.ini تغییر داده و به شاخهء نصب Apache منتقل کنید.
فایل libmysql.dll که در شاخهء c:\php وجود دارد را در شاخهء ویندوز خود کپی کنید.

در شاخه ‌ای که Apache را نصب کرده‌اید، زیرشاخه‌ای به نام \conf وجود دارد که در آن می‌ توانید فایل httpd.conf که مربوط به پیکربندی این برنامه است را بیابید. با یک notepad می‌ توانید این پرونده را باز کرده و تغییرات زیر را اعمال کنید.
در بخشی که ScriptAlias ها معرفی شده‌اند، سطر زیر را وارد می‌کنیم:

ScriptAlias /php/ \"c:/php/\"

به قسمت AddType application رفته و سطر زیر را می نویسیم:

AddType application/x-httpd-php .php

در بخش Action application هم این خط اضافه می ‌شود:

Action application/x-httpd-php \"/php/php-cgi.exe\"

در جلوی مقدار DirectoryIndex مقادیر دلخواه برای index شدن رو قرار می دهیم، خط شما چیزی مشابه زیر خواهد شد:

DirectoryIndex index.html index.htm index.html.var index.php

سرور را دوباره راه اندازی کنید.

نصب PHP 4 روی Apache2 به صورت Module
فایل php.ini-recommended را باز کرده، extension_dir را جستجو کنید و مقدار جلوی آن را به c:\php\extensions تغییر بدهید و سپس نام فایل را به php.ini تغییر داده و به شاخهء نصب Apache منتقل کنید.
فايل‌هاى c:\php\php4ts.dll و c:\php\sapi\php4isapi.dll را در شاخه modules در شاخهء نصب Apache ذخيره كنيد.
در شاخه ‌ای که Apache را نصب کرده‌اید، زیرشاخه‌ای به نام \conf وجود دارد که در آن می‌ توانید فایل httpd.conf که مربوط به پیکربندی این برنامه است را بیابید. با یک notepad می‌ توانید این پرونده را باز کرده و تغییرات زیر را اعمال کنید.

در بخشی که LoadModule ها معرفی شده‌اند، سطر زیر را وارد می‌کنیم:

LoadModule php4_module modules/php4apache2.dll

به قسمت AddType application رفته و سطر زیر را می نویسیم:

AddType application/x-httpd-php .php

در جلوی مقدار DirectoryIndex مقادیر دلخواه برای index شدن رو قرار می دهیم، خط شما چیزی مشابه زیر خواهد شد:

DirectoryIndex index.html index.htm index.html.var index.php

سرور را دوباره راه اندازی کنید.

نصب PHP 5 روی Apache2 به صورت Module
فایل php.ini-recommended را باز کرده، extension_dir را جستجو کنید و مقدار جلوی آن را به c:\php\ext تغییر بدهید و سپس نام فایل را به php.ini تغییر داده و به شاخهء نصب Apache منتقل کنید.
فايل‌هاى c:\php\php5ts.dll و c:\php\php5isapi.dll را در شاخه modules در شاخهء نصب Apache ذخيره كنيد.
در شاخه ‌ای که Apache را نصب کرده‌اید، زیرشاخه‌ای به نام \conf وجود دارد که در آن می‌ توانید فایل httpd.conf که مربوط به پیکربندی این برنامه است را بیابید. با یک notepad می‌ توانید این پرونده را باز کرده و تغییرات زیر را اعمال کنید.

در بخشی که LoadModule ها معرفی شده‌اند، سطر زیر را وارد می‌کنیم:

LoadModule php5_module modules/php5apache2.dll

به قسمت AddType application رفته و سطر زیر را می نویسیم:

AddType application/x-httpd-php .php

در جلوی مقدار DirectoryIndex مقادیر دلخواه برای index شدن رو قرار می دهیم، خط شما چیزی مشابه زیر خواهد شد:

DirectoryIndex index.html index.htm index.html.var index.php

سرور را دوباره راه اندازی کنید.

امید متقی راد
OXYGEN Web Solutions
http://www.oxygenws.com

پانویس:
1- توصیهء اکید من در این زمان، استفاده از "نصب PHP 5 روی Apache2 به صورت Module" می باشد.
2- Apache را می توانید از سایت رسمی این نرم افزار به آدرس http://httpd.apache.org دریافت کنید.
3- تمامی نصب ها مخصوص ویندوز می باشند.
4- احتمال وجود اشکال یا نقص در توضیحات وجود دارد.
5- دخل و تصرف در این مطلب وانتشار آن، مجاز نمی باشد. (انتشار بدون هیچگونه تصرفی مجاز است)
6- احتمال تکمیل شدن این مقاله وجود دارد، آخرین نسخه را می توانید از اوایل آگوست 2004 به بعد، از سایت www.iranphp.net دریافت کنید.
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نصب و تنظیم | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
توسعهء PHP

نویسنده
امید متقی راد
omid@oxygenws.com

چکیده

در این مقاله به بررسی نحوهء توسعهء PHP می پردازیم. یکی از بزرگترین محاسن برنامه های open source از جمله PHP، باز بودن متن برنامهء آنهاست که به توسعه دهندگان این امکان را می دهد تا برنامهء مورد نظر را طبق درخواست ها و نیاز های خودشان تغییر داده و از آن استفاده کنند. پس از خواندن این مقاله شما خواهید توانست توسعه های ساده ای برای PHP نوشته و از آنها در پروژه های خود استفاده کنید.

کلمات کلیدی

PHP، برنامه نویسی، لینوکس، open source

1. مقدمه

در این مقاله به بررسی نحوهء توسعهء PHP می پردازیم. یکی از بزرگترین محاسن برنامه های open source از جمله PHP، باز بودن متن برنامهء آنهاست که به توسعه دهندگان این امکان را می دهد تا برنامهء مورد نظر را طبق درخواست ها و نیاز های خودشان تغییر داده و از آن استفاده کنند. به عنوان مثال از تاریخ شمسی در PHP پشتیبانی نمی شود و شما می توانید با توسعهء این زبان، برای پشتیبانی این تقویم، آن را برای خود مناسب و قابل استفاده کنید.

پس از خواندن این مقاله شما خواهید توانست توسعه های ساده ای برای PHP نوشته و از آنها در پروژه های خود استفاده کنید. در این مقاله با هم توسعه ای ساده برای PHP خواهیم نوشت.

برای درک مطالب این مقاله احتیاج به داشتن اطلاعاتی در مورد زبان برنامه نویسی C و PHP و روش کامپایل کردن در لینوکس دارید. زبان برنامه نویسی این مقاله C بوده و محیط کاری لینوکس می باشد. پیش فرض آن است که شما توانایی نصب برنامه های مختلف تحت لینوکس را دارید. تمامی کار های این مقاله تحت خط فرمان یا command line انجام می شود و شما باید تسلط و درک کافی در این مورد را نیز داشته باشید.

2. برنامه های مورد نیاز

برای توسعهء PHP احتیاج به نرم افزار هایی داریم که مسئولیت عملیات کامپایل کردن در لینوکس را دارند. لیستی از برنامه های مورد نیاز را در زیر می بینید، این نرم افزار ها را می توانید از آدرس www.gnu.org گرفته و روی سیستم لینوکس تان نصب کنید. در صورتی که از توسعه های معروف لینوکس استفاده می کنید اکثر این برنامه ها را نصب شده دارید.

• bison
• flex
• m4
• autoconf
• automake
• libtool
• gcc یا هر نوع کامپایلر دیگر
• make
• cvs از سایت www.cvshome.org

پس از نصب برنامه های فوق، احتیاج دارید نسخهء قابل توسعهء PHP یعنی نسخهء CVS یاConcurrent Version System آن را از آدرس http://cvs.php.net بگیرید و آمادهء توسعه شوید. برای این کار باید تحت خط فرمان لینوکس تان دستوری مشابه دستور زیر تایپ کرده و به جای X، Y و Z شمارهء نگارش PHP ای که قصد گرفتن آن را دارید را وارد کنید. با اجرای این دستور متن برنامه های PHP از اینترنت گرفته می شود و با شاخه ای به نام php-src روی دیسک سخت شما ذخیره می شود.

cvs -d :pserver:cvsread@cvs.php.net:/repository checkout -r php_X_Y_Z php-src

3. توسعهء PHP

3.1. هدف برنامه و آماده کردن محیط

می خواهیم تابعی به PHP اضافه کنیم به شکل salam() که به عنوان ورودی یک رشته را دریافت کرده و رشته ای به صورت salam STRING را بر گرداند.

به عنوان اولین قدم، به شاخهء PHP رفته و سپس به شاخهء ext آن می رویم و فایلی را در مورد نوع توابعی که قصد توسعه داریم می سازیم. در این فایل که ما نام آن را salam.def می گذاریم به ترتیب نوع خروجی توابع، نام تابع، نام و نوع پارامترهای ورودی، یک " " (فاصله) به عنوان جدا کننده و رشته ای که توضیح مختصری از آن تابع باشد را می نویسیم. در این فایل، هر تابع را باید در یک خط بنویسیم. در زیر به نمونه فایل مورد نیاز برای توسعهء تابع مان توجه می کنیم:

string salam(string arg) return \"salam ARG\"

توجه کنید که تمامی مقادیر بعد از پرانتز بسته تا آخر خط ، توضیحات تابع می باشند.

PHP برنامه ای به نام ext_skel برای آماده سازی مقدمات توسعه دارد، که در شاخهء ext قرار دارد و شما می توانید به عنوان دومین قدم توسعه، از آن استفاده کنید. برای ادامهء توسعه احتیاج داریم از خط زیر استفاده کرده تا مجموعهء فایل های مورد نیاز توسط این برنامه ساخته شود.

./ext_skel –extname=salam –proto=salam.def

با اجرای این دستور شاخه ای به نام مقدار جلوی –extname ساخته شده و فایل های مورد نیاز نیز در آن قرار می گیرد. این فایل ها عبارتند از:
• config.m4
• CREDITS
• EXPERIMENTAL
• salam.c
• salam.php
• Makefile.in
• php_salam.h
• شاخهء tests

3.2. توسعهء فایل ها

یکی از مهمترین و اصلی ترین فایل هایی که لازم است تغییر دهیم و تمامی کدهای اصلی برنامهء ما در آن قرار دارد، فایل salam.c می باشد. با باز کردن این فایل، اولین قسمت مهمی که مشاهده می کنید، خطوط زیر می باشد:

/* {{{ salam_functions[]
*
* every user-visible function must have an entry in salam_functions[]
*/
function_entry salam_functions[] = {
    PHP_FE(confirm_salam_compiled,  NULL)  /* for testing; remove later */
    PHP_FE(salam,   NULL)
    {NULL, NULL, NULL}  /* must be the last line in salam_functions[] */
};
/* }}} */

این مقادیر توسط فایل salam.def که تعریف کرده بودیم ساخته شده و در صورتی که فایل salam.def را بدون نقص نوشته باشیم، احتیاجی به ایجاد تغییر در این قسمت نداریم. توجه کنید که اولین تابع معرفی شده یعنی confirm_salam_compiled یک تابع برای تست کامپایل شدن یا نشدن سری توابع مان بوده که پس از موفقیت در کامپایل، می توانیم خط مربوطه را حذف کنیم.

کدهای مهم بعدی، مشابه بخش زیر خواهد بود که شامل توابع پیش فرض زمان فراخوانی و اتمام کار توابع مورد نظر می باشد. این بخش، اطلاعاتی در مورد نوع، نگارش و نام توسعهء ما را نیز داراست.

zend_module_entry salam_module_entry = {
  STANDARD_MODULE_HEADER,
  \"salam\",
  salam_functions,
  PHP_MINIT(salam),
  PHP_MSHUTDOWN(salam),
  PHP_RINIT(salam), /* replace with NULL if no request init code */
  PHP_RSHUTDOWN(salam), /* replace with NULL if no request shutdown code */
  PHP_MINFO(salam),
  \"0.1\", /* replace with version number for your extension */
  STANDARD_MODULE_PROPERTIES
};

برای تابعی که ما می خواهیم توسعه دهیم باید مقادیر PHP_RINIT(salam) و PHP_RSHUTDOWN(salam) را با NULL جایگزین کنیم، پس کد شما چیزی شبیه مقادیر زیر خواهد شد:

zend_module_entry salam_module_entry = {
  STANDARD_MODULE_HEADER,
  \"salam\",
  salam_functions,
  PHP_MINIT(salam),
  PHP_MSHUTDOWN(salam),
  NULL,
  NULL,
  PHP_MINFO(salam),
  \"0.1\", /* replace with version number for your extension */
  STANDARD_MODULE_PROPERTIES
};

سپس توابع PHP_MINIT(salam)و PHP_MSHUTDOWN(salam) را پیدا کرده و تعیین می کنیم که مقدار SUCCESS را برگردانند. پس کد این بخش برنامهء ما شبیه کد زیر می شود:

PHP_MINIT_FUNCTION(salam) {
    return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(salam) {
    return SUCCESS;
}

سپس به اصلی ترین تابع می رسیم که باید تمام وظایف مورد نظر برای تابع salam را در آن توسط زبان C نوشته تا خروجی مناسب را برای ما تولید کند. کدهای شما باید بعد از خط return بیاید و خط های بالای آن بدون تغییر بماند (این بدون تغییر ماندن به دلیل آگاهی نداشتن ما برای تغییر آنهاست. صحبت کامل در مورد این خطوط از حوصلهء این مقاله خارج بوده و فقط کافیست بدانید که این کدها شامل مراحل پردازش مقادیر ورودی تابع است).

/* {{{ proto string salam(string arg)
   return \"salam ARG\" */
PHP_FUNCTION(salam)
{
    char *arg = NULL;
    int argc = ZEND_NUM_ARGS(  );
    int arg_len;

    if (zend_parse_parameters(argc TSRMLS_CC, \"s\", &arg, &arg_len)
        == FAILURE)
        return;

    // YOUR CODES SHOULD COME HERE
}
/* }}} */

تابع PHP_FUNCTION برای PHP نام یک تابع را مشخص می کند و مقادیر داخل این تابع، اعمالی را که تابع PHP در هنگام فراخوانی آن در برنامه های PHP باید انجام دهد را نشان می دهد. همانطور که گفته شد، بعد از چند خط اول، کدهای ما قرار خواهد گرفت و برنامهء ما به صورت زیر در خواهد آمد:

PHP_FUNCTION(salam) {
    char *arg = NULL, *sout;
    int argc = ZEND_NUM_ARGS(  );
    int arg_len, len;

    if (zend_parse_parameters(argc TSRMLS_CC, \"s/\", &arg, &arg_len)
        == FAILURE)
        return;

    strcpy(sout, \"salam \");
    strcat(sout, arg);
    len = strlen(sout);
    RETURN_STRINGL(sout, len, 1);
}

ابتدا متغیر هایی به نام sout از نوع کاراکتر و len از نوع عددی تعریف کرده ایم. در خط بعد از return مقدار "salam " را در متغیر sout کپی کرده و سپس مقادیر sout و arg که رشتهء ورودی ما می باشد را به هم متصل می کنیم و به sout انتساب می دهیم. سپس طول sout را به دست آورده و از طریق تابع RETURN_STRINGL (این تابع جزو توابع ZEND API بوده و برای برگرداندن مقادیر استفاده می شوند، این توابع محدود و تعیین شده می باشند) مقدار رشته و طول آنرا بر می گردانیم. سومین متغیر در تابع RETURN_STRINGL مشخص کنندهء صحت خروجی یا وجود اشکال در خروجی می باشد.

هم اکنون توسعه تابع ما به پایان رسیده، اما برای امکان کامپایل تابع توسعه داده شده لازم است مقادیر لازم برای درست کامپایل شدن تابع را تصحیح و کامل کنیم. پس فایل salam.c را ذخیره کرده و می بندیم و فایل config.m4 را برای اِعمال تغییرات باز می کنیم. در این فایل، از قبل، خطوط لازم وجود دارند ولی به صورت توضیح یا comment در آمده اند که شما باید این خطوط را از این حالت خارج کنید. پس از این کار خطوطی دقیقاً مشابه خطوط زیر خواهید داشت (توجه کنید که هیچ علامتی در ابتدای این خطوط نباشند):

PHP_ARG_ENABLE(salam, whether to enable salam support,
[  --enable-salam           Enable salam support])

توسعهء تابع ما به پایان رسید، حال نوبت کامپایل کردن PHP است تا بتوانید از تابعی که نوشتیم در آن استفاده کنیم. در بخش بعد به این مسئله می پردازیم.

4. کامپایل PHP

قبل از اجرای دستورات کامپایل، برای اینکه PHP، توسعهء جدید ما را بشناسد، لازم است دستور buildconf را که در شاخهء اصلی PHP قرار دارد، اجرا کنیم. این دستور را باید به شکل زیر وارد کنیم:

./buildconf

سپس باید برنامه را با توسعه ای که نوشتیم کامپایل کنیم. این کار در PHP شبیه خیلی از برنامه های دیگر تحت لینوکس انجام می شود. به این صورت که شما باید مقداری مشابه مقدار --enable-salam را در هنگام configure کردن PHP اِعمال کنید. سپس سری دستورات make را برای نصب PHP اجرا می کنیم. دستوراتی که اجرا می کنیم به ترتیب، شبیه دستورات زیر خواهد بود، توجه کنید که تمامی این دستورات باید در شاخهء اصلی PHP اجرا شوند:

./configure --enable-salam
make
make install

اکنون PHP شما با تابع شما توسعه پیدا کرده است. حال نوبت آزمایش تابع است تا مشاهده کنیم که درست کار می کند. برای این منظور فایلی با توسعهء php و نام test ساخته و مقادیر زیر را در آن می نویسیم:

<?php
    echo salam('donya');
?>

سپس، در خط فرمان دستور زیر را اجرا کنید. می بینید که مقدار "salam donya" در خروجی چاپ خواهد شد.

/usr/bin/php –q test.php

5. جمع بندی

در این مقاله یاد گرفتیم که چطور از برتری های برنامه های open source استفاده کرده و از آنها برای رسیدن به اهداف مان استفاده کنیم و چطور آنها را توسعه دهیم.
تابعی برای PHP ساختیم، که قبلا در آن وجود نداشت و از آن در برنامه ای که با PHP نوشتیم استفاده نمودیم.
به یاد داشته باشید که این مقاله، فقط توضیحات مختصری در مورد توسعهء PHP ارایه کرده و قصد آشنا کردن شما با این مقوله را داشته است.
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
MD5 چيست؟

مقاله ای که اینجا می نویسم، ترجمه اکثر RFC مربوط به MD5 می باشد.
اگر ترجمه اش خوب، عذر می خوام.

*****************************************************

1- خلاصه:
در این مقاله با الگوریتم "خلاصه پیام MD5" آشنا می شویم. این الگوریتم یک رشته با طول متفاوت را به عنوان ورودی می گیرد و یک "خلاصه پیام MD5" یا "اثر انگشت" با طول 128 بیت می سازد.
در این روش اینکه دو پیام مختلف دارای یک "خلاصه پیام" باشند یا اینکه یک رشته از روی یک "خلاصه پیام" ساخته شود غیر ممکن می باشد. این الگوریتم برای امضاهای دیجیتال مناسب است، جایی که احتیاج به خلاصه کردن یک فایل بزرگ در یک رشتهء امن و فشرده، قبل از کد کردن آن متن، در سیستم های کدینگ، با کلید های خصوصی و عمومی آن سیستم مانند RSA (Rivest Shamir Adelman)
الگوریتم MD5 برای داشتن سرعت بالا در ماشین های 32 بیتی طراحی شده است در عین حال احتیاجی به جانشینی ها در جداول بزرگ ندارد. این الگوریتم را با کدهای بسیار کمی می توان نوشت.
الگوریتم MD5 توسعه ای از الگوریتم MD4 می باشد با این تفاوت که MD5 کمی کندتر از MD4 عمل می کند اما در طراحی آن بسیار محافظه کارانه عمل شده است.
MD5 به این دلیل طراحی شد که حس کردند MD4 به عنوان سرعت بالایی که داشت پذیرفته شده و از امنیت بالایی در شرایط بحرانی برخوردار نمی باشد. MD4 برای سرعت بالا طراحی شده ولی احتمال شکست آن در رمز کردنی موفق وجود دارد. MD5 کمی در سرعت کند شده با این تفاوت که بیشترین امنیت را داراست. این الگوریتم حاصل تاثیر دادن نظرات تعدادی از استفاده کنندگان MD4 به همراه مقادیری تغییر در ساختار الگوریتم برای افزایش سرعت و قدرت آن می باشد. الگوریتم MD5 در این مکان عومی قرارگرفته تا از آن استفاده و در صورت امکان استاندارد شود.

2- شرایط و نکات لازم:
در این متن منظور از « کلمه» تعداد 32 بیت و «بایت» تعداد 8 بیت داده می باشد. یک صف از بیت ها دارای خصوصیات طبیعی یک صف از بایتها می باشند که هر گروه هشت تایی متوالی از بیتها یک بایت را تشکیل می دهند که پرارزش ترین بیت در ابتدا قرار دارد. یک صف از بایت ها دقیقا مشابه یک صف 32 بیتی از کلمات پردازش می شود. جایی که گروهی 4 تایی از توالی بایتها پردازش می شوند، کم ارزش ترین بایت اولین بایت می باشد.
اجازه بدهید از x_i بجای xi (x اندیس i ) استفاده کنیم و اگر مقدار اندیس یک عبارت محاسباتی بود آن را در {} محدود می کنیم، مانند: x_{i-1} . همچنین از ^ به عنوان علامت توان استفاده می کنیم، پس x^i یعنیx به توان i .
اجازه بدهید از علامت «+» برای اضافه کردن دو کلمه به هم استفاده کنیم. از x<<<5 به عنوان عملگر چرخش بیتی در کلمات استفاده می شود کهx به اندازه 5 بیت به چپ چرخش می کند.
از not (x) به عنوان عملگر نقیض بیتی، از X v Y به عنوان عملگر فصل (or) و از X xor Y به عنوان عملگر exclusive or و از XY به عنوان عملگر عطف (and) استفاده می کنیم.

3- توضیحات الگوریتم MD5:
فرض کنید ما b بیت پیام به عنوان ورودی داریم و تصمیم داریم خلاصه پیام آن را بدست آوریم. b در اینجا یک عدد نا منفی و صحیح است، b می تواند مقدار صفر داشته باشد و هیچ محدودیتی برای مضرب هشت بودن آن نیست و به هر اندازه می تواند بزرگ باشد. فرض کنید بیت های این پیام را بشود به صورت زیر نوشت:

m_0 m_1 ... m_{b-1}

برای آوردن خلاصه پیام 5 مرحله زیر را انجام می دهیم:

گام 1- اضافه کردن بیتهای نرم کننده:
طول پیام مورد نظر به 448 به پیمانه 512 توسعه پیدا می کند به این معنی که اگر به طول پیام 64 بیت اضافه شود، طولش مضربی از 512 خواهد بود. عمل توسعه دادن همیشه اجرا می شود مگر اینکه طول پیام به صورت 448 به پیمانه 512 باشد.
عمل توسعه پیام یا نرم کردن آن به صورت زیر انجام می شود:
یک بیت [1] سپس تعدادی بیت [0] به پیام اضافه می شود.اضافه شدن بیت های 0 تا زمانی که طول رشته به 448 بر پایه 512 برسد، ادامه پیدا می کند. در این عمل حداقل یک بیت و حداکثر 512 بیت اضافه خواهد شد.

گام 2- افزایش طول:
یک نمایش 64 بیتی از b بیت پیام اولیه به آخر نتیجه گام قبل اضافه می شود. در بدترین حالت، b بزرگتر از 64 بیت خواهد بود. در این حالت فقط 64 بیت کم ارزش b استفاده خواهد شد.
هم اکنون طول پیام بدست آمده دقیقا معادل مضربی از 512 خواهد بود. مشابه اینکه بگوییم، این پیام طولی معادل مضربی از16 کلمه دارد اجازه بدهید M[0…N-1] را نمایانگر کلمات پیام بدست آمده بدانیم. (N مضربی از 16 می باشد.)

گام 3- یین بافر برای MD:
برای محاسبه خلاصه پیام یک بافر 4 کلمه ای (A,B,C,D) استفاده می شود. هر کدام از A، B، Cو D یک ثبات 32 بیتی می باشند. این ثبات ها مطابق جدول زیر مقدار دهی می شوند ( بایتهای کم ارزش در ابتدا قرار دارند )

word A: 01 23 45 67
word B: 89 ab cd ef
word C: fe dc ba 98
word D: 76 54 32 10

گام 4- پردازش پیام در بلاک های 16 کلمه ای:
در ابتدا 4 تابع کمکی تعریف می کنیم که هر کدام به عنوان ورودی سه کلمهء 32 بیتی می گیرد و برای خروجی یک کلمهء 32 بیتی تولید می کند.

F(X,Y,Z) = XY v not(X) Z
G(X,Y,Z) = XZ v Y not(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X v not(Z))

در هر موقعیت بیتی، F به عنوان شرط عمل می کند: اگر X آنگاه Y در غیر این صورت Z. تابع F می توانست طوری تعریف شود که به جای استفاده از v از + استفاده کند چون XY و not(X) هرگز یک هایی در موقعیت بیتی یکسان نخواهد داشت. جالب است به یاد داشته باشید که اگر بیت های X، Y و Z مستقل و غیر مرتبط باشند، هر بیت از F(X, Y, Z) مستقل و غیر مرتبط خواهد بود.
توابع G، H و I شبیه تابع F هستند، به طوری که آنها در "توازی بیتی" کار می کنند تا خروجی شان را از بیت های X، Y و Z تولید کنند. در چنین روشی اگر بیت های متناظر X، Y و Z مستقل و غیر مرتبط باشند، آنگاه هر بیت از G(X, Y, Z)، H(X, Y, Z) و I(X, Y, Z) مستقل و غیر مرتبط خواهند بود.
توجه داشته باشید که تابع H، تابع XOR یا توازن بیتی از ورودی هایش است. این گام از یک جدول 64 عنصری T[1…64] ساخته شده از یک تابع مثلثاتی، استفاده می کند. اجازه دهید T[i]، I-امین عنصر جدول را مشخص می کند که برابر است با قسمت صحیح حاصلضرب 4294967296 در abs(sin(i))، به طوری که I به رادیان باشد.
کارهای زیر را انجام می دهید:

/* Process each 16-word block. */
   For i = 0 to N/16-1 do

     /* Copy block i into X. */
     For j = 0 to 15 do
       Set X[j] to M[i*16+j].
     end /* of loop on j */

     /* Save A as AA, B as BB, C as CC, and D as DD. */
     AA = A
     BB = B
     CC = C
     DD = D

     /* Round 1. */
     /* Let [abcd k s i] denote the operation
          a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
     /* Do the following 16 operations. */
     [ABCD  0  7  1]  [DABC  1 12  2]  [CDAB  2 17  3]  [BCDA  3 22  4]
     [ABCD  4  7  5]  [DABC  5 12  6]  [CDAB  6 17  7]  [BCDA  7 22  8]
     [ABCD  8  7  9]  [DABC  9 12 10]  [CDAB 10 17 11]  [BCDA 11 22 12]
     [ABCD 12  7 13]  [DABC 13 12 14]  [CDAB 14 17 15]  [BCDA 15 22 16]

     /* Round 2. */
     /* Let [abcd k s i] denote the operation
          a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
     /* Do the following 16 operations. */
     [ABCD  1  5 17]  [DABC  6  9 18]  [CDAB 11 14 19]  [BCDA  0 20 20]
     [ABCD  5  5 21]  [DABC 10  9 22]  [CDAB 15 14 23]  [BCDA  4 20 24]
     [ABCD  9  5 25]  [DABC 14  9 26]  [CDAB  3 14 27]  [BCDA  8 20 28]
     [ABCD 13  5 29]  [DABC  2  9 30]  [CDAB  7 14 31]  [BCDA 12 20 32]

     /* Round 3. */
     /* Let [abcd k s t] denote the operation
          a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
     /* Do the following 16 operations. */
     [ABCD  5  4 33]  [DABC  8 11 34]  [CDAB 11 16 35]  [BCDA 14 23 36]
     [ABCD  1  4 37]  [DABC  4 11 38]  [CDAB  7 16 39]  [BCDA 10 23 40]
     [ABCD 13  4 41]  [DABC  0 11 42]  [CDAB  3 16 43]  [BCDA  6 23 44]
     [ABCD  9  4 45]  [DABC 12 11 46]  [CDAB 15 16 47]  [BCDA  2 23 48]

     /* Round 4. */
     /* Let [abcd k s t] denote the operation
          a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
     /* Do the following 16 operations. */
     [ABCD  0  6 49]  [DABC  7 10 50]  [CDAB 14 15 51]  [BCDA  5 21 52]
     [ABCD 12  6 53]  [DABC  3 10 54]  [CDAB 10 15 55]  [BCDA  1 21 56]
     [ABCD  8  6 57]  [DABC 15 10 58]  [CDAB  6 15 59]  [BCDA 13 21 60]
     [ABCD  4  6 61]  [DABC 11 10 62]  [CDAB  2 15 63]  [BCDA  9 21 64]

     /* Then perform the following additions. (That is increment each
        of the four registers by the value it had before this block
        was started.) */
     A = A + AA
     B = B + BB
     C = C + CC
     D = D + DD

   end /* of loop on i */

گام 5- خروجی:
خلاصه پیامی که به عنوان خروجی تولید می شود و عبارت است از A، B، C و D، که ما با کم ارزش ترین بیت A شروع می کنیم و به با ارزش ترین بیت D خاتمه می دهیم. این تعریف MD5 را کامل می کند.

4- نتیجه:
الگوریتم خلاصه پیام MD5 به سادگی قابل اجرا می باشد و یک "اثر انگشت" یا "خلاصه پیام" از پیام با طول اختیاری تولید می کند. گمان برده می شود که امکان مواجه شدن با دو پیام که خلاصه پیام مشابهی دارند از رتبهء 64^2 و برای هر پیامی که به آن یک خلاصه پیام داده شده است از رتبهء 128^2 می باشد.
الگوریتم MD5 برای نقاط ضعف به دقت بررسی شده است. به هر حال این الگوریتم نسبتا جدید است و تحلیل امنیتی بیشتری را طلب می کند، مشابه طرح های مشابه در این رده.

5- پانویس:
این مقاله اطلاعاتی برای جامعهء اینترنتی مهیا کرده و البته هیچ استانداردی را مشخص نمی کند. انتشار این مقاله به هر تعداد آزاد می باشد.

*****************************************************

- بعضی از بخش های این RFC که از اهمیت کمتری برخوردار بود حذف شده.
- می تونید فایل doc رو از اینجا بگیرید: http://www.oxygenws.com/md5.doc
- هر نوع کپی برداری با نام مترجم بلامانع است.

موفق باشید، امید
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
ساختن لینکدونی با تعداد دفعات کلیک

برای نوشتن این لینکدونی با PHP به کدها و طی کردن مراحل زير نياز داريم:

* ساختن جدول لينکهامون در یک دیتابیس (که ما اینجا از MySQL استفاده می کنیم)، شامل فیلدهای: «آدرس لينک»، «متن لينک»، «توضيحات لينک (Tooltip)»، «تعداد کليک‌ها» و «تاریخ اضافه شدن لینک»
* صفحه‌ای که بتونيم لينکهامون رو از اون طریق وارد دیتابیس کنيم
* کدی برای شمردن تعداد کليک‌ها
* کدی برای نمايش دادن تعدادی از آخرين لينکهای وارد شده در صفحه‌ی اصلی

برای اينکه مقاله‌ی جامعی باشه سعی می‌کنم تمام مراحل رو تا اونجايی که بشه به طور کامل توضيح بدم.
برای مرحله اول به کد زير احتياج داريم که می تونيد اون رو خيلی راحت در ديتابيس‌تون Import کنيد و جدولتون رو بسازيد.

    CREATE TABLE links (
    id int(11) NOT NULL auto_increment,
    link text NOT NULL,
    description text NOT NULL,
    tooltip text,
    hits int(5) NOT NULL default ‘0′,
    date date NOT NULL default ‘0000-00-00′,
    PRIMARY KEY (id)
    ) TYPE=MyISAM

خب، الان جدول‌مون رو ساختيم و کافيه که از طريق يه فرم خیلی ساده، لينک‌هامون رو همراه با توضیحاتشون واردش کنيم. برای این کار، يه صفحه با نام «links_entry.php» می‌سازيم که Action فرم توش رو هم همين صفحه قرار می‌ديم. این هم کد فرم همراه با کدی که اطلاعات رو از فرم می‌گیره و وارد دیتابیس می‌کنه:

    <form method=\"post”>
    Link: <input name=\"link” type=\"text” size=\"50″>
    Description: <input name=\"description” type=\"text” size=\"50″>
    Tooltip: <input name=\"tooltip” type=\"text” size=\"50″>
    <input type=\"submit” value=\"Submit”>
    </form>
    <?
    $link = $_POST[“link”];
    $description = addslashes($_POST[“description”]);
    $tooltip = addslashes($_POST[“tooltip”]);
    if (isset($link)) {
        db_connect();
        $sql = “INSERT INTO `links`
                (link, description, tooltip, date)
                values
                (’$link’ , ‘$description’ , ‘$tooltip’, now())”;
        if (@mysql_query($sql))
            echo “link Added!<br />”;
        else {
            echo “Error!”. mysql_error();
            exit;
        }
    }
    ?>

تا حالا مرحله‌ی ۱ و ۲ رو انجام داديم. اگه تعداد کليک‌ روی هرکدوم از لينک‌ها برامون مهم نباشه می تونيم با يه حلقه‌ی ساده، آدرس لينک‌ها و توضيحاتشون رو از ديتابيس بيرون بکشيم و فقط اونها رو نمايش بديم. ولی هدف ما فقط اين نيست!
برای داشتن آمار دفعات کليک‌ها ما به يه صفحه واسطه احتياج داريم که در واقع با کلیک شدن روی هر لینک، اون صفحه لينک رو دريافت کنه و به تعداد هيت‌های اون توی جدول ما يکی اضافه کنه و بعد به آدرس لينک اصلی Redirect کنه. کار سختی انجام نمی‌ده کلا!
اسم اون رو به عنوان مثال «link_redirect.php» می‌ذاريم و اين زير می بينيم چه کدهايی توش قرار ميگيره.

    <?
    $url = urldecode($_GET[“url”]);
    db_connect();
    $query=“SELECT * FROM `links`
            WHERE link = ‘$url’”;
    $results = mysql_query($query);
    $result = mysql_fetch_array($results);
    $hits = $result[“hits”];
    $hits = $hits + 1 ;

    $updatequery = “UPDATE `links` SET `hits`=’$hits’
                    WHERE `link`=’$url’”;
    $result = mysql_query($updatequery);

    header(“Location:$url”);
    ?>

تو خط اول، URLمون که قبلا Encode شده (بعدا می‌گم چطوری)، Decode میشه. اين عمل Encode و Decode کردن هم واسه اينکه که چون ما داریم یک URL رو به عنوان متغیر بین صفحاتمون پاس می‌کنيم و احتمال اينکه يک کاراکتر معنی دار توش باشه هست. با اين Encode کردن مثلا اگه کاراکتر Space توی اسم يه فايل استفاده شده باشه به معادل Hexش یعنی %20 تبديل ميشه و از اين قبيل…!

    http://www.mohsentaleb.com/index 1.htm
    Changes to…
    http://www.mohsentaleb.com/index%201.htm

همونطور که واضحه، در خطوط سوم تا هفتم، آخرين تعداد هيت‌های يک لينک رو از جدول می‌خونیم. در خط هشتم اونو يکی اضافه می کنیم، تو خط ۹ تا ۱۱ مقدار جديد هيت‌ها رو وارد جدول می‌کنیم و در آخر با فرستادن يک Header، صفحه رو به آدرس لينک اصلی Redirect می‌کنيم. خيلی ساده!
پس ما الان يه صفحه‌ی واسطه داريم که آدرس تمام لينک‌های لينکدونی‌مون تحت يک متغير با اسم url$ بايد بهش پاس بشه و خودش ديگه بقيه‌ی کارها رو انجام می‌ده…

مثلا اگه ما بخوايم به سايت ياهو لينک بديم، بجای اينکه توی لينکدونيمون داشته باشيم:

    <a href=\"http://www.yahoo.com\">Yahoo.com</a>

داريم:

    <a href=\"link_redirect.php?url= http://www.yahoo.com\">Yahoo.com</a>

خب، به عنوان مرحله‌ی آخر، بايد کدی بنويسيم که بياد هر کدوم از لينکهامون رو از ديتابيس بيرون بکشه و به صورت قالبی دربياره که لينکها فقط به عنوان يه متغير به اون صفحه‌ی «link_redirect.php» پاس بشن که تعداد کليک‌هاشون هم شمارش بشه.
اينم کدش. یه تابع‌ست که در آرگومانش یعنی متغیر number$ می تونید تعداد لینکهای جدیدی رو که قراره در صفحه‌تون نمایش داده بشن مشخص کنید. يخورده اگه با دقت بخونيدش چيز سختی نداره! :)

    <?
    function show_links($number) {
        db_connect();
        $query=“SELECT * FROM `links`
                ORDER BY `id` DESC LIMIT ‘$number’”;
    $results = mysql_query($query);
    $num_results= mysql_num_rows($results);
    echo ”<div>”;

    for ($i=0; $i <$num_results; $i++)  {
        $row = mysql_fetch_array($results);
        if ($row[“hits”] == 0)
             $hits = کلیک نشده;
        else
             $hits = $row[“hits”].” کلیک ”;

    &  echo ”<a href="http://”.$_SERVER[‘HTTP_HOST’]
            .dirname($_SERVER[‘PHP_SELF’]).
            “/linkref.php?url=”.
            urlencode(stripslashes($row[“link”])).
            ” title=\\"”.stripslashes($row[“tooltip”]).
            ” &#8226; ”.$hits.“\”>”.
            stripslashes($row[“description”]).”</a>”;
         echo ”<br>n”;
        }
        echo ”</div>”;
    }
    ?>

تموم شد!
پ.ن. برای اينکه کدها زياد شلوغ نشن و برای تأکید بیشتر رو اصل کد، قسمتهای مربوط به فارسی کردن (Align و Font و …) رو حذف کردم که خودتون بهش اضافه می کنين احتمالا!

بعدا اضافه شده:
سورس فارسی کاملش رو هم با اسم linkdumps.zip گذاشتم واسه کسايی که حوصله‌ی خوندن و فارسی کردنش رو ندارن!
کافیه فایل db_funcs.php رو با توجه به مشخصات دیتابیس‌تون تنظیم کنید و خط زیر رو یه جایی تو بالاهای(!) فایل صفحه‌ی اول‌تون Paste کنید:

    <?
    include (“linkdump_funcs.php”);
    ?>

و توی وبلاگتون هرجا که خواستین لینکدونی قرار بگیره، تابع ()show_links رو صدا کنید و تعداد آخرین لينکهايی که می‌خواين نشون بده رو توی پرانترش بذاريد. مثلا برای نشون دادن ۱۰ لينک آخر، خط زير رو جای موردنظر در صفحه‌ی اصلی‌تون بذاريد:

    <?
    show_links(10);
    ?>

والسلام! :)

نوشته شده توسط: محسن طالب
تاریخ: 1st August 2004 @ 23:25
لینک ثابت: http://weblog.mohsentaleb.com/index.php?p=168
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کار با Database ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
نکاتی مفید در مورد تنظیم php.ini

مترجمان:
فرشاد پايدار
farshadcdeb@yahoo.com
جابر صادقي
www.rahacomputer.g3z.com

فايل پيکربندي PHP
قبل از شروع مطالب نگاهي اجمالي به ويژگيهاي فايل پيکربندي PHP منطقي به نظر مي رسد. نام اين فايل php.ini مي باشد و به دلايلي از ساختار کلي فايلهاي ini که بيشتر در برنامه هاي کاربردي ويندوز استفاده مي شود، پيروي مي کند. اين فايل متني به صورت ASCII مي باشد که به بخشهايي (session) تقسيم مي شود. هر بخش متغيرهايي را که مربوط به آن بخش مي شوند، در بر مي گيرد. هر بخش چيزي شبيه زير مي باشد:

[MySection]
variable=\"value\"
anothervariable=\"anothervalue\"

نام بخش در يک جفت براکت"[]" در بالا قرار مي گيرد. و زير آن در هر سطر يک متغير با مقدارش قرار مي گيرد. متغيرها به حروف حساس (case sensitive) هستند و نمي توانند شامل فاصله (space) باشند، در حالي که مقادير متناظر آنها مي توانند اعداد، رشته کاراکتري (string) و يا Boolean باشند.

سمي کالن ";" در ابتداي هر سطر به عنوان نشانگر درج توضيحات (comment) مي باشد. اين راهي ساده براي فعال يا غيرفعال کردن ويژگيهاي PHP مي باشد، به جاي حذف کردن يک سطر مي توانيد به اين روش آن را به توضيح تبديل کرده که در پردازش فايل ها شرکت نخواهد کرد. در صورتي که فکر مي کنيد ممکن است بعد ها بخواهيد از ويژگي که اکنون به کارتان نمي آيد، استفاده کنيد بهتر است آن را پاک نکنيد.

براي اينکه PHP بتواند فايل php.ini را تشخيص بدهد بايد آن را در دايرکتوري جاري، دايرکتوري که در متغير $PHPRC تعريف شده، يا دايرکتوري که هنگام کامپايل مشخص شده است(براي ويندوز اين همان دايرکتوري اصلي PHP است) نگهداريد.

بعد از اينکه شما تغييراتي در فايل php.ini داديد براي آنکه تغييرات اعمال شوند بايد سرور خود را مجددا راه اندازي نماييد (سرور را restart کنيد). البته فرض بر اين است که شما قبلا در حال استفاده PHP بر سرور خود بوده ايد. براي استفاده هاي command-line از PHP فايل پيکربندي php.ini در هرباري که برنامه PHP احضار مي شود خوانده و چک مي شود.

تنظيم ويژگيهاي مفسر
اولين مرحله در اين مقاله از مهمترين گامهاي آن مي باشد، ويژگيهايي که به مفسر زبان PHP مربوط مي شود. اولين مورد در اينجا engine variable مي باشد که چک مي کند که PHP engine بايد فعال "on" يا غير فعال "off" باشد. Off کردن اين متغير به معني اين است که کدهاي PHP توسط سرور تفسير نشوند.معمولاً نيازي به اين تغيير حس نمي شود، پس اين متغير را به صورت on رها کنيد.

engine=On

متغير short_open_tag کنترل مي کند که آيا مفسر بايد تگهاي کوتاه را همانند تگ استاندارد تشخيص دهد يا نه.در صورتي که تشخيص مي دهيد اين نمونه تگها باعث ناسازگاري با ديگر زبانها مي شوند يا اينکه تصميم به استفاده از قوانين syntax مختص PHP داريد مي توانيد آن را off کنيد.

short_open_tag = On

معمولاً session, cookie و اطلاعات HTTP header در يک اسکريپت PHP بايد قبل از توليد هرگونه خروجي توسط آن اسکريپت فرستاده شوند. در صورتي که اين در برنامه شما امکان پذير نيست مي توانيد هر چه را که PHP به نام output buffering مي شناسد، توسط متغيرهاي output_buffering فعال کنيد.

با on بودن output buffering، زبان PHP خروجي اسکريپت شما را در يک بافر مخصوص نگه مي دارد و هنگامي آنها را مي فرستد که به طور مشخص به آن دستور داده شود. اين به شما امکان مي دهد که cookieها يا اطلاعات HTTP header را از وسط يا انتهاي کد اسکريپت خود بفرستيد. هرچند اين مي تواند کارآيي را در حاشيه کاهش دهد.

output_buffering = Off

شما مي توانيد با يک عدد به عنوان مقدار براي متغير output_buffering اندازه بافر را تعيين کنيد.

output_buffering = 2048

هنگامي که PHP شروع به کار مي کند يک پيام حاوي شماره نسخه خود به هدر استاندارد سرور مي افزايد.براي غيرفعال کردن آن مي توانيد متغير expose_PHP را off کنيد.اين مي تواند مفيد باشد، مثلا اگر بخواهيد امکانات وب سرور خود را از ديد هکرها پنهان کنيد.

expose_PHP = On

تنظيم مسير جستجوي
شما مي توانيد مسير جستجويي را براي PHP با تنظيم متغير include_patch که ليستي از مسيرها را مي پذيرد، مشخص کنيد. PHP هنگامي که با فايلي که مسير آن مشخص نشده است ، مواجه مي شود به طور اتوماتيک اين مسيرها را چک مي کند.
اگر شما کتابخانه اي از توابع يا مجموعه اي از کلاسها داريد که زياد از آنها استفاده مي کنيد مي توانيد دايرکتوري موقعيت آنها را در اين متغير قرار دهيد. همچنين اين متغير مکان مناسبي براي اضافه کردن دايرکتوري PEAR خود PHP مي باشد، که مجموعه اي از کلاسهايي که بسيار استفاده مي شوند را شامل مي شود.

include_path = \".:/usr/local/lib/php/pear:\"

کاربران ويندوز براي مشخص کردن چندين دايرکتوري بايد از سمي کالن";" بين آنها استفاده کنند و کاربران unix از کالن ":".

دو متغير جالب در اين زمينه auto_prepend_file و auto_append_file مي باشند. اين متغيرها فايلهايي را مشخص مي کنند که PHP به ابتدا يا انتهاي هر سند PHP اضافه خواهد کرد. اين مورد بيشتر براي اضافه کردن header و footer به صفحاتي است که توسط PHP ايجاد مي شوند، به طوري که باعث مي شود تعدادي خط کد به هر سند PHP که شما مي نويسيد اضافه گردد.
اين فايلها هم مي توانند اسکريپتهاي PHP و هم html معمولي باشند، ولي کدهاي PHP براي اين امر بايد در تگ استاندارد محصور شده باشند.

auto_prepend_file = /home/web/includes/header.php
auto_append_file = /home/web/includes/legal.php

چگونگي رفتار با خطاها
خطا ها در PHP در چهار دسته مي آيند: parsing errors يا خطاي زمان تجزيه (کامپايل)، تذکرات درمورد خطاهاي موجود در کد مثلا مقدار دهي نکردن يک متغير، warning يا هشدار و fatal error. معمولا هنگامي که PHP با يکي از خطاهاي parsing error يا warning يا fatal error مواجه مي شود، خطاها را نمايش مي دهد و اگر خطا از نوع fatal error باشد اجراي اسکريپت را در همان نقطه متوقف مي کند. شما مي توانيد اين رفتار را با متغير error_reporting که چند فيلد خطا را مي گيرد و تنها خطاهايي را که با آنها سازگار باشند نمايش مي دهد، اصلاح کنيد.

error_reporting = E_ALL

براي غير فعال کردن نمايش خطاها مقدار متغير display_errors را به نادرست تغيير دهيد و به جاي آن پيام خطاها را در ثبات خطاها از طريق متغير log_errors بنويسيد.
انجام اين کار براي امنيت بيشتر مفيد است، با غيرفعال کردن نمايش خطا شما اطلاعات ويژه سيستم خود را مخفي مي کنيد بدون توجه به اينکه آيا کاربران قصد خراب کردن سايت شما را دارند يا فقط استفاده مي کنند.به جاي آن شما بايد خطاها را در يک فايل دلخواه يا ثبات خطاي سيستم (system logger)، با تنظيم مقدار متغير error_log به مسير فايل انتخابي يا مقدار پيش فرض "syslog"، ثبت کنيد. فقط به ياد داشته باشيد که مرتبا به اين فايل سربزنيد تا ببينيد که در برنامه شما چه خطاهايي وجود دارد.

display_errors = Off
log_errors = On
error_log = \"error.log\"

فعال کردن توسعه ها
توسعه هاي متعددي براي PHP موجود است. در سيستمهاي يونيکس لازم است که اين توسعه ها در زمان کامپايل ساخته شوند. در ويندوز، dll هاي باينري وجود دارند که بايد ضميمه شوند. متغير extension_dir محتوي نام شاخه اي است که PHP در آن به دنبال اين توسعه ها مي گردد. مثلا:

extension_dir = \"C:\Program Files\Internet Tools\Apache\bin\php4\extensions\"

نسخه ويندوز PHP به همراه ۲۰ توسعه منتشر مي شود که تمامي آنها در فايل php.ini ليست شده اند. براي فعال کردن هر توسعه، علامت سمي کالن جلوي آن را حذف کرده و سرور خود را از نو راه اندازي کنيد. براي غير فعال کردن يک توسعه نيز مي توانيد جلوي آن علامت سمي کالن رو اضافه کنيد.

اگر توسعه مورد نظرتان در ليست توسعه ها در فايل php.ini نيست از متغير extension استفاده کرده و نام dll مورد نظر را به آن نسبت دهيد. مثلا:

extension=php_domxml.dll
extension=php_dbase.dll

تنظيم متغيرهاي مربوط به توسعه ها
متغير هاي مربوط به توسعه ها، در بخش جداگانه اي از فايل پيکربندي (php.ini) ذخيره مي شوند. براي مثال تمام متغيرهايي که به توسعه هاي MySQL مربوط مي شوند بايد در قسمت [MySQL] در فايل php.ini، قرار بگيرند.

اگر قصد استفاده از تابع mail در PHP را داريد، 3 متغير وجود دارد که بايد آنها را تنظيم کنيد. متغيرهاي SMTP و sendmail_from (در ويندوز) يا sendmail_path (در يونيکس) در هنگام ارسال e-mail از طريق تابع mail مورد استفاده قرار مي گيرند. در ويندوز اين متغير ها براي تنظيم SMTP Server و همچنين براي تعيين آدرس From در ساختار e-mail به کار مي روند. در يونيکس متغير sendmail_path مسير MTA يا Mail Transfer Agent را براي ارسال mail تنظيم مي کند.

SMTP = myserver.localnet.com
sendmail_from = me@localhost.com
sendmail_path = /usr/sbin/sendmail

متغيرهاي java.class.path ، java.home، java.library و java.library.path همگي آدرس کلاس ها و کتابخانه هاي جاوا را تنظيم ميکنند. اين مقادير به وسيله توسعه هاي جاوا مورد استفاده قرار مي گيرند. بنابراين اگر مي خواهيد PHP بتواند ارتباط صحيحي با برنامه هاي جاواي شما برقرار کند از درستي و معتبر بودن مقادير اين متغير ها اطمينان حاصل کنيد.

java.class.path = .\php_java.jar
java.home = c:\jdk
java.library = c:\jdk\jre\bin\hotspot\jvm.dll
java.library.path = .\

متغير session.save_path مشخص کننده آدرس شاخه موقتي است که براي ذخيره اطلاعات session ها بکار مي رود. معمولا اين متغير به طور پيش فرض مقدار /tmp را دارد، اما از آنجا که اين شاخه در ويندوز وجود ندارد بايد آن را با آدرس درست شاخه موقت ويندوز تصحيح کنيد در غير اين صورت هنگام فراخواني دستور session_start با خطا مواجه مي شويد. همچنين مي توانيد با تنظيم متغير session.cookie_lifetime مدت اعتبار cookie هاي session را بر حسب ثانيه مشخص کنيد.

session.save_path = c:\windows\temp
session.cookie_lifetime = 1800

تنظيمات مربوط به امنيت
تعدادي متغير در php.ini وجود دارد که به امنيت PHP نصب شده بر روي سيستم شما مريوط مي شوند. مهمترين آنها متغير safe_mode مي باشد که به طور مثال استفاده از آن براي محدود کردن آنچه کاربر مي تواند از طريق PHP انجام دهد بهISP ها توصيه ميشود.

safe_mode = Off

اگر safe mode فعال باشد (safe_mode = on) مي توانيد با تنظيم متغير safe_mode_include_dir مشخص کنيد که کدام شاخه ها براي فايل ها مورد جستجو قرار بگيرند. همچنين ميتوانيد نوع برنامه هايي که کدهاي PHP مي توانند از طريق فرمان exec آنها را اجرا کنند، را محدود کنيد. بدين منظور بايد اين برنامه هاي مجاز را در يک شاخه مخصوص قرار دهيد و از طريق متغير safe_mode_include_dir به PHP بگوييد که تنها در آن شاخه به دنبال آنها بگردد.بدين ترتيب تنها برنامه هاي درون اين شاخه توسط فرمان exec قابل دسترس خواهند بود.

safe_mode_include_dir = /usr/local/lib/php/safe-include
safe_mode_exec_dir = /usr/local/lib/php/safe-bin

شما مي توانيد اعمال مربوط به فايل ها را از طريق متغير open_basedir محدود کنيد. آدرس نسبت داده شده به اين متغير به عنوان ريشه اصلي (root) براي اعمال مربوط به فايل ها به کار مي رود. وقتي که اين متغير مقدار مي گيرد فايلهايي که در ساختار درختي اين ريشه نباشند براي PHP غير قابل دسترس خواهند بود. اين روش مناسبي براي محدود کردن کاربران يک سيستم اشتراکي مي باشد تا آنها تنها به آدرسهاي مربوط به خودشان دسترسي داشته باشند.

open_basedir = /home/web/

متغير max_execution_time تعيين ميکند که PHP حداکثر چند ثانيه منتظر پايان يافتن يک کد باشد قبل از آنکه به اجبار آن را خاتمه دهد. وقتي کد شما گرفتار حلقه هاي بينهايت ميشود اين متغير بکار مي آيد.اگر چه ممکن است اين موضوع گاهي مزاحمت ايجاد کند مثلا زماني که کد نوشته شده نياز به انجام اعمال زمانبري دارد، مثلا upload کردن يک فايل حجيم. در اين مواقع بايد مواظب باشيد که اين مقدار را افزايش دهيد تا مانع آن شويد که PHP اجراي کد شما را در وسط يک کار مهم خاتمه دهد.

max_execution_time = 90

تنظيمات مربوط به upload فايل ها و متغير هاي فرمها
اگر پيکربندي هاي امنيتي که تاکنون ذکر شد کافي نيست باز هم مي توانيد با غير فعال کردن قابليت upload فايل از طريق متغير file_uploads، يا با محدود کردن حداکثر حجم قابل upload از طريق متغير upload_max_filesize سيستم خود را از اين هم امن تر کنيد. اغلب تمايل خواهيد داشت که فضاي کوچکي را براي upload فايلها اختصاص دهيد مگر اينکه برنامه اي داشته باشيد که قرار باشد فايل هايي نظير يک گالري عکس يا يک FTP Service را پذيرا باشد.

file_uploads = On
upload_max_filesize = 2M

اگر تمايلي به upload کردن فايلها نداريد اما از تعداد زيادي فرم در صفحات PHP تان استفاده ميکنيد، 2 متغير ديگر وجود دارد که بايد برايتان جالب باشد. اول متغير register_globals، علت بيشترين سردردهاي برنامه نويسان با سابقهPHP در PHP 3.x اين متغير به طور پيش فرض فعال بود (on) که موجب ميشد وقتي يک فرم submit مي شد متغيرهاي آن بطور اتوماتيک به متغيرهاي PHP تبديل شوند.
مسايل امنيتي موجب شد که در PHP 4.x اين متغير بطور پيش فرض غير فعال باشد. (off). در نتيجه متغيرهاي فرم تنها به کمک آرايه هاي ويژه $_GET و $_POST قابل دسترس باشند. اين امر خيلي از کدهاي نوشته شده با PHP 3.x را با مشکل مواجه ساخت. مثلا مقداري که در يک فيلد وارد شده بود در PHP 3.x با $email قابل دسترس بود در حالي که در PHP 4.x با $_POST[email] يا $_GET[email] ميتوان به آن رجوع کرد.
ميتوانيد اين متغير را غير فعال کنيد (off) تا امنيت بيشتري را در برابر حملاتي که از طريق فرمها صورت مي گيرند برقرار کنيد. به منظور سازگاري با کدهاي نوشته شده با PHP 3.x آن را فعال کنيد:

register_globals = on

متغير ديگري که به کار با فرم ها مربوط ميشود post_max_size است که کنترل مي کند حداکثر چه حجم داده اي توسط متد POST يک فرم پذيرفته شود. به نظر نمي آيد که زماني لازم شود اين مقدار را از 8 MB افزايش دهيد. در عوض احتمال دارد بخواهيد آن را به يک مقدار واقعي تر تغيير دهيد. به هر حال اگر قصد داريد از امکانات upload فايل در PHP استفاده کنيد اين مقدار را بيشتر از مقدار متغير upload_max_size قرار دهيد.

post_max_size = 8M

يک متغير جديد هم در PHP 5 معرفي شده است: max_input_time. که حداکثر زمان بر حسب ثانيه که عمل دريافت داده هاي ورودي از طريق POST ،GET و PUT مي تواند طول بکشد را مشخص مي کند. اگر برنامه شما تحت يک اتصال کند اجرا مي شود بهتر است اين مقدار را افزايش دهيد تا به برنامه اجازه دهيد مدت بيشتري را به دريافت داده هاي ورودي اختصاص دهد.

max_input_time = 90

افزايش کارآيي
هنوز مقادير ديگري هم وجود دارد که با دستکاري آنها مي توانيد کارايي مفسر PHP را بالا ببريد. به منظور جلوگيري از اجراي کدهايي که ممکن است تمام حافظه موجود سيستم را اشغال کنند، PHP به شما اجازه مي دهد که براي استفاده از حافظه محدوديتي معين کنيد. اين کار از طريق متغير memory_limit قابل انجام است که حداکثر ميزان حافظه قابل استفاده توسط يک برنامه واحد را مشخص مي کند.

memory_limit = 8M

مقدار متغير memory_limit اغلب بايد از مقدار متغير post_max_size بيشتر باشد.
مساله ديگري که با دانستن آن مي توانيد کارايي را افزايش دهيد غير فعال کردن متغيرهاي $argc و $argv است که تعداد و محتواي آرگومان هاي خط فرمان که به يک برنامه ارسال شده اند، را مشخص مي کنند.

register_argc_argv = false

همينطور غير فعال کردن آرايه هاي $HTTP_GET_VARS , $HTTP_POST_VARS . چرا که به احتمال زياد در دنياي جديد $_GET , $_POST ديگر نيازي به آنها نيست. غير فعال کردن اين اجزا باعث بهبود کارآيي مي شود البته فقط در PHP 5 و از طريق متغيرregister_long_arrays قابل انجام است.

register_long_arrays = false

تابع ini_set
و در آخر نکاتي در مورد تابع ini_set. در حالي کهPHP تمام تنظيمات اش را در هنگام بالا آمدن، از فايل php.ini مي خواند، اين اجازه را به شما مي دهد که اين تنظيمات را به کمک تابع جالب ini_set و در برنامه خود انجام دهيد. البته اين تغييرات فقط براي همان برنامه اي که در آن از تابع ini_set استفاده کرده ايد اعمال مي شوند .اين تابع 2 آرگومان مي گيرد: نام متغير پيکربندي اي که مي خواهيد مقدارش را تغيير دهيد و مقدار جديد آن. اين هم يک مثال که حداکثر زمان اجراي مجاز براي برنامه اي که اين کد در داخل آن نوشته شده است را افزايش مي دهد.

<?php

ini_set('max_execution_time', 600);

// more code

?>

باز هم يادآوري مي شود که اين تنظيمات در داخل هر برنامه اي که نوشته شود فقط همان برنامه را تحت الشعاع قرار مي دهد. وقتي که برنامه خاتمه پيدا کند مقدار متغير به طور اتوماتيک به مقدار اوليه تغيير خواهد کرد.

اگر برنامه هايPHP شما بر روي يک سرور مشترک (Shared Server) اجرا مي شوند احتمالا شما دسترسي به فايل پيکربندي php.ini نخواهيد داشت. در اين موارد تابع ini_set کمک شاياني مي کند. چرا که اجازه مي دهد تنظيمات مورد نظرتان را براي برنامه هاي خودتان اعمال کنيد.
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نصب و تنظیم | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
Object Oriented Programming

Object Oriented Programming
در اين مقاله مي خواهم به بررسي يكي از زيباترين، و در عين حال خطرناكترين مباحث برنامه نويسي بپردازم، اين مبحث از اين جهت خطرناك هست كه اگر شما اصول اوليه را ياد بگيريد و اين نوع برنامه نويسي بر شما تاثير بگذارد از آن پس ديگر به همه چيز به چشم يك شيء نگاه خواهيد كرد و تمام روشهاي برنامه نويسي گذشته خود را به كنار خواهيد گذاشت. در اين مقاله اصلا قصد ندارم كه شروع كنم به آوردن مثالهايي از Object در دنياي واقعي و فرض مي كنم كه شما مثالهايي مثل رنگ ماشين و يا تلفن را بلد باشيد!
در حالت كلي يك شيء شامل يك سري متغيرها و توابع مي باشد كه درون يك قالب كلي به نام كلاس قرار دارند، به متغيرهاي درون كلاسها Properties و به توابع موجود در آن Method گفته مي شود.
رويه كلي در ساخت يك class در PHP بسيار ساده است، كافي است شما با استفاده از كلمه class يك كلاس جديد ايجاد كنيد، به اين صورت:

class Item {
// properties

// methods
}

در مثال بالا به اين موارد توجه كنيد:
ساخته شدن يك كلاس توسط كلمه كليدي class صورت مي گيرد.
شما در هر جاي كلاس قادر به تعريف متغيرهاي كلاس يا properties هستيد اما بهتر است كه آنها را در ابتداي class تعريف كنيد.
بعد از آن به معرفي توابع كلاس يا methods بپردازيد.
تمام اين موارد بين دو {} تعريف كلاس صورت مي گيرند.
خوب حالا سعي مي كنم با چند مثال شما را بهتر با اين مفاهيم آشنا كنم:

$obj = new Item();
print \"$obj is an \".gettype($obj);

اول براي اين كه ببينيم كه يك كلاس ساختيم از PHP مي خواهيم كه نوع متغيرنسيت داده شده را به ما برگرداند. در مثال بالا توجه به اين نكته كه ما براي استفاده از يك كلاس از كلمه new استفاده مي كنيم ضروري است، هميشه اين كار را براي نسبت دادن يك كلاس به متغير انجام مي دهيم. و در خط دوم با استفاده از تابع gettype نوع متغير را بر مي گردانيم، در زبانهاي loosley type مثل PHP ( زبانهايي كه در آنها نوع متغير همراه با تغيير متغير، عوض مي شود) اين كه بدانيم با چه نوع متغيري سروكار داريم اجتناب ناپذير است، مي بينيم كه اين عبارت رشته object را بر مي گرداند. خوب ما تا اينجا يك كلاس ساختيم، ولي مسلما اين كلاس هيچ كاربردي ندارد، حالا بياييد آنرا كاربردي تر كنيم.

class Item {
     var $name = \"item\";
}

$obj = new Item();
print \"$obj->name<br/>\";
$obj->name = \"widget\";
print \"$obj->name<br/>\";

خوب در اينجا ديديد كه با استفاده از كلمه كليدي var يك متغير تعريف كرديم، با استفاده از عملگر -> به عناصر يك كلاس دسترسي پيدا كرديم و مقادير آنها را چاپ كرديم، نكته قابل ذكر آنكه در استفاده از كلمه new ما Item() را به كار برديم درسته كه ما از () استفاده كرديم اما اين به معناي يك تابع نيست. خوب حالا تا اينجا ما متغيرها رو تعريف كرديم و مقادير آنها را تغيير داديم و انها را چاپ كرديم، اما خوب اين كار كلاس رو فقط كمي جالب تر از آرايه هاي انجمني ( آرايه هاي كه مقادير به جاي داشتن يك index در آرايه يك نام مشخص دارند يا همان associative array) نشون مي ده، حالا با اضافه كردن متدها اونو كاربردي تر مي كنيم.

class Item {
     var $name=\"item\";

     function setName( $n ) {
          $this->name = $n;
     }

     function getName() {
          return $this->name;
    }
}

$item = new Item();
$item->setName(\"widget\");
print $item->getName();

خوب حالا از متدها هم در كلاسمون استفاده كرديم، فكر نمي كنم اين كد به توضيح نياز داشته باشه.
اما اگر ما بخوايم در هر بار نسبت دادن كلاس هم بتونيم متغير name رو مقداردهي كنيم چكار بايد بكنيم، مثلا در مثال بالا مي بينيد كه با هر بار تعريف، مقدار $name برابر با item مي باشد و ما بايد با استفاده از متد setName اونو تغيير بديم. اينجاست كه بايد از سازنده ها يا Constructors استفاده كنيم. الآن شما مي تونيد در PHP به دو شيوه Constructor تعريف كنيد، قبل از PHP 5 شما بايد از متد همنام با كلاس براي ساخت سازنده استفاده كنيد، اما خوب با توجه به پيشرفتهاي انجام گرفته در PHP 5 در زمينه OOP شما در اين نسخه همچنين مي تونين از تابع __construct() استفاده كنيد. توجه به يك نكته ضروري است كه اگر شما قصد نوشتن برنامه هاي كاربردي را داريد بايد به اين نكته توجه داشته باشيد كه تمام وب سرورها PHP 5 را پشتيباني نمي كنند پس هنوز بهتر است از ويژگيهاي عالي OOP در PHP 5 براي برنامه هاي كاربردي خود چشم پوشي كنيد و فعلا اونا رو روي كامپيوتر خودتون آزمايش كنيد. خوب حالا كد بالا را با استفاده از يك Constructor بازنويسي مي كنيم:

class Item {
     var $name;

     function Item( $name=\"item\" ) {
          $this->name = $name;
     }

     function setName( $n ) {
          $this->name = $n;
     }

     function getName() {
          return $this->name;
    }
}

$item = new Item(\"widget\");
$item->getName();

خوب تا اينجا همه مفاهيم اوليه در OOP در PHP را ياد گرفتيد، تاكيد مي كنم، فقط مفاهيم اوليه، در اين قسمت قصد دارم يك مثال كاربردي تر بيارم تا شما بهتر با اين مقوله آشنا بشيد.
به قطعه كد زير توجه كنيد:

    class Page {
    var $Title;
    var $Keywords;
    var $Content;

    function Display () {
        echo \"<HTML>\n<HEAD>\n\";
        $this->DisplayTitle();
        echo \"\n\";
        $this->DisplayKeywords();
        echo \"\n</HEAD>\n<BODY>\n\";
        echo $this->Content;
        echo \"\n</BODY>\n</HTML>\";
    }

    function DisplayTitle() {
        echo \"<TITLE>\".$this->Title.\"</TITLE>\";
    }

    function DisplayKeywords() {
        echo '<META NAME=\"keywords\" CONTENT=\"'.$this->Keywords.'\">';
    }

    function SetContent( $Data ) {
        $this->Content = $Data;
    }
    }

حالا اين كد رو تفسير مي كنيم:
در ابتدا كلاسي با نام Page تعريف كرديم.
3 متغير يا properties را در ابتداي تعريف كلاس ساختيم.
در تابع Display() ابتدا خطوط اوليه يك صفحه HTML را نوشتيم، در خط دوم آن تابع DisplayTitle() را فراخواني كرديم، كه اين تابع تگهاي را در دوطرف عنوان سايت قرار ميده، در خط چهارم متود Display() ما متود DisplayKeywords() را فراخواني كرديم، در خط پنجم آن تگ را بستيم و تگ را باز كرديم، سپس مقدار متغير Content را به طور مستقيم بر روي صفحه نماشي داديم. اين صفحه را با نام page.class.php نام گذاري كنيد حالا از اين كلاس براي ساخت يك صفحه استفاده مي كنيم:

include \"page.class.php\";

    $Sample = new Page();

    $Content = \"<P>This page was generated by the Page Class example.</P>\";

    $Sample->Title = \"Using classes in PHP\";
    $Sample->Keywords = \"PHP, Classes\";
    $Sample->SetContent($Content);

    $Sample->Display();

اين صفحه را با نام page.php نام گذاري كنيد و در مرورگر خود اونو اجرا كنيد، اگر همه چيز درست پيش رفته باشه شما بايد تمام مقاديري رو كه به متغيرها نسبت داديد در جاي خود مشاهده كنيد. خوب در اينجا هم ابتدا يك نمونه از كلاس Page رو با استفاده از كلمه كليدي new به متغير Sample نسبت داديم، سپس متغيرهاي متفاوت را مقداردهي كرديم و سپس تابع Display() را فراخوانديم، به همين سادگي، توجه داشته باشيد كه هتگامي كه با استفاده از عملگر -> از متغيرهاي كلاس استفاده مي كنيم از آوردن علامت $ در ابتداي نام متغير خودداري مي كنيم.
اما در انتها پاسخ به يك سؤال ضروري به نظر مي رسد و آن اينكه آيا شما مجبوريد برنامه نويسي OO رو ياد بگيريد؟
اگر بخواهيم يك جواب ساده داشته باشيم، نه! خيلي از كدهاي PHP موجود هيچ بويي از OOP نبرده اند، هيچ كاري نيست كه شما نتونين اونو با ساير روشهاي برنامه نويسي پياده كنيد، بزرگترين مزيت OOP قابليت استفاده مجدد، قابليت گسترش و سازماندهي به كد شماست، و حتما اين موارد بسيار مهم هسنتند كه بيشتر پيشرفتها در نسخه 5 درباره برنامه نويسي شيءگرا مي باشد، به هر حال اگر هرگز هم نخواهيد از اين نوع برنامه نويسي در پروژه هاي خود استفاده كنيد بالاخره نياز به استفاده از Extension هايي مثل PEAR داريد كه معمولا همه اونا با روش OOP نوشته شده اند. پس بهتره به دنبال يادگيري اون باشيد.
شما به راحتي مي تونين با گسترش مثال بالا اولين پروژه OOP خود را آغاز كنيد!
منتظر مقالات پيشرفته تر در اين زمينه باشيد.

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
آشنايي با ماژول Mysqli در PHP 5

يكي از ويژگي هاي جالبي كه در php 5 ارائه شده است يك Extension جديد به نام ext/mysqli مي باشد كه همانند ext/mysql سابق به عنوان يك رابط براي كار با پايگاه داده mysql از آن استفاده مي شود. برای برنامه های کاربردی در مقیاس بزرگتر ماژول جدید MySQLi به کاربران اجازه می دهد که از ویژگی های جدید MySQL 4.1 در برنامه های خود استفاده کنند که بازدهی بیشتری را نسبت به نسخه های قبلی MySQL فراهم می کند.

از اواسط دهه 90 تاكنون ext/mysql نقش خود را به عنوان يك پل رابط ميان PHP و MySQL به خوبي ايفا كرده است. اگرچه ext/mysql نقاط ضعف كمي داشته است ولي توانسته است كه همگام با تغييرات PHP و MySQL پيش رود.

اما وقتي كه PHP 5 و MySQL 4.1 پا به عرصه نهادند ext/mysql نشان داد كه براي سازگاري با پيشرفت هاي زياد اين دو نسخه، فقدان هايي را دارد.يكي از اين نفاط ضعف مربوط به برقراري ارتباط پايدار و دايمي با پايگاه داده (mysql_pconnect()) بود. ويژگي ها و امكاناتي توسط MySQL ارائه شد كه ext/mysql هنوز قادر به سازگاري با آنها نبود. براي رفع اين مشكلات Georg Richter شروع به ساخت يك extension جديد براي PHP 5 كرد كه با ويژگي هاي ارائه شده در MySQL 4.1 و نسخه هاي بالاتر همگام باشد.

مهمترين ويژگي هاي ارائه شده توسط ext/mysqli

ارائه يك واسط روالي (Procedural Interface) كه بسيار شبيه واسط ext/mysql مي باشد
ارائه يك واسط شي گرا(Object-Oriented Interface) كه در مقايسه با واسط روالي از انعطاف پذيري بيشتري برخوردار است و كار با آن راحت تر است(با توجه به امكانات شي گرايي در PHP 5)
پشتيباني از پروتكل باينري جديد MySQL كه در نسخه 4.1 عرضه شد.(اين پروتكل جديد در مقايسه با قبلي از بازدهي بيشتري برخوردار است و امكانات گسترده اي همچون Prepared Statement را پشتيباني مي كند.)
پشتيباني از تمام ويژگي هاي مجموعه كتابخانه كاربري MySQL C كه شامل قابليت تنظيم گزينه هاي پيشرفته اتصال از طريق mysqli_init() و توابع وابسته مي شود.

به دو دليل توصيه مي شود كه به اين ماژول جديد switch كنيد و از اين به بعد با اين ماژول كار كنيد:

سرعت بيشتر
امنيت بيشتر

حرف i در انتهاي ext/mysqli به معناي ,improved, interface, ingenious, incompatible incomplete مي باشد!

نحوه كار با ext/mysqli

*قبل از كدنويسي توجه داشته باشيد كه براي استفاده از اين ماژول، شما بايد PHP 5 و MySQL 4.1 را نصب كرده باشيد.كدهاي اين مقاله از پايگاه داده World استفاده مي كنند كه به صورت رايگان از آدرس http://www.mysql.com/documentation/index.html قابل دريافت مي باشد.

برنامه ساده زير ابتدا به پايگاه داده متصل مي شود و با ارسال يك پرس و جو(Query) به Server ، دريافت نتايج و نمايش آنها و سپس بستن اتصال به كار خود خاتمه مي دهد:

<?php

/* Connect to a MySQL server */
$link = mysqli_connect(
            'localhost',  /* The host to connect to */
            'user',       /* The user to connect as */
            'password',   /* The password to use */
            'world');     /* The default database to query */

if (!$link) {
   printf("Can't connect to MySQL Server. Errorcode: %s\n\", mysqli_connect_error());
   exit;
}

/* Send a query to the server */
if ($result = mysqli_query($link, 'SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5')) {

    print(\"Very large cities are:\n\");

    /* Fetch the results of the query */
    while( $row = mysqli_fetch_assoc($result) ){
        printf(\"%s (%s)\n\", $row['Name'], $row['Population']);
    }

    /* Destroy the result set and free the memory used for it */
    mysqli_free_result($result);
}

/* Close the connection */
mysqli_close($link);
?>

بعد از اجراي اسكريپت بالا بايد خروجي را به صورت زير مشاهده كنيد:

Very large cities are:

Mumbai (Bombay) (10500000)
Seoul (9981619)
São Paulo (9968485)
Shanghai (9696300)
Jakarta (9604900)

همانطور كه در كد مشاهده مي كنيد در اينجا هيچ تفاوت خاصي بين ext/mysql و ext/mysqli مشاهده نمي شود جز افزوده شدن حرف i به آخر توابع!

حال اگر از واسط شي گرا استفاده كنيد و برنامه بالا را مجددا بازنويسي كنيد به انعطاف پذيري بيشتر و راحتي كار با اين واسط جديد پي مي بريد:

<?php

/* Connect to a MySQL server */
$mysqli = new mysqli('localhost', 'user', 'password', 'world');

if (mysqli_connect_errno()) {
   printf("Can't connect to MySQL Server. Errorcode: %s\n\", mysqli_connect_error());
   exit;
}

/* Send a query to the server */
if ($result = $mysqli->query('SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5')) {

    print(\"Very large cities are:\n\");

    /* Fetch the results of the query */
    while( $row = $result->fetch_assoc() ){
        printf(\"%s (%s)\n\", $row['Name'], $row['Population']);
    }

    /* Destroy the result set and free the memory used for it */
    $result->close();
}

/* Close the connection */
$mysqli->close();
?>

همانطور كه مشاهده مي كنيد اطلاعات مربوط به اتصال در اشياي $mysqli و $result ثبت مي شود و براي اجراي دستورات نيازي به مشخص كردن اين اطلاعات نداريم. همچنين وقتي در بين نتايج پرس و جو به صورت سطر به سطر توسط تابع fetch_assoc() حركت مي كنيم ديگر نيازي به ساخت يك handle براي كار با ركوردها نداريم.

استفاده از ويژگي Prepared Statements در پرس و جوها

مزيت Prepared Statements اين است كه به كاربران امكان ساخت query هاي بسيار ايمن تر، با بازدهي بيشتر و راحت تر را مي دهد. به دو صورت مي توان از اين ويژگي بهره برد: bound parameter prepared statements و bound result prepared statements

bound parameter prepared statements اين امكان را به ما مي دهد كه براي Query هاي خود قالب (Template) درست كنيم و آنها را در Server ذخيره كنيم. وقتي نياز به اجراي Query داشتيم اطلاعات لازم را براي پر كردن Query به Server مي فرستيم و سپس Query كامل را اجرا مي كنيم. اين كار دو مزيت دارد:

اول اينكه زمان كمتري صرف تجزيه و تحليل Query در هنگام اجرا مي شود. و دوم اينكه از حملات تزريقي SQL(SQL injection attacks) جلوگيري مي شود.

در زير يك مثال كامل از به كارگيري اين ويژگي را در پرس و جوها مشاهده مي كنيد:

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'world');

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n\", mysqli_connect_error());
    exit();
}

$stmt = $mysqli->prepare(\"INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)\");
$stmt->bind_param('sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = \"F\";
$percent = 11.2;

/* execute prepared statement */
$stmt->execute();

printf(\"%d Row inserted.\n\", $stmt->affected_rows);

/* close statement and connection */
$stmt->close();

/* Clean up table CountryLanguage */
$mysqli->query(\"DELETE FROM CountryLanguage WHERE Language='Bavarian'\");
printf(\"%d Row deleted.\n\", $mysqli->affected_rows);

/* close connection */
$mysqli->close();
?>

توجه كنيد كه تابع bind_param() يك رشته كوتاه را به عنوان اولين پارامتر خود مي گيرد. اين پارامتر String Format مي باشد و نوع متغيرهاي ارسالي را مشخص مي كند. در مثال بالا sssd مشخص مي كند كه $code و $language و $official از نوع String مي باشند و $percent از نوع float يا Double مي باشد. مشخص كردن اين نوع داده ها باعث مي شود كه ext/mysqli بداند كه چگونه داده ها را براي فرستادن كدگذاري كند و اين كار باعث بازدهي بالا مي شود.جدول زير نوع داده هاي قابل قبول را نشان مي دهد:

BIND TYPE
COLUMN TYPE

i
All INT types

d
DOUBLE and FLOAT

b
BLOBs

s
All other types

اگر با ASP.NET هم آشنايي داريد، در زير مي توانيد نحوه به كارگيري اين ويژگي را درASP.NET هم مشاهده كنيد و با PHP 5 مقايسه كنيد:

Dim cnn As New SQLConnection(\"server=LOCALHOST;User id=SA;password=;database=Northwind\")
Dim InsertCommand As SqlCommand = New SqlCommand()
InsertCommand.Connection = cnn
Dim sql As String
sql = \"INSERT INTO categories (categoryName) VALUES (@newCatName)\"

InsertCommand.CommandText = sql

InsertCommand.Parameters.Add(\"@newCatName\", SqlDbType.NVarChar, 250).Value = \"Category Name\"

Bound result prepared statements اين امكان را مي دهد كه مقدار فيلدهاي دريافتي از پايگاه داده را به متغير هاي دلخواه نسبت دهيم(چيزي شبيه تابع list كه عناصر يك آرايه را به متغير هاي دلخواه نسبت مي دهد.)

مثال زير استفاده از اين ويژگي را نشان مي دهد:

<?php
$mysqli = new mysqli("localhost\", \"user\", \"password\", \"world\");

if (mysqli_connect_errno()) {
    printf(\"Connect failed: %s\n\", mysqli_connect_error());
    exit();
}

/* prepare statement */
if ($stmt = $mysqli->prepare(\"SELECT Code, Name FROM Country WHERE Code LIKE ? LIMIT 5\")) {

    $stmt->bind_param(\"s\", $code);
    $code = \"C%\";

    $stmt->execute();

    /* bind variables to prepared statement */
    $stmt->bind_result($col1, $col2);

    /* fetch values */
    while ($stmt->fetch()) {
        printf(\"%s %s\n\", $col1, $col2);
    }

    /* close statement */
    $stmt->close();
}
/* close connection */
$mysqli->close();

?>

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کار با Database ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
نحوه دریافت و پرداخت پول به صورت آنلاین توسط e-gold

مقدمه
همانطور که میدانید متاسفانه در ایران به علت عدم وجود پول الکترونیکی، امکان دریافت و پرداخت پول به صورت online وجود ندارد و همین امر باعث شده که وب سایتهای ایرانی تنها در حد یک منبع اطلاع رسانی صرف باقی مانده و نتوانند به تجارت الکترونیک بپردازند؛ هر چند که ما اکثرا برای هر سایتی نام تجارت الکترونیک را نیز همراه با آن می شنویم و صاحبان سایت و برنامه نویسان آن ادعا می کنند که این سایت به تجارت الکترونیک مشغول می باشد، منتها اگر شما هم به اصل قضیه نگاه کنید متوجه میشوید که فکر تجارت الکترونیک بدون پول الکترونیک خیالی باطل بیش نیست و این امر اصلا معنایی ندارد! چطور میشود قبل از دریافت واقعی پول به صورت آنلاین به مشتری اعتماد کرد و جنس را برای او فرستاد؟ بعضی سایتها از روشی ترکیبی استفاده می کنند، به این صورت که هر مشتری برای خود username/password خاص خود را داشته و سفارشات را نیز خود انجام میدهد، بعدا این مشتری باید پول را بصورت دستی به حساب سایت واریز کرده و رسید را به آدرس صاحب سایت بصورت فکس یا ایمیل ارسال کند. من معتقدم که حتی اسم این کار را هم نمیتوان تجارت الکترونیک گذاشت! چون هیچ اتوماسیونی در آن لحاظ نشده و میتوان گفت تمام دردسرهای تجارت عادی و روزمره را نیز داراست.

کار کردن با سایتهای پولی معروفی چون e-gold، paypal و ... امریست که هر برنامه نویس وب در کشورهای خارجی در اوائل کار خود به آن برخورد کرده و به راحتی با آن آشنا میشود، منتها متاسفانه در ایران به علت عدم وجود پول الکترونیکی، به ندرت میتوان کسی را پیدا کرد که واقعا با پول الکترونیک کار کرده باشد و یا اینکه حتی بتواند روش کار را توضیح دهد! اگر به پستهای پنج یا شش ماه گذشته من در IranPHP.net نگاهی بیندازید میبینید که من خودم در بدر به دنبال کسی بودم که بتواند روش کار را به من توضیح دهد و بگوید که از کجا باید شروع کنم. در آن زمان پروژه ای به من پیشنهاد شده بود که باید از e-gold در آن استفاده می کردم و امکان پرداخت و دریافت آنلاین را به مشتریان میدادم. مشکل من این بود که اصلا با منطق کار آشنایی نداشتم و نمی دانستم که چطور میتوان بصورت آنلاین پول دریافت/پرداخت کرد و این همه نکات امنیتی که از آن صحبت می شود در کجا و چگونه باید استفاده شود!

در حال حاضر نیز هدف من از نوشتن این مقاله آشنا کردن شما با منطق کار و نحوه برقراری ارتباط با چنین سایتهاییست. در اینجا من تنها نحوه کار با e-gold را برای شما توضیح میدهم، ولی بعد از اینکه توانستید با e-gold کار کنید و کلا منطق کار را متوجه شدید، می بینید که کار کردن با هر gateway پولی دیگری چون PayPal، MasterCard، Visa و .... نیز عینا به همین طریق است و تنها لازم است که شما مقداری از کدتان را برای ارتباط با آن سایت پولی خواص تغییر دهید. همانطور که میدانید صحبت از پول الکترونیک چند ماه است که در ایران بصورت جدی در حال انجام است و آنطور که من شنیدم تا آخر امسال (سال 1383 خورشیدی) بانکها موظفند که gateway های پولی خود را بروی برنامه نویسها باز کنند تا بتوان عملیات بانکی را از طریق اینترنت انجام داد. البته الان بانکهای خصوصی چون بانک سامان وجود دارند که این امکان را فراهم آورده اند. به عنوان مثال شرکت قطارهای مسافرتی رجاء نیز در حال حاضر از این امکان بانک سامان استفاده کرده و مسافرانی که در این بانک حساب داشته باشند، می توانند با مراجعه به سایت رجاء (www.raja.ir) بلیط خود را بصورت آنلاین تهیه کنند.

برای خواندن متن کامل این مقاله اینجا را کلیک کنید.
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ?

سرفصل‌ها :
1ـ اين اسكريپت چگونه كار مي كند | پيشنيازها | الگوي بانك اطلاعاتي
2ـ اتصال به بانك اطلاعاتي |‌ متغيرهاي جلسات
3ـ هسته اسكريپت | ورود كاربران
4ـ كنترل مداوم اعتبار ورود | اطمينان از معتبر بودن اطلاعات جلسات

ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
اين آموزش در سطح متوسط طراحي گرديده و به شما خواهد آموخت كه چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد . بزودي ياد مي گيريم كه چگونه با استفاده از توابع كوكي ها دسترسي به جلسات را قانوني كنيم و از سرقت جلسات جلوگيري كنيم.

1ـ اين اسكريپت چگونه كار مي كند ؟
در اين قسمت مي خواهم برايتان دليل انتخاب اين متد براي لاگين امن را برايتان توضيح دهم فراموش نكنيد كه اصولا امنيت قانون ندارد و شما نيز با استفاده از تجربيات و توانايي هاي هوشي خود بايد به فكر توسعه و طراحي موارد مشابه و امن تر نمائيد و به هيچ وجه به اين حد بسنده نكنيد:
/tmpكاربراني كه قادرند تا به سرور دست يابي داشته باشند مي تواند جلسات معتبر لاگينها را از شاخه پيش فرض
كه به منظور ذخيره سازي اطلاعات جلسات استفاده ميشود مشاهده نمايند روش جلوگيري از اين نوع حمله كنترل آي پي مي باشد.
كساني كه بر روي ميزبان شما سايتي دارند قادرند جلسات معتبر براي سايت شما توليد كنند توجه بفرمائيد كه برخي سايتها سرورهاي اختصاصي دارند كه به لحاظ امنيتي بسيار مطلوبترند مثل سايت پرشين بلاگ
برخي از اون آدمايي كه به قول خودمون آخرشن و اند حكن مي تونن شبكه رو بو بكشن و كوكي‌ها رو بقاپن
كنترل آي پي اين مشكل رو هم حل مي كنه

2-1ـ اما پيش نيازها
شما اول از همه بايد بدونين كه چه اطلاعاتي از كاربران قرار كه در سايت ذخيره بشه در اين مثال براي سهولت آموزش ساده ترين شكل ممكن رو فرض قرار دادم ضمنن چون الان همه ديگه پي اچ پي 4.1 به بالا دارن من هم از استفاده كردم اگر مي خواين كه اين اسكريپت رو روي نسخه هاي قديمي تر اجرا كنين شما super global arrays
مجبوريد كه از
$GLOBALS['HTTP_SESSION_VARS']
استفاده كنيد.

الگوي بانك اطلاعاتي ـ1-3
اين فقط يك مثال ساده با ساختاري مناسب براي مديريت اگر كه مايليد اين مثال را براي كاربران ثبت نام شده استفاده كنيد مي توانيد ستونهاي را به دلخواه اضافه كنيد
من الگوي بانك اطلاعاتي را كه از ماي اس كيو ال استفاده مي كنه اينجا گذاشتم شما مي تونين از ديگر بانكهاي اطلاعاتي نيز استفاده كنيد:

CREATE TABLE member (
id int NOT NULL auto_increment,
username varchar(20) NOT NULL default '',
password char(32) binary NOT NULL default '',
cookie char(32) binary NOT NULL default '',
session char(32) binary NOT NULL default '',
ip varchar(15) binary NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY username (username)
);

فيلدهاي پسورد و كوكي براي استفاده از ام دي فايو طراحي شدن كوكي مقدارش براي زمانيست كه كاربر بخواهد اطلاعات برايش ذخيره شود و فيلدهاي جلسه و آي پي براي جلسه آي دي و آي پي كاربر استفاده مي شوند.

ــــــــــــــــــــــــــــــــــــــ
2ـ اتصال به بانك اطلاعاتي

function &db_connect() {

require_once 'DB.php';

PEAR::setErrorHandling(PEAR_ERROR_DIE);

$db_host = 'localhost';
$db_user = 'root';
$db_pass = '';
$db_name = 'shaggy';

$dsn = \"mysql://$db_user:$db_pass@unix+$db_host/$db_name\";

$db = DB::connect($dsn);

$db->setFetchMode(DB_FETCHMODE_OBJECT);
return $db;

}

اين تابع شما را به بانك اطلاعاتي متصل مي كند و يك اشاره گر به شي بانك اطلاعاتي پير باز مي گرداند

2-2ـ متغيرهاي جلسات:
براي سهولت در امر دستيابي به اطلاعات كاربران من اون رو يك متغير جلسه ثبت مي كنم ولي براي جلوگيري از پيغام خطا و همچنين ست كردن برخي پيش فرض ها از تابع زير استفاده مي كنم:

function session_defaults() {

$_SESSION['logged'] = false;
$_SESSION['uid'] = 0;
$_SESSION['username'] = '';
$_SESSION['cookie'] = 0;
$_SESSION['remember'] = false;
}

براي ست كردن يه مقادير پيش فرض از تابع بالا و براي چك كردن از تابع زير

if (!isset($_SESSION['uid']) ) {
session_defaults();
}

رو فرا خواني كنيمsession_startالبته فراموش نمي كنيم كه قبل از اينها بايد تابع

3ـ هسته اسكريپت:
براي ايجاد يكپارچگي ساده تر با ديگر اسكريپتها و ساخت مدوله شده تر هسته اسكريپت رو يك آبجكت با ظاهري خيلي ساده مي سازم

class User {

var $db = null; // PEAR::DB pointer
var $failed = false; // failed login attempt
var $date; // current date GMT
var $id = 0; // the current user's id

function User(&$db) {

$this->db = $db;
$this->date = $GLOBALS['date'];

if ($_SESSION['logged']) {
$this->_checkSession();
} elseif ( isset($_COOKIE['mtwebLogin']) ) {
$this->_checkRemembered($_COOKIE['mtwebLogin']);

}

}

اين كلاس كه تعريف ميشه آبجكت ما رو ميسازه البته اين كاملا مدوله شده نيست اما يك تاريخ مشكل بزرگي نيست و شما مي تونين اونو با اسكريپتهايي كه بقيه دوستان نوشتن به صورت شمسي توليد كنيد در اينجا ما چنين چيزي رو مي سازيم:

$date = gmdate(\"'Y-m-d'\");
$db = db_connect();
$user = new User($db);

حالا براي روشن شدن هدف كد يعني لاگين كردن تلاش مي كنيم ما ابتدا كنترل مي كنيم كه آيا كاربر لاگين كرده يا نه اگر اين كار رو كرده بود ما جلسات رو چك مي كنيم(فراموش نكنين كه اين يك كد امنيتي) وگرنه يك كوكي رو نام گذاري مي كنيم براي كنترل كردن اين به ما اجازه مي ده كه بينندگان سايت رو شناسايي كنيم

3-1ـ لاگين كردن كاربران:

براي اجازه دادن به كاربران براي لاگين كردن شما بايد يك فرم وب بسازيد پس از اعتبار سنجي فرم شما مي تونيد اعتبار كاربر رو براي تائيد اطلاعات وارد شده كنترل كنيد كه براي اينكار از
$user->_checkLogin('username', 'password', remember)
استفاده مي كنيم
خاطر نشان مي كنيم كه يوزر نيم و پسورد البته نبايد ثابت باشند و ريممبر يك مقدار بولين است كه به كاربر اجازه مي دهد تا با درست قرار دادن مقدار آن لاگين خودكار را فعال بسازد

function _checkLogin($username, $password, $remember) {

$username = $this->db->quote($username);
$password = $this->db->quote(md5($password));

$sql = \"SELECT * FROM member WHERE \" .
\"username = $username AND \" .
\"password = $password\";

$result = $this->db->getRow($sql);

if ( is_object($result) ) {
$this->_setSession($result, $remember);
return true;
} else {
$this->failed = true;
$this->_logout();
return false;
}

}

تعريف تابع بايد در مكاني كنار كلاس تعريف شده يوزر باشه مانند تمام كدهاي پائين در تابع از متد
PEAR::DB's quote
استفاده كردم تا اطلاعات با امنيت كامل به بانك اطلاعاتي انتقال پيدا كنند و به صورت بي ختري نيز از آن رهاي يابند و باز گردنند من از تابع ام دي فايو ترجيحا به جاي توابع ماي اسكيو ال استفاده كردم تا شما اگر مايل بوديد بتوانيد از بانكهاي اطلاعاتي ديگر نيز استفاده كنيد.
حلقه ور بهينه شده زيراكه يوزرنيم به صورت منفرد تعريف شده است
نيازي به كنترل خطاهاي بانك اطلاعاتي نيست زيراكه خطاهاي پيشفرض قبلا در بالا ست شدند
چنانچه آبجكت با رزالت بانك اطلاعاتي متچ شود لذا متغير جلسات ست مي شوند و مقدار ترو باز ميگردد وگرنه
مقدار فلد با ترو برابر مي گردد شما مي تونين اينجا يك دستور كنترلي قرار دهيد تا پيغام سقوط عمليات لاگين رو اعلام كنه و براي انجام لاگ اوت براي اين بيننده كافيست تا
session_defaults()
را اجرا كنيم

3-3ـ وضع كردن جلسه:

function _setSession(&$values, $remember, $init = true) {

$this->id = $values->id;
$_SESSION['uid'] = $this->id;
$_SESSION['username'] = htmlspecialchars($values->username);
$_SESSION['cookie'] = $values->cookie;
$_SESSION['logged'] = true;

if ($remember) {

$this->updateCookie($values->cookie, true);

}

if ($init) {

$session = $this->db->quote(session_id());
$ip = $this->db->quote($_SERVER['REMOTE_ADDR']);

$sql = \"UPDATE member SET session = $session, ip = $ip WHERE \" .
\"id = $this->id\";
$this->db->query($sql);

}

}

اين متد متغير جلسه را ست مي كند و همچنين اگر در خواست كوكي براي داشتن لاگين مسمتر (خودكار) ارسال شده باشد
همچنين اين متد يك پارامتر دارد كه معين مي كند كه اين بار اول لاگين كردن است يا نه (از طريق فرم يا كوكي)
يا كنترل جلسه براي اولين بار نيست.

4ـ لاگين خود كار:
اگر بينندگان در خواست كنند كه كوكي ارسال بشه تا دفعات بعدي از لاگين كردن در هر مشاهده از سايت بپريد
اين دو متد به شما براي رسيدن به اين مهم كمك خواهد كرد

function updateCookie($cookie, $save) {

$_SESSION['cookie'] = $cookie;
if ($save) {

$cookie = serialize(array($_SESSION['username'], $cookie) );
set_cookie('mtwebLogin', $cookie, time() + 31104000, '/directory/');
}

}

4-1ـ كنترل لاگين خود كار:
اگر كاربران لاگين خودكار را انتاخاب كرده باشند كه به اسكريپت اجازه ذخيره كوكي را مي دهد كه كنترل مي شه از طريق متد زير

function _checkRemembered($cookie) {

list($username, $cookie) = @unserialize($cookie);
if (!$username or !$cookie) return;

$username = $this->db->quote($username);
$cookie = $this->db->quote($cookie);

$sql = \"SELECT * FROM member WHERE \" .
\"(username = $username) AND (cookie = $cookie)\";

$result = $this->db->getRow($sql);

if (is_object($result) ) {
$this->_setSession($result, true);
}

}

اين تابع هرگز نبايد توسط پيغام خطايي متوقف شود براي ساختن چيزهاي امن تر با كوكي ها مقدار كوكي در كوكي ذخير مي شود نه پسورد كاربر يكي از اين راه ها مي تونه درخواست يك لغت عبور باشه براي ناحيه اي كه به امنيت بيشتري نياز دارد

5-5ـ مطمئن شدن از اعتبار جلسه:

function _checkSession() {

$username = $this->db->quote($_SESSION['username']);
$cookie = $this->db->quote($_SESSION['cookie']);
$session = $this->db->quote(session_id());
$ip = $this->db->quote($_SERVER['REMOTE_ADDR']);

$sql = \"SELECT * FROM member WHERE \" .
\"(username = $username) AND (cookie = $cookie) AND \" .
\"(session = $session) AND (ip = $ip)\";

$result = $this->db->getRow($sql);

if (is_object($result) ) {
$this->_setSession($result, false, false);
} else {
$this->_logout();
}

}

پوف بالاخره آخرين قسمت كار ما كنترل مي كنيم كه آيا كوكي ذخيره شده در جلسه درست هست يا نه جلسه آي دي و آي پي كاربر
با يك پارامتر كه اجازه مي ده كه بفهميم كه اين اولين بار لاگين كردن در سيستم هست بنابراين setSessionفراخواني
مقدار آي پي و آي دي در جلسه بروز رساني نشود كه در بقيه موارد بطور معمول انجام مي شود

فقط دوستان خبره لطفا نظر بدين...

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
ساخت تصاوير امنيتي با php

چندي پيش در يکي از انجمنها بحث داغي در مورد برتري php بر asp.net و يا برعکس asp.net بر php شکل گرفته بود طرفداران asp.net در موضوعاتي در همان انجمن سوالي در مورد ساخت و توليد تصاوير امنيتي که روبوتها قابل به خواندن آنها نيستند مطرح کرده بودند و پاسخ آن موضوع را يکي از دوستان ارجمند با تابعي مخصوص در asp.net داده بودند من به فکر ساخت چيز مشابهي با php افتادم و سري هم به سيت محبوبمان php.net زدم تا ببينم چيز بدرد بخوري گير مياد يا نه باورتون نميشه تو کمتر از چند ثانيه زدم تو خال هموني که مي خواستم رو گير آوردم يکمي هم انگولکش کردم تا جالب تر بشه و توضيح کاملش رو براتون ميارم مثل ينکه همينطوري الکي الکي من دارم فقط از مسائل امنيتي براتون مقاله مينويسم نه!!!!!؟؟؟؟؟
بگذريم ابتدا کد ين برنامه که در سه صفحه مجزا بيد نوشته بشه

صفحه اول که من اون رو تو فيلي به نام encod.php ذخيره مي کنم

<?php
function get_rnd_iv($iv_len){
$iv = '';
while ($iv_len-- > 0) {
$iv .= chr(mt_rand() & 0xff);
}
return $iv;
}
function md5_encrypt($plain_text, $password, $iv_len = 16){
$plain_text .= "\x13\";
$n = strlen($plain_text);
if ($n % 16) $plain_text .= str_repeat(\"\0\", 16 - ($n % 16));
$i = 0;
$enc_text = get_rnd_iv($iv_len);
$iv = substr($password ^ $enc_text, 0, 512);
while ($i < $n) {
$block = substr($plain_text, $i, 16) ^ pack('H*', md5($iv));
$enc_text .= $block;
$iv = substr($block . $iv, 0, 512) ^ $password;
$i += 16;
}
return base64_encode($enc_text);
}
function md5_decrypt($enc_text, $password, $iv_len = 16){
$enc_text = base64_decode($enc_text);
$n = strlen($enc_text);
$i = $iv_len;
$plain_text = '';
$iv = substr($password ^ substr($enc_text, 0, $iv_len), 0, 512);
while ($i < $n) {
$block = substr($enc_text, $i, 16);
$plain_text .= $block ^ pack('H*', md5($iv));
$iv = substr($block . $iv, 0, 512) ^ $password;
$i += 16;
}
return preg_replace('/\\x13\\x00*$/', '', $plain_text);
}
?>

صفحه دوم که مربوط به تولید تصویر و من اونو تو فایلی به نام image.php ذخیره می کنمش

<?php
require_once "encode.php\";
$decid = urldecode(md5_decrypt($_REQUEST['id'], $_REQUEST['key']));

header(\"Content-type: image/png\");
$img = imagecreatetruecolor(75, 25);
$black = imagecolorallocate($img, 0, 0, 0);
$red = imagecolorallocate($img, 236, 134, 72);
$bgline = imagecolorallocate($img, 81, 102, 125);
$bg = imagecolorallocate($img, 131, 152, 175);
imagefill($img, 0, 0, $bg);

imageline($img,0,6,75,6,$bgline);
imageline($img,0,12,75,12,$bgline);
imageline($img,0,18,75,18,$bgline);

imageline($img,7,0,7,25,$bgline);
imageline($img,14,0,14,25,$bgline);
imageline($img,21,0,21,25,$bgline);
imageline($img,28,0,28,25,$bgline);
imageline($img,35,0,35,25,$bgline);
imageline($img,42,0,42,25,$bgline);
imageline($img,49,0,49,25,$bgline);
imageline($img,56,0,56,25,$bgline);
imageline($img,63,0,63,25,$bgline);
imageline($img,70,0,70,25,$bgline);

imageline($img,3,6,70,18,$red);
imagestring($img, 5, 5, 5, $decid, $black);
//imagettftext($img,20,0,10,20,$brown,\"/path/arial.ttf\",$decid);
imagepng($img, '', 75);
imagedestroy($img);
?>

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

<?php
require_once "encode.php\";
$string = md5(rand(0, microtime()*1000000));
$verify_string = substr($string, 3, 7);
$key = md5(rand(0,999));
$encid = urlencode(md5_encrypt($verify_string, $key));
echo \"<img src='image.php?id=$encid&key=$key'><br>\";
echo \"to verify the user would hve to type in $verify_string\";
?>

خوب بریم سراغ توضیحات این کدها:

نمی دونم از md5 چیزی میدونین یا نه به هر حال امیدوارم که بدونین چون این مقاله هدفش توضیح چیز دیگریست ولی اگر مشکلی در فهم کلی قسمت encode.php داشتید برایم پیغام بگذارید تا اگر فرصت شد برایتان md5 را توضیح بدم .

ساختار برنامه به این صورت است که ابتدا قطعه کد سومی که برایتان نوشتم میاد و یک رشته رندم و همچنین یک کلید رندم تولید می کنه نام ایندو به ترتیب string$ و key$ هست که روی همرفته چیز خفنی از کار دراومد و چون میخواستم مثلا امنیت بالایی داشته باشه به این شکل عمل کردم که ایندو مقدار رو با اندکی سیخونک به فایل image.php ارسال کردم حالا همین یه تیکه رو براتون توضیح می دم:

ببینید خیلی سادست تو خط سوم مقدار string$ رو برابر با ام دی فایو مقداری رندم بین صفر تا ثانیه قرار میدهم بعد verify_string$ رو برابر با کاراکترهای سوم تا دهم مقدار string$ قرار میدم و همچنین یک مقدار رندم بین صفر تا 999 تولید می کنم و در key$ قرارش می دیم همونطوری که می بینید در خط ششم مقدار urlencode شده md5_encrypt ایندو مقدار بالا رو در encid$ قرار میده به دلیل پیچیدگی الگوریتم استفاده شده در فایل encode.php از توضیح آن قسمت ها صرفه نظر کردم تا برای مبتدیان زیاد پیچیده نشود نهایتا ما این مقادیر رو همونطوری که میبینید در خط هفتم به فایل image.php می فرستیم تا عکس ما را با مقدار verify_string$ در داخل تصویر تولید کند.

خوب حالا ماهم با این مقادیر میریم به فایل image.php

خوب هرچی کد خفن تولید کرده بودیم به حالت پیش از کد شدن تبدیل می کنیم تا مقدار ما تحت امنیت کامل به درون تصویر منتقل شود در واقع این همه کد گذاری برای انتقال امن داده ها به درون فایل image.php بوده است

همونطوری که به راحتی از قطعه کد دوم مشخص است با توابعی تصویری را تولید می کنم و برای اینکه تصویر زیاد ساده نباشد یک پس زمینه مربعی و یک خط نارنجی رو کاراکترهای امنیتی می کشم در یک خط اضافی هم کدی رو نوشتم که شما با استفاده از اون می تونید حتا فونت نوشته ها رو در تصویرتون تغییر بدید فقط قسمت /path/ رو باید با مسیر فونت عوض کنید ولی من برای راحتی بیشتر از تابع imagestring استفاده کردم

پیشنهاد اکید این کمترین بر همه شما دوستان بزرگوار این است که به دنبال حفظ کردن این کدها و استفاده طوطی وار از آنها نباشید این مقالات باید بهانه برایتان باشند تا شما را به دنبال یادگیر مابقی توابع مرتبط و استفاده از آنها مجاب کنند مثلا خیلی خوب است که manual پی اچ پی رو باز کنید و لغت image رو سرچ کنید وتوابع کامل تصاویر رو ببینید و از آنها استفاده کنید. به همین دلیل است که من هیچ وقت در مقالاتم کد آماده و یک تکه از برنامه قرار نمی دم مگر آنکه توضیح الگوریتم هایی که استفاده کردم وقت گیر و دشوار باشد.

تا مقاله بعد حق یارتان باد

رامین فرمانی زمستان 83

ramin.farmani@gmail.com
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
خصوصيات يك سرور خوب براي شما كه PHP كار هستيد

من در چند روز اخير براي نصب يك برنامه بر روي وب سايت خودم مشكلات زيادي با شركت ارائه دهنده خدمات هاستينگم پيدا كردم و به اين نتيجه رسيدم كه اي كاش قبل از بستن قرارداد با اين شركت شرايط آنها را به دقت بررسي مي كردم، بعد مقاله اي خواندم در مورد اين كه چگونه يك شركت ارائه دهنده خدمات هاستينگ خوب بر اساس نيازهايمان پيدا كنيم، من هم بد نديدم اين مقاله رو ترجمه كنم و در اختيار شما قرار بدم.
PHP و به طور عام LAMP كه تركيبي از Linux, Apache, MySQL و PHP/Perl/Python در سطح بسيار گسترده اي توسط شركتهاي هاستينگ و با قيمتهاي مناسب ارائه مي شود، شما خيلي آسون مي تونيد با چيزي كمتر از ماهيانه 3 هزار تومان سرويسي رو در اختيار بگيريد كه 90 درصد احتياجات شما رو برطرف كنه، اما مسلما در تمام سرويسهاي ارائه شده امكانات PHP اي كه در اختيار شما قرار مي گيرند يكسان نيستند و تا حد بسيار زيادي به تنظيمات فايل php.ini و همچنين extension هاي نصب شده بستگي دارد پس يك انتخاب خوب مي تونه شما رو از شر دردسرهاي احتمالي در آينده نجات بده!
علاوه بر توجه به اين موارد دونستن اينكه آيا admin شما به تمام سوالات و مشكلات شما پاسخ مي ده و يا اينكه ازآيا سواد كافي برخورداره هم بسيار مهم هستند و شما مي تونيد اين اطلاعات رو از مشتريان قبلي سرويس دهنده به دست بياريد، خوب حالا به موارد عمومي اي كه شما بايد هنگام خريد دقت كنيد مي پردازم:

تركيبي از PHP و Apache 1.3
از ديدگاه كارايي و مطمئن بودن اين زوج بهترين تركيب را به دست مي دهند، از سرويسهايي كه از Apache 2.x استفاده مي كنند بپرهيزيد، با توجه به تمام كارايي و قدرت Apache 2 اين نسخه هنوز براي كار با PHP به طور كامل آماده نشده، همچنين ازمدير سايت بخواهيد كه توزيع لينوكس نصب شده بر روي هاست رو به شما اطلاع دهد، هر چي بيشتر بدونيد كه با چه نرم افزارهايي سروكار داريد بهتره

آيا اجازه دسترسي SSH به سرور در اختيار شما قرار مي گيرد؟
SSH يك ارتباط امن به سرور رو براي شما فراهم مي كند كه با استفاده از اون مي تونيد كارهاي مختلفي رو با استفاده از command line لينوكس و يا SCP ( كپي امن) انجام بديد، از هر هاستي كه به شما اجازه دسترسي از طريق telnet رو ميده پرهيز كنيد، براي كاربران ويندوز Putty[1] مي تونه يك محيط command line عالي رو روي SSH به وجود بياره، همچنين WinSCP[2] مكانيزم امني رو براي انتقال فايلها روي SSH فراهم مي كنه، اصلا از FTP استفاده نكنيد چون به اندازه telnet ناامنه!

هاست يك Reseller است يا اينكه خودشون سرور رو نگه داري مي كنن؟
اين مهمه كه شركت ارائه دهنده خدمات يك reseller است يا نه، اگر reseller باشد درست است كه در موارد پيش پا افتاده و يا گاها اندكي پيچيده فقط و فقط با راهنمايي مي توانند شما رو كمك كنند اما در واقع سطح دسترسي اونا در همون حد شماست و نه بيشتر!

ميزان Overload سرور
بعضي از شركتها خيلي بيشتر از تعداد ماكزيمي كه نسيت به سيستم در اختارشون مي تونن سرويس ارائه بدن، account مي دن و اين يعني پايين اومدن كارآيي، بهترين مقياس اجراي دستور uptime است ( اينجاست كه حق دسترسي به SSH معني پيدا مي كنه )، اين دستور به شما مقدار ميانگين Load سرويس رو ميگه؛ در حالت ايده آل سرويس هرگز نبايد ميانگين load بالاي 1 دقيقه داشته باشد، ولي هر وقت كه مشاهده كرديد اين زمان با بالاي 5 دقيقه رسيده است، منتظر ايجاد وقفه در اجراي برنامه هاي PHP خود باشيد

سياست شركت براي command line ها چيست؟
مسلما دستور MYSQLDump روشي مطمئن براي Backup گيري فراهم مي كنه، ولي بعضي از شركتها دستورهايي كه بيشتر از يك زمان مشخص اجراي اونها طول بكشه رو به طور خودكار kill مي كنن

و در نهايت ببينيد كه آيا شركت اجازه دسترسي به corn كه يك ابزار UNIX براي مديريت كارهاي batch است رو در اختيار شما قرار مي ده

حالا به مواردي مي پردازيم كه مربوط به PHP هستند:

آيا شما مي توانيد خروجي تابع phpinfo را مشاهده كنيد؟
ممكن است بعضي از هاستها ادعا كنند كه اين يك شكاف امنيتي است اما هاستهاي حرفه اي مي دانند كه امنيت همراه با ابهام [Security by obscurity] هرگز نمي تواند جايگزين امنيت واقعي شود، اطلاعاتي كه توسط phpinfo در اختيار شما قرار داده مي شه هيچ مشكلي رو براي هاستي كه با استفاده از لينوكس، آپاچي و قايروالها به خوبي تنظيم شده ايجاد نمي كنه.

آيا PHP به صورت يك ماژول نصب شده است؟
از لحاظ كارآيي اين نوع نصب به مراتب بهتر از CGI است.

آيا تنظيم Allowoverride در Apache به درستي تنظيم شده است؟
اين تنظيم، اين قابليت رو به شما مي ده كه با استفاده از فايل .htaccess تنظيمات php.ini رو تحت تاثير قرار بدين.

آيا Safe Mode غير فعال شده است؟
safe_mode در فايل php.ini از لحاظ تئوري كاربران را از اجراي دستورات و يا توابع مشخصي كه با بحث امنيت در ارتباط هستند منع مي كند، در واقع safe_mode چيزي نيست جز يك دردسر بزرگ وقتي كه بخواهيد با PHP كارهاي جدي انجام بدهيد!

سياست شركت در قبال اطلاع رساني به شما هنگام ايجاد تغييرات چيست؟
كم نيستند شركتهايي كه به يكباره تنظيمات php.ini را تغيير مي دهند و مثلا register_globals رو مرتبا روشن و خاموش مي كنن.

از PHP Extensions نصب شده آگاهي بيابيد.
از هاست بخواهيد كه اكستنشنهاي نصب شده را به شما اطلاع دهد و توجه داشته باشيد كه اكستنشن XSLT حتما نصب شده باشد و همچنين اطمينان حاصل كنيد كه اين اكستنشنها هميشه در دسترس خواهند بود.

و در نهايت ميزان اطلاعات شركت رو نسبت به PHP بسنجيد، مسلما شما از اونها توقع نداريد كه برنامه هاي كامل با استفاده از PHP بنويسن اما اگر اونها تا حدودي با PHP آشنا باشند نيازهاي شما را بهتر درك مي كنند

[1] http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
[2] http://winscp.sourceforge.net/eng

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نصب و تنظیم | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
آشنايي با SimpleXML

نويسنده: Sterling Hughes
اين نوشته از سايت zend.com گرفته شده است و از سري مقالاتي است كه نويسنده هر extension خود به معرفي قابليتها و امكانات extension پرداخته و چه چيز بهتر از اين! براي اين كه ترجمه لفظ به لفظ باشد در بعضي از موارد بعضي از عبارات مورد نظر نويسنده اصلي درون [] قرار گرفته اند تا در عين سادگي متن اصلي حفظ شود.

هنگامي كه مردم از من مي پرسند SimpleXML چيست من به كنايه به آنها مي گويم كه : XML راه حلي براي تمام مشكلات ماست و SimpleXML به ما اطمينان مي دهد كه XML ريشه تمام مشكلات ما نخواهد بود!
بعضي از شما كه با PHP 4 به پردازش XML پرداخته ايد و يا در حال حاضر اين كار را انجام مي دهيد، مي دانيد كه براستي handle كردن متون XML با هر درجه پيچيدگي كه داشته باشند مي تواند تا چه اندازه عذاب آور باشد، شما يا نياز به استفاده از SAX داريد و براي هر متن XML نياز داريد تا يك مفسر جداگانه بنويسيد و يا اينكه از DOM استفاده كنيد ( به علاوه تمايل اين روش به سقوط [crash]، نشت [leak] و همچنين درست عمل نكردن در شرايط استفاده سنگين ) بايد درد و رنج استفاده از يك API كه براي كار با برنامه هاي به شدت OO و كوچكترين خصوصيات XML نوشته شده را به جان بخريد.
قطعه كد XML زير را كه در آن دو كتاب در فرمت XML معرفي شده اند در نظر بگيريد، اين كد يك گره ريشه به نام library دارد با يك فرزند مستقيم [Direct Child] به نام shelf كه كتابها را در قسمت fiction كلاسه بندي مي كند، اين shelf دو كتاب را معرفي مي كند: موشها و آدمها از جان اشتاين بك و هري پاتر و سنگ فيلسوفان از جي.كي رولينگ ( توضيحات مفصل اين كد براي اين آمده است تا كساني كه به درستي با XML آشنايي ندارند هم تا حدودي متوجه بحث شوند ):

<?xml version="1.0\"?>
  <library>
   <shelf id=\"fiction\">
    <book>
     <title>Of Mice and Men</title>
     <author>John Steinbeck</author>
    </book>
    <book>
     <title>Harry Potter and the Philosopher's Stone</title>
     <author>J.K. Rowling</author>
    </book>
   </shelf>
  </library>

كد بالا به [حد كافي] ساده است: شما مي توانيد ساختار كلي را به وضوح مشاهده كنيد و همچنين شما مي توانيد راهي را كه براي دريافت اطلاعات از اين كد لازم است به راحتي به دست آوريد و آن را دنبال كنيد.
خوب حالا قبل از اينكه ببينيم كار ما با استفاده از SimpleXML تا چه حد ساده مي شود بگذاريد به پردازش اين كد با استفاده از DOM بپردازيم:

<?php
  $doc = new domDocument();
  $doc->load('library.xml');

  $library = $doc->documentElement;
  $shelves = $library->childNodes;

  foreach ($shelves as $shelf) {
     if ($shelf instanceof domElement) {
          process_shelf($shelf);
     }
  }

  function process_shelf($shelf)
  {
      printf("Shelf %s\n\", $shelf->getAttribute('id'));

      $books = $shelf->childNodes;
      foreach ($books as $book) {
          if ($book instanceof domElement) {
              process_book($book);
          }
      }
  }

  function process_book($book)
  {
      foreach ($book->childNodes as $child) {
          if (! ($child instanceof domElement)) {
              continue;
          }

          foreach($child->childNodes as $element) {
              $content = trim($element->nodeValue);

              switch ($child->tagName) {
              case 'title':
                  printf(\"Title: %s\n\", $content);
                  break;
              case 'author':
                  printf(\"Author: %s\n\", $content);
                  break;

              }
          }
      }
  }
  ?>

همانطور كه مي بينيد اين كار بدون داشتن يك error handler با يك كد كاملا بهينه سازي شده 47 خط شده است. با استفاده از يك error handler و گذاشتن comment و يا ساير اطلاعات مورد نياز در اين برنامه طول آن به راحتي به 70 الي 80 خط مي رسد. خوب حالا مي خواهيم كار بالا را با استفاده از SimpleXML انجام دهيم به گونه اي كه خروجي كاملا مشابه با كد بالا باشد:

<?php
  $library = simplexml_load_file('library.xml');
  foreach ($library->shelf as $shelf) {
      printf("Shelf %s\n\", $shelf['id']);
      foreach ($shelf->book as $book) {
          printf(\"Title: %s\n\", $book->title);
          printf(\"Author: %s\n\", $book->author);
      }
  }
  ?>

با استفاده از SimpleXML نام عناصر به صورت خودكار به خصوصيات [Properties] يك شيء نسبت داده مي شود و اين كار به صورت بازگشتي صورت مي گيرد و آنگاه با استفاده از Iterator اين كارها مرتبا انجام مي گيرند تا تمام موارد موجود در متن به دست بيايند. همه اين كارها در لحظه تقاضا [On-demand] با استفاده از Zend Engine 2 صورت مي گيرند، روش كم چربي SimpleXML در تفسير كد، 47 خط مورد نياز براي تفسير با DOM را به حدود 10 خط رساند! در ثاني كد نوشته شده تا حد بسيار زيادي خواناتر و قابل فهم تر نوشته شده است.
در يك دنياي عالي و بي عيب و نقص تمامي متون XML و اطلاعاتي كه شما نياز داريد تا از آنها خارج كنيد بايد به همين سادگي مثال بالا باشند، در واقع در بسياري از موارد اين امر صحيح است اما در بعضي از موارد خاص روند نوشته شده در بالا جوابگو نيست.
يك مورد كه SimpleXML با آن مواجه است Namespace ها مي باشند، متون XML به شما امكان مي دهند تا تگها را درون قسمتهاي مشخصي به نام namespace ها بريزيد، SimpleXML اين كار را با استفاده از اضافه كردن يك لايه ديگر به متن حل مي كند:

<?xml version="1.0\"?>
  <entries xmlns:blog=\"http://www.edwardbear.org/serendipity/\">
   <blog:entry>
    <blog:name>RPROF – Regular Expression Profiler</blog:name>
   </blog:entry>
   <blog:entry>
    <blog:name>Advanced PHP Programming</blog:name>
   </blog:entry>
  </entries>

براي به دست آوردن و نمايش دادن تمام اقلام مربوط به blog شما مي توانيد از كد زير استفاده كنيد:

<?php
  $entries = simplexml_load_file('syndic.xml');
  foreach ($entries->blog->entry as $entry) {
      printf("%s\n\", $entry->name);
  }
  ?>

اين راه حل روشي بود براي بهبود سادگي و بي تكلفي در پردازش متون XML. نكته اي كه بايد درمورد namespace ها در XML‌بدانيم اين است كه qualified name كه در اين مثال منظور ما همان blog است تنها يك شناسه است و هيچ رابطه خاصي را ايجاد نمي كند، براي شما كه مي خواهيد به پردازش متون XML بپردازيد منبع اصلي جايي نيست جز اينجا[1].
بنابراين روشي كه SimpleXML براي پردازش متون با چند namespace به كار مي برد هيچ تغييري در روشي كه شما به اين متون دسترسي داريد ايجاد نمي كند، اما به جاي اينكه دو متد children و attributes را در اختيار شما قرار دهد، تابع children تمامي children هاي موجود در گره هاي XML موجود در يك namespace را بر مي گرداند، اگر هيچ namespace اي براي تابع children برگردانده نشود آنگاه تمام عناصر در namespace كلي [global] برگردانده مي شوند.
مثال بالا با استفاده از كد زير به خوبي و آساني تفسير مي شود:

<?php
  $entries = simplexml_load_file('syndic.xml');
  foreach ($entries->children('http://www.edwardbear.org/serendipity/') as $entry) {
      printf("%s\n\", $entry->name);
  }
  ?>

اما مشكلي كه در SimpleXML وجود دارد اين است كه هرچند يك الگوريتم عالي براي تفسير يك متن در اختيار قرار مي دهد هيچ امكاني براي انجام كارهاي معمولي از قبيل جستجو در متن ندارد، براي مثال چگونه مي توان به تمام اولاد يك گره دسترسي پيدا كرد و يا چگونه مي توان يك متن را براي پيدا كردن عبارتهاي برقرار با شرط جستجو كرد؟ خيلي از كارهاي معمول با فايلهاي XML وجود دارند كه هنوز بايد ساده شوند.
به عنوان راه حلي براي اين مشكلها SimpleXML دوباره كاري نكرده است و متود xpath را در اختيار شما قرار داده است كه به شما اجازه مي دهد پرس و جوي هاي استاندارد W3C را روي يك متن XML انجام دهيد، مشكل دسترسي به تمام اولاد يك گره با استفاده از كوئري //children در xpath ممكن است، هر چند قصد دارم در مقاله اي جداگانه به طور كامل به معرفي xpath بپردازم اما به شما توصيه مي كنم كه حتما و با جديت اين بحث را ادامه دهيد زيرا xpath براي XML همان قدر اهميت دارد كه Regular Expressions براي متون ساده.
هر چند كه SimpleXML يك ابزار عالي براي تفسير متون XML در اختيار شما قرار مي دهد اما خالي از اشكال هم نيست، يكي از مهمترين اين اشكالات تفسير متوني است كه در آنها XML و متن با هم حضور دارند، براي مثال:

<?xml version="1.0\"?>
  <flaw>
    <blurb>
      This <italic>is</italic> some sample <bold>text</bold> where
      SimpleXML <underline>will</underline> not behave well.
    </blurb>
  </flaw>

انتساب دادن $document->blurb به توابعي مثل print_r ويا var_dump مواردي مثل italic, bold و underline را برمي گرداند و نه متن موجود در مثال بالا را و اين به اين دليل است كه هرگاه به SimpleXML اين حق انتخاب داده مي شود كه بين متن و عناصر يكي را انتخاب كند، SimpleXML عناصر را انتخاب مي كند.
SimpleXML براي حل اين مشكل دو راه حل در كتابخانه همراه خود دارد، اول asXML كه يك گره را گرفته و متون موجود در آن و همچنين متون موجود در children باز مي گرداند، به طوري كه اگر شما در مثال بالا از $document->blob->asXML() استفاده كنيد متن با يك فرمت مناسب براي چاپ باز گردانده مي شود.
راه حل دوم اين است كه شما خروجي SimpleXML را به عنوان يك شي در اختيار DOM قرار دهيد.

[1] http://www.edwardbear.org/serendipity/

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
آشنايي با PEAR

كار با PEAR
PEAR يا PHP Extension and Application Repository متعلق به Stig Bakken است كه از CPAN متعلق به Perl الهام گرفته. به عنوان يك پروژه در سال 1999 آغاز به كار كرد و نخستين نسخه پايدار آن در ژانويه 2003 آماده شد، اين پروژه دو هدف عمده داشت، نخست فراهم نمودن كتابخانه اي از كلاسهاي PHP براي حل مشكلات معمولي و ديگري تحت عنوان PECL يا PHP Extension Code Library براي فراهم نمودن توسعه هايي براي PHP كه در كد اصلي PHP قرار ندارند و بيشتر به حواشي كار با PHP مي پردازد. در اين جا مقصود اصلي همان PEAR در معناي پوشش هدف نخست مي باشد. تمام كساني كه در كار نوشتن كدهاي PEAR مي پردازند به صورت كاملا داوطلبانه اين عمل را انجام مي دهند، هنگامي كه اولين نسخه پايدار PEAR آماده شد توجه بيشتري را از جانب جامعه PHP كار به دنبال داشت، اما هنوز كار بسيار زيادي بايد انجام شود تا PEAR كامل شود، اعمالي كه مهمترين آنها تهيه راهنماها و متون هر يك از اين برنامه ها مي باشد، اما خوب PEAR تا همين حالا هم كار را براي نوشتن برنامه هاي PHP تا حد بسيار زيادي آسان كرده است، نكته قابل توجه در مورد PEAR اين است كه بايد PEAR را در سطح ساختي برنامه دانست و نه يك Hotscript، در واقع هيچكدام از برنامه هاي PEAR يك برنامه كامل نيستند بلكه هر كدام تكه كدي هستند كه مي توانند در برنامه هاي زياد و با اهداف گوناگون مورد استفاده قرار بگيرند.
نكته مورد توجه ديگر اين است كه بسته هاي PEAR تا حد مثلا كلاسهاي جاوا با هم متحد نيستند، مثلا اگر شما با استفاده از PEAR::HTML_QuickForm يك فرم ساختيد براي معتبر سازي اطلاعات دريافتي مي توانيد از PEAR::Validate استفاده كنيد، اما اگر شما در حال كار بر روي يك پروژه بزرگ و مهم هستيد و تاييد صحت اين اطلاعات حياتي مي باشند، بهتر است كمي به خودتان زحمت بدهيد و كدهاي مربوط را خودتان بنويسيد.
و فقط يك نكته ديگر: PEAR هم ممكن است به كل بسته هاي موجود در پروژه اطلاق شود و هم به برنامه ي Package Manager همراه با اين پروژه.

نصب PEAR
قدم اول اين است كه ببينيد آيا شما مي توانيد PHP را از طريق command line اجرا كنيد البته در اكثر موارد اين امر درست است، براي يك سيستم مبتني بر UNIX:

/usr/local/bin/php /home/username/scripts/my_script.php

و در يك سيستم مبتني بر ويندوز:

c:\php\php.exe c:\scripts\my_script.php

اگر شما از PHP 4.3 در يك سيستم مايكروسافتي استفاده مي كنيد بهتر است كه از فايل php.exe كه در زير شاخه cli در شاخه اصلي نصب PHP موجود است استفاده كنيد چون اين فايل با فايل php.exe كه وب سرور مورد استفاده قرار مي دهد تا حدودي فرق مي كند.
توجه كنيد كه با مقدار اندكي تغيير در ساختار PATH سيستم خود مي توانيد خطوط بالاتر را ساده تر كنيد!
سپس با استفاده از مرورگر وب خود به آدرس http://pear.php.net/go-pear برويد، در اين صفحه شما يك تكه كد PHP را مشاهده مي كنيد كه براي نصب PEAR Package Manager مورد استفاده قرار مي گيرد، اين كد را كپي كنيد و سپس در يك فايل ديگر پيست كنيد ( توجه كنيد كه اين فايل را ذخيره نكنيد و يا اگر ذخيره مي كنيد تگهاي
 و
را از ابتدا و انتهاي آن حذف كنيد )، بهتر است نام فايل را go-pear.php بگذاريد كه بعدا در پيدا كردن آن راحت باشيد.
حالا شما دو راه براي نصب PEAR در پيش رو داريد، اول اينكه اين فايل را در شاخه اصلي Web Server خود ذخيره كنيد و آنرا به عنوان يك صفحه وب در نظر بگيريد و اجرا كنيد، اين روش به صورت آزمايشي در حال اجراست و هيچ تضميني نيست كه با استفاده از اين روش همه چيز درست نصب شود و در آينده براي شما هيچ مشكلي پيش نيايد و اما روش بهتر اين است كه آنرا در شاخه pear ذخيره كنيد و با استفاده از command line آنرا نصب كنيد، در يك سيستم يونيكسي:

/usr/local/bin/php /home/username/pear/go-pear.php

و در يك سيستم مايكروسافتي:

c:\php\cli\php c:\pear\go-pear.php

اين كار يك رابط تعاملي مبتني بر command line را به راه مي اندازد كه از شما سوالاتي را در مورد چگونگي نصب PEAR مي پرسد. توجه داشته باشيد كه prefix$ شاخه اي كه در آن مي خواهيد PEAR و همچنين تمامي بسته هاي بعدي نصب شوند را مشخص مي كند و php_dir$ مسير نصب شده PHP را مشخص مي كند.
هنگامي كه تنظيمات را انجام داديد آنگاه go-pear.php به وب سايت PEAR متصل مي شود و تمامي بسته هاي مورد نياز براي نصب Package Manager را داونلود مي كند، تمامي بسته ها در زير شاخه PEAR در شاخه اي كه آن را در تنظيمات مشخص كرده ايد نصب مي شوند، يعني اگر بر طبق اين راهنما عمل كرده باشيد در:

/home/username/pear/pear {UNIX Systems}
c:\pear\pear                       {Windows Systems}

حالا اگر شما اجازه دهيد PEAR اقدام به تغيير include_path در فايل php.ini مي كند.
سرانجام براي استفاده از PEAR Package Manager در command line نياز به تنظيم يك سري از متغيرهاي محيطي داريد در سيستمهاي مايكروسافتي اين كار به سادگي و از طريق كليك بر روي فايل PEAR_ENV.reg امكان پذير است، كاربران يونيكسي مي توانند با تغيير در profile. كاري كنند كه در هر بار log in تغييرات لازم صورت گيرد

# Envinment variables
export PHP_PEAR_SYSCONF_DIR=/home/username/pear
export PHP_PEAR_INSTALL_DIR=/home/username/pear/pear
export PHP_PEAR_DOC_DIR=/home/username/pear/pear/docs
export PHP_PEAR_BIN_DIR=/home/username/pear
export PHP_PEAR_DATA_DIR=/home/username/pear/pear/data
export PHP_PEAR_TEST_DIR=/home/username/pear/pear/tests
export PHP_PEAR_PHP_BIN=/usr/local/bin/php

حالا اگر مي خواهيد PEAR را در PATH سيستم خود قرار دهيد تا استفاده از PEAR Packge Manager آسانتر باشد.

كار PEAR Package Manager
خوب حالا فرض مي كنيم كه شما PEAR را به درستي نصب كرده ايد، اكنون شما مي توانيد به نصب بسته هاي مورد نظر خود از طريق PEAR Package Manager بپردازيد، در command line تايپ كنيد:

pear install HTML_Common

كه اين دستور شروع به نصب بسته HTML_Common از وب سايت PEAR مي كند، بديهي است در هنگام استفاده از اين دستور شما بايد به اينترنت متصل باشيد.
PEAR Package Manager از XML_RPC براي برقراري ارتباط با سايت PEAR استفاده مي كند، اگر شما از يك Proxy Server استفاده مي كنيد بايد با استفاده از

pear config-set http_proxy proxy.your-isp.com

اين مورد را به اطلاع PEAR برسانيد و هرگاه از پروكسي سرور خارج شديد مي توانيد به سادگي با استفاده از

pear config-set http_proxy \"\"

اين تنظيم را خنثي كنيد.
حالا براي نصب HTML_QuickForm مي توانيد از دستور

pear install HTML_QuickForm

استفاده كنيد و هرگاه خواستيد به آخرين نسخه آن ارتقاء يابيد از دستور

pear upgrade HTML_QuickForm

استفاده كنيد.
براي دريافت ليستي از تمام دستورهاي PEAR به سادگي فقط تايپ كنيد pear.
حالا اگر شما احساس خوبي نسبت به command line نداريد ( به نظر من كه اگر از سيستمهاي مايكروسافتي استفاده مي كنيد، تجربه بسيار خوبي براي شما خواهد بود ) مي توانيد از يك رابط آزمايشي مبتني بر وب استفاده كنيد ( همانطور كه مي توانيد از يك رابط آزمايشي مبتني بر PHP-GTK استفاده كنيد )، براي استفاده از آن شما نياز داريد كه ابتدا با استفاده از command line آنرا نصب كنيد ( توجه داشته باشيد كه اگر شما در ابتدا go-pear.php را از طريق وب اجرا كرده ايد اين برنامه همين حالا براي شما نصب شده است )، دستورات لازم اينها هستند:

pear install Net_UserAgent_Detect
pear install Pager
pear install HTML_Template_IT
pear install PEAR_Frontend_Web

توجه داشته باشيد كه 3 بسته اول براي نصب PEAR_Frontend_Web لازم هستند، هنگامي كه عمليات نصب تمام شد با استفاده از اسكريپت زير مي توانيد به راحتي به آن دسترسي پيدا كنيد:

<?php
// Optional if include path not set
# ini_set('include_path', 'c:\htdocs\PEAR');
require_once 'PEAR.php';
// For Windows users
# $pear_user_config = 'c:\windows\pear.ini';
// For Unix users
$pear_user_config = '/home/username/pear/pear/PEAR/pear.conf';
$useDHTML = TRUE; // Switch off for older browsers
require_once 'PEAR/WebInstaller.php';
?>

نصب بسته ها به صورت دستي
همچنين شما مي توانيد بسته ها را به صورت دستي نصب كنيد ( هر چند اين روش محتاج كار بيشتري است )، اما در اين روش شما بايد با دقت مسيرهاي include را بررسي كنيد، اول بايد يك شاخه بسازيد كه در آن تمام بسته ها را نصب كنيد، اين شاخه بايد در مسير include در فايل php.ini باشد، سپس بايد بسته اصلي PEAR را نصب كنيد http://pear.php.net/package/PEAR ، آخرين نسخه پايدار آنرا داونلود كنيد و آنرا در شاخه اي كه ساختيد extract كنيد، بنابراين فايل PEAR.php بايد در ريشه اين شاخه باشد. نصب بسته هاي بعدي تا حد بسيار زيادي مشابه همين روش است، اما شما بايد دقت كنيد كه فايلها را در چه شاخه اي extract كنيد، براي مثال در PEAR::DB فايل اصلي DB.php در ريشه و در كنار فايل pear.php قرار مي گيرد در حالي كه بقيه فايلها در زير شاخه DB، بهترين راه براي چك كردن اين موارد مطاله فايل package.xml است كه همراه هر بسته PEAR مي باشد، اين فايل يك عنصر به نام filelist دارد كه ليست تمام فايلهاي موجود در بسته را به همراه محلي كه بايد نصب شوند در اختيار شما قرار مي دهد.
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
Session ها و مفهوم آنها

قبل از اینکه این مقاله کوتاه را شروع کنم باید بگم که هدف من تنها یک گپ زدن ساده در مورد session هاست و این یعنی که من زمان زیادی را برای مرتب کردن افکارم و طبقه بندی چیزهایی که قراره بگم صرف نکردم، بنابر این در صورت دیدن هر گونه اشکال و یا خواستن توضیح بیشتر، به قول خارجی ها feel free to send me an email to bijan@hoomand.com .

خب، اصلا ببینم این همه میگن session، یعنی چی؟! اگر اون کتابهای ترجمه شده ایرونی مسخره را خونده باشید، میگن session یعنی جلسه. البته درست هم هست، session یکی از معناهاش جلسست، ولی باور کنید اصلا نمیشه به فارسی اونجور که باید ترجمش کرد، پس بذارید بگیم همون session! مثلا ببینید اگر قرار باشه من و شما یک جایی همدیگه را ببینیم و راجع به یک چیزی صحبت کنیم، وقتی که صحبتمون تموم شد و از هم جدا شدیم، شما مثلا به دوستتون میتونید بگید در اون session ای که با بیژن هومند داشتم فلان حرفهایی هم زدیم . اگر دوباره همدیگه را ببینیم میشه یک session جدید ! همون جلسه کم کم داره معنا میده، نه؟ ! ولی باور کنید نه! چون جلسه یک لغت خیلی خیلی رسمی هست تو فارسی، در صورتی که session اینطور نیست. به هر حال امیدوارم معنا را گرفته باشید !

خیلی خوب، حالا ببینیم تو کامپیوتر session به چه معناست . شما امروز صبح که کامپیوتر خودتون را روشن کنید و مثلا ۳ ساعت باهاش کار کنید و خاموشش کنید و بعد از ظهر دوباره برگردید، میتونید به log فایلهاتون سر بزنید تا تمام کارهایی که تو session قبل انجام دادید، یعنی تو ۳ ساعت صبح، را ببینید . یعنی اینکه شما هر وقت وارد یک سیستمی میشید یک session دارید با اون سیستم تا اینکه از اون سیستم خارج بشید .

خب، تو PHP هم قضیه عین همینه. فرض کنید من یک سایت دارم به اسم hoomand.com ، البته اگر این فرض را بکنید چندان هم فرض بیراهی نیست چون من واقعا این سایت را دارم. خب، شما از لحظه ای که تو browser قشنگتون مینویسید www.hooomand.com و وارد سایت من میشید، یک session را ایجاد میکنید، شما داخل هر صفحه ای که از سایت من بشید خب قطعا هنوز داخل سایت من هستید و این session هنوز پابرجاست تا اینکه خدای نکرده از سایتم خسته بشید و صفحه browser را ببندید که اونوقت دیگه session را تموم کردید و یا به عبارتی session destroy انجام دادید.

Session به چه درد یک برنامه نویس میخوره؟

تنها دلیلی که ما از session ها و یا روشهای مشابه استفاده می کنیم اینه که پروتوکل HTTP توانایی ذخیره هیچ چیزی را تو خودش نداره و مغزش از مغز یک دایناسور هم کوچیکتره! به اصطلاح فرنگی این پروتوکل stateless هست، یعنی چی؟ یعنی اگر شما یک صفحه وب داشته باشید به اسم bijanJoon.html و یکی از آمریکا تقاضای دیدن این صفحه را تو browser ش بده و یکی هم از ایران، سرور ما به هیچ عنوان متوجه نمیشه که الان در آن واحد این دو تقاضا داده شده و یا اینکه این ۲ تقاضا از ۲ جای مختلف داده شده و یا اینکه حالا وقتی این طرف تو آمریکا این صفحه را دید بعدش کجا رفته و کدوم صفحات را دیده. HTTP خیلی ساده عمل میکنه و به ازای هر request یک صفحه را به browser میفرسته. اینکار به خودی خود اشکالی نداره اگر ما نخواسته باشیم که مثلا به ازاء صفحات مختلفی که یک کاربر دیده یک پیغام و یا آگهی بهش نمایش بدیم و یا به عنوان مثال به ازاء کارهایی که تو صفحه a انجام داده، عمل مناسب را تو صفحه b براش انجام بدیم. تمام این مشکلات که گفتم در واقع به این برمیگرده که ما میخوایم یک سری متغیر را از لحظه ای که طرف session را ایجاد میکنه (وارد سایت میشه و صفحه اول را نگاه میکنه) درون صفحات مختلفی که اون بابا مشاهده میکنه حرکت بدیم و همیشه داشته باشیم. عین یک session واقعی در دنیای واقعی، وقتی که شما با من یک session سه ساعته دارید و داریم صحبت می کنیم، قطعا بعد از ۲ ساعت از شما توقع ندارم که مطالب دقیقه اول را فراموش کرده باشید ! حالا ببینیم که چه روشهایی برای انجام اینکار وجود داره.
خوب، قطعا برای شما اتفاق افتاده که خواسته باشید یک سری متغیر را از صفحه ای که توش هستید به یک صفحه دیگه انتقال بدید. یک روش برای انجام اینکار اینه که این متغیرها را از طریق query string و یا به عبارتی از طریق URL انتقال بدید، مثلا اینجوری:

www.hooomand.com/somePage.php?niceBoy=bijan&girlKillingSkillsRate=100000

خب، همونطور که میبینید من دو تا متغیر را دارم از طریق URL انتقال میدم، یکی niceBoy هست با مقدار bijan و اون یکی girlKillingSkillsRate که مقدار اون 100000 هست. خب، زیاد راجع به این بحث نمی کنم چون ارتباطی به session مون نداره ! یک روش دیگه برای انتقال داده از یک صفحه به صفحه دیگه قطعا استفاده از فرمها با متد POST هست (این query string که توضیح دادم در واقع همون فرمها با متد GET هستند دیگه!). در این روش شما متغیر هاتون را درون فیلدهای فرم قرار میدید، حالا اگر خواسته باشید تو صفحه کسی اونها را نبینه خب اونها را داخل فیلدهای hidden قرار میدید و action فرمتون را به اون صفحه دومی که میخواهید اطلاعات را توش بگیرید تغییر میدید .

روش دیگه ای که برای انتقال اطلاعات وجود داره استفاده از COOKIE هاست. در این روش شما اطلاعات خودتون را درون کامپیوتر کاربرتون ذخیره میکنید . ببینید هر browser ای یک شاخه داره که درون اون شاخه به Web Server اجازه داده میشه برای هر سایت یک فایل کوچیک (در حد 4KB اگر اشتباه نکنم) ایجاد کنه و متغیرهایی که برنامه نویس مشخص کرده در اونها ذخیره کنه. بنابر این با استفاده از کوکی ها شما میتونید متغیرهای سمت سرورتون را درون کامپیوتر خود طرف ذخیره کنید . به مثال زیر دقت کنید :
فرض کنید دو صفحه داریم به اسامی a.php و b.php که هر دو در یک شاخه قرار دارند. این محتوای فایل a.php هست :

<?PHP
setCookie(“niceBoy”, “bijan”);
?>

ما در این فایل متغیر niceBoy و مقدار اون را درون فایل کوکی ذخیره کردیم، یعنی الان این متغیر به همراه مقدارش درون کامپیوتر کاربر ذخیره شده و نه درون سرور. . حالا اگر در فایل b.php بنویسیم:

<?PHP
print $_COOKIE[“niceBoy”];
?>

همونی نمایش داده خواهد شد که شما انتظار دارید ! البته تابع setCookie متغیرهای دیگه ای هم قبول میکنه که بوسیله اونها میشه گفت این کوکی مربوط به چه سایتی هست تا سایتهای دیگه نتونن از کوکی ما استفاده کنن و به عبارتی امنیت بالاتر بره و همچنین میشه مشخص کرد که عمر یک متغیر کوکی ما چقدر باشه، مثلا ۱ ثانیه، ۱ ماه، ۱ سال و یا بیشتر. برای اینکار فایل a.php را به این صورت تغییر میدم :

<?PHP
setCookie(“niceBoy”, “bijan”, time() * 60 * 60 * 24);
?>

تابع setCookie مقدار زمان را بصورت ثانیه میگیره، بنابر این من با استفاده از تابع time() و ضرب اون در ۶۰ ثانیه (یک دقیقه) و ۶۰ دقیقه (یک ساعت) و ۲۴ ساعت (یک شبانه روز) تعریف می کنم که این متغیر تنها ۲۴ ساعت در کوکی ذخیره بشه .
خب، حالا مزایا و معایب کوکی ها چی هستند؟ از مزیتهاشون میشه به این اشاره کرد که ما اولا فضای سرور را الکی نمی گیریم و اطلاعات را درون کامپیوتر کاربر ذخیره می کنیم، بعلاوه اینکه میتونیم مشخص کنیم این اطلاعات چه مدت اونجا باشند . ولی باور کنید معایب این روش خیلی بیشتره ! اولین و بزرگترین مشکل کوکی ها مساله امنیت هست که شما در واقع دارید متغیرهاتون را درون کامپیوتر کاربر ذخیره می کنید و هر کس درون اون کامپیوتر میتونه با باز کردن فایل کوکی متغیرهای شما را مثل هلو ببینه ! مشکل بعدی ظرفیت کم این فایلها و مشکل دیگه ای هم که هست اینه که browser های قدیمی از cookie ها حمایت نمیکنن و browser های جدید هم این امکان را به کاربران میدن که به کل cookie هاشون را disable کنن. بنابر این میبینید که نمیتونیم یک سایت را به امید کوکی ها بسازیم، حال چه باید کرد؟ session ها البته عزیزان، استفاده از session ها دوای درد ماست!

SESSION ها یا همان COOKIE هایی که در سرور ذخیره میشوند !
بله، کل مطلب را در یک جمله رسوندم . Sessionها عین همون کوکی ها هستن با این تفاوت که در سرور ذخیره می شوند . شما همینکه وارد یک سایت می شوید که از session ها استفاده میکنه، این سایت برای شما یک فایل منحصر بفرد درون سرور درست میکنه که تمام اطلاعاتی که برنامه نویس سایت میخواد برای شما نگه داره درون اون فایل ذخیره میشه و شما به هر صفحه ای که برید برنامه نویس سایت میتونه درون اون صفحه اون فایل را صدا بزنه و متغیرهایی که تا بحال توشون ذخیره کرده (session جاری) را ازش بخونه. برای اینکه که تو یک صفحه مشخص کنید میخواید از session استفاده کنید باید تابع session_start() را در بالای صفحه و قبل از اینکه هیچگونه خروجی در صفحه تولید کنید، صدا بزنید . دقت کنید به حرفی که زدم، این تابع چون header تولید میکنه باید قبل از اینکه شما هیچ چیزی را تو صفحه print کنید صدا زده بشه، و اگرنه شما error دریافت میکنید و session شما فراخوانی نمیشه. حتی نباید قبل از فراخوانی این تابع یکدونه space هم تو صفحه print بشه. حالا من این حرف را اینجا زدم، بعدا می بینید که به علت کمی بی احتیاطی چند بار همچین error ای را دریافت میکنید و چند بار به علت فراموش کردن توصیه عمو بیژن از این و اون میپرسید چرا session من هی بهم error میده ! حتی بعضی از editor ها هستن که خودشون یک کاراکتر hex نامرئی اول صفحه مینویسن که خوب باعث میشه session کار نکنه و چون شما این کاراکتر را نمی بینید فکر میکنید همه چیز درسته ! در اینجور مواقع بهتره حتما فایلتون را با یک ادیتور hex باز کنید تا ببینید اوضاع از چه قراره . خیلی خب، خیلی حرف زدم، اجازه بدید همون فایل a.php را ایندفعه بوسیله session درست کنیم:

<?PHP
session_start();
$_SESSION[“aNiceBoy”] = “bijan”;
?>

اه اه اه اه، دیدین چقدر راحت بود؟ به همین سادگی، اولش مینویسین session_start() و بعدش هم در هر جای صفحه که بخواید متغیرهاتون را بوسیله آرایه superglobal ای که میبینید (آرایه $_SESSION) ایجاد می کنید . Superglobal را هم که میدونید قطعا یعنی چی؟ آرایه های superglobal در PHP مثل همینی که دیدید و یا آرایه $_POST و یا $_GET آرایه هایی هستند که در همه جای برنامه تون میتونید اشاره کنید بدون اینکه نیاز به تعریف اونها درون function هاتون و یا class هاتون داشته باشید . فرقش با global چیه؟ خب ببینید ما اگر یک متغیر مثلا $bijan به صورت global بخوایم درون یک تابع استفاده کنیم، در ابتدای تابع باید بنویسیم global $bijan تا تابع بفهمه که باید $bijan را از فضای global بیاره. ولی برای آرایه های superglobal همچین کاری لازم نیست، گرفتید؟ یک مساله دیگه هم که باز تاکید میکنم اینه که وقتی میخواید از session استفاده کنید بعد از باز کردن تگ php در بالای فایلتون حتما اولین چیزی که مینویسید قبل از فرستادن هیچگونه خروجی به browser همین تابع session_start() باشه. بعد از اینکه اینو نوشتید دیگه اشکال نداره هر خروجی که بخواید بفرستید و هر جا که خواستید با آرایه $_SESSION کار کنید.
خب، حالا یک نگاهی به فایل b.php میندازیم که میخواد از متغیرaNiceBoy ذخیره شده در session استفاده کنه:

<?PHP
session_start();
print “Girls love “ . $_SESSION[“aNiceBoy”];
?>

همینطور که میبینید ما اینجا باز هم تابع session_start() را اون بالا صدا زدیم، بنابر این هر جا که بخواید با session ها کار کنید، چه بخواید اونها را بسازید و یا ازشون استفاده کنید باید این تابع را اول بسم الله صدا بزنید . در ضمن فکر نکنید فقط میتونید متغیر های ساده را درون session ها ذخیره کنید، خیر، شما می تونید یک آرایه n بعدی و یا حتی خفن ترین object ای که فکرش را بکنید را هم خیلی راحت درون یک session ذخیره بکنید .

خب، حالا یک کم ریزتر به این session های عزیز نگاه میکنیم. بهتون گفتم که به ازاء هر شخص جدیدی که وارد یک سایت میشه، PHP یک فایل درون سرور براش در نظر میگیره که متغیرهاش را توش ذخیره میکنه . خب، حالا اگر این حقیقت را در نظر بگیریم که در آن واحد ممکنه هزاران نفر به یک سایت وصل باشند، بنابر این ما هزاران فایل هم داریم که برای هر connection و یا به عبارتی هر شخص (این جمله چندان درست نبود، ولی خب فعلا برای شما خوبه!) متغیرهای مربوط به اون را نگاهداری میکنه . خب، حالا سرور بیچاره از کجا بفهمه که کدوم فایل مال کیه؟ ! خیلی ساده، هر دفعه که یکی از این فایلهای session ساخته میشن، اسمشون را به browser کاربر میفرستن و کاربر به هر صفحه ای که میره این اسم را به سرور میفرسته تا server بفهمه که کدوم فایل مال این طرفه . فرض کنید من و حسن و علی در آن واحد به hoomand.com وصل شدیم و داریم صفحه homepage قشنگ اونو نگاه می کنیم . Server سه تا فایل برای ما درست کرده فرض کنید به همون اسمهای bijan و hasan و ali. و ما هر صفحه از سایت را که بخوایم نگاه کنیم اسم فایل مربوط به خودمون را هم به همراه آدرس صفحه به server میفرستیم تا server فایل مربوط به خودمون را برامون استفاده کنه . بنابر این من اگر بخوام صفحه yekchizi.php را ببینم، تو browser خودم تایپ میکنم : www.hooomand.com/yekchizi.php?sid=bijan تا session فایل خودم برام استفاده بشه . چی شد؟ بنابر این اگر علی نامرد هم بخواد server را گول بزنه و از محتوای session من استفاده کنه که ممکنه مثلا password ام توش ذخیره شده باشه خیلی راحت میتونه بجای اینکه اسم خودشو برای server بفرسته، از آدرس بالا استفاده کنه و اسم منو بفرسته؟ ! آره، میتونه ! خب، چیکار باید کرد؟ به نظر راهی غیر از این وجود نداره که اسم این فایلها بصورت random انتخاب بشه و حتی المقدور یک متغیر حرفی/عددی بزرگ random باشه که علی نامرد نتونه اسم فایل منو حدس بزنه، چطوره ؟ خب بدک نیست، ولی اگر علی جون بالای سرم وایستاده باشه وقتی که دارم آدرسم را تو browser م تایپ می کنم چی؟ خب، یک سری کلکهایی وجود داره که با چک کردن IP و از اینجور کارها جلوی طرف را گرفت، ولی باور کنید همه session ها قابل دزدیدن (hijack شدن) هستند و همه سیستم ها قابل hack و من هم قرار نیست در این مقاله کوتاه که صرفا جهت آشنایی شما با session هاست خیلی رو مطلب ریز بشم . بنابر این تا همینجا را ازم قبول کنید بعلاوه اینکه حالا من گفتم اون اسم فایل من از طریق query string به سرور فرستاده میشه، ولی معمولا اینطور نیست اگر شما کوکی هاتون فعال باشه و browser تون بتونه تو کوکی رایت کنه . در اینصورت این sid درون یک کوکی نوشته میشه و شما هیچوقت اونو نمیبینید و بصورت مخفی به سرور فرستاده میشه . البته خب این قضیه را همه میدونن و اگر یک hacker بخواد کاری بکنه خب این مطلب را هم در نظر میگیره ، ولی باز خوب کار براش سختتر میشه .

چه کارهایی میشه با SESSION ها انجام داد؟
قطعا تنها کاری که میشه با session ها انجام داد همون داشتن یک متغیر در طول کل عمر یک session و یا به عبارتی در تمام صفحاتیست که یک کاربر داره از اونها دیدن میکنه . ولی خب با همین مفهوم ساده خیلی کارها میشه کرد . به عنوان مثال تمام سیستمهای user/password ای که تو سایتها می بینید به همین روش ایجاد شدن . فرض کنید شما ۵ تا کاربر مختلف دارید بعلاوه یک صفحه خاص که می خواید ۲ تا از این کاربرها بتونن این صفحه را ببینن و ۳ تا نتونن. خب، همون لحظه ای که اینها نام کاربری و کلمه عبور خودشون را میزنن و شما میبینید که این اطلاعات درسته و در واقع اینها همونهایی هستند که باید باشن، برای اون دو کاربری که حق دیدن اون صفحه را دارن یک متغیر session مثلا بصورت زیر درست می کنید :

<?PHP
session_start();
$_SESSION[“allowedToWatch”] = 1;
?>

برای اون ۳ تای دیگه هم هیچ کاری لازم نیست بکنید ! حالا تنها کاری که باید بکنید اینه که درون اون صفحه خاص کد زیر را قرار بدید :

<?PHP
session_start();
if ( $_SESSION[“allowedToWatch”] != 1 )
{
    die(“You are not allowed to watch!”);
}
# if the compiler gets here it means that the user has that
# variable in his/her session, so, he/she is not an intruder!
?>

دیدید چقدر راحت بود؟ ! با استفاده از database و کمی بازی بازی میتونید یک سیستم authentication داشته باشید، البته قبل از اینکه اینکارو بکنید باز هم یک مطالعه ای بکنید چون همچین سیستمی یک ذره ظریف کاریهای دیگه هم لازم داره که اگر همین یک ذره را رعایت نکنید خیلی شیرین hack میشید !
کار دیگه ای که من خودم خیلی تو فرمهام انجام میدم اینه که خیلی پیش میاد شما مثلا برای register کردن یک فرآیندی می خواید در ۳ صفحه فرمهاتون را به کاربر نشون بدید تا پرشون کنه، دلیلشم یکی اینه که خب طرف حوصلش سر نره همین که فرم گنده شما را میبینه صفحه را نبنده، دلیل دیگشم میتونه این باشه که به ازاء ورود فرم اول ، یکی از چندین فرم دوم قابل نمایش باید برای طرف انتخاب باشه و الخ ! خب، من برای اینکار هیچوقت action فرمم را یک صفحه دیگه قرار نمیدم، بلکه همیشه action فرمم $_SERVER[“PHP_SELF”] هست و تو همون صفحه چک می کنم که طرف هیچ خطایی تو پر کردن فرم نداشته باشه، اگر داشته باشه که همونجا بهش error میدم، و اگرنه آرایه $_POST م را میریزم تو یک session که مختص اون صفحست (مثلا $_SESSION[“myFirstPage”] ) و اونوقت با یک header و location میرم صفحه بعدیم . البته فراموش نکنید که این حقیقت که session ها تا آخر browse طرف پابرجا هستن بعضی جاها میتونه چندان جالب نباشه که اونوقت با استفاده از یک session چند بعدی (آرایه چند بعدی) میشه مشکل را حل کرد .

همه قضایا را گفتیم بریم سر خان آخر که کی این session ما از بین میره و یا expire میشه؟ خب، در چندین حالت : در صورتی که شما با استفاده از تابع session_destroy() خودتون بصورت دستی session را از بین ببرید. فرض کنید برای همون سیستم username/password یک صفحه logout.php تهیه کردید که خیلی راحت اینکار را انجام میده :

<?PHP
session_start();
session_destroy();

header(“Location: homepage.html”);
?>

اتفاق دیگه ای که میتونه بیفته اینه که کاربر مثلا ۱۵ دقیقه وارد صفحه دیگه ای نشه و به عبارتی با web server تعامل نداشته باشه، در اینصورت هم session بصورت خودکار از بین میره. البته این زمان ۱۵ دقیقه که گفتم بصورت default هست تا اونجایی که یادمه، ولی خیلی راحت میشه در php.ini عوضش کرد . اتفاق دیگه ای هم که ممکنه بیفته اینه که طرف وقتی تو سایت شما هست، تو address bar بروزرش آدرس یک سایت دیگه را بنویسه و اینجوری سایت شما را ترک کنه، ولی نه ! همیشه با اینکار session بابا از کار نمیفته. تا حالا این تجربه رویایی را نداشتید که وقتی یک lady تو سایت دانشگاتون نشسته و داره email های yahoo ش را چک میکنه و بعد خیلی زیبا تصمیم میگیره مستقیما از صفحه mail box ش بره یک سایت پروانه ای را نگاه کنه، و بعد هم که پر از احساس شد سایت را ترک میکنه بدون اینکه صفحه browser را ببنده، شما برید و خیلی قشنگ بنویسید mail.yahoo.com و برید تو mail box ش و چند تا نامه خوشگل برای بعضی ها بفرستید؟! خب، میدونید این اتفاق وقتی میفته که همونطور که تو چند صفحه پیش توضیح دادم، این sid یا همون نام فایل session بصورت تصادفی تولید شده و هر بار به هنگام تقاضای هر صفحه جدید به سرور میره در کوکی ذخیره شده باشه . اگر کوکی ها غیر فعال باشند و یا به هر دلیلی این sid از طریق url اینور و اونور بره همچین مساله ای پیش نمیاد، ولی اگر تو کوکی باشه .... جون. برای همین هم هست که همیشه توصیه میشه قبل از خارج شدن از یک سایت، حتما روی دگمه logout کلید کنید و همینجوری browser تون را نبندید و یا آدرس سایت دیگه ای را اونجا ننویسید .

خیلی خب در پایان لازمه از خودم که این مقاله را نوشتم تشکر کنم ، واقعا جالب بود ، کاش منهم وقتی session ها را بلد نبودم همچین مقاله هایی بود که میخوندم، البته واقعا بوده، open source یعنی همین، یعنی آزادی و یعنی لذت بردن از یاد گرفتن و یاد دادن . خدا پدر Richard Stallman را بیامرزاد . اول مقاله گفتم چندان در مورد فصل بندی این مقاله فکر نکردم، همینطور هم هست، ولی موقع نوشتن تو cookie ها یک چیزی یادم رفته بود که به کتاب Wiley PHP 5 and MySQL Bible مراجعه کردم (نوشته Joyce Park و Clark Morgan) و چند خطی هم از اونجا به امانت گرفتم ( قسمت مربوط به پروتوکل HTTP). در کل امیدوارم مفید واقع شده باشه، ناهار حاضره باید برم .

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
تقويم جلالی

مدتها بود که در فکر نوشتن یک تقویم فارسی بودم. تا اینکه بالاخره دست به کار شدم و نوشتم. برای این کار از برنامه نوشته شده توسط آقایان پورنادر و طوسی استفاده کردم که جا دارد همینجا از این بزرگواران تشکر نمایم. این تقویم در واقع یک کلاس PHP هست که دو تا ورودی دارد. اولین ورودی مربوط به سال می باشد و دومین ورودی مربوط به ماه سال. طرز استفاده از آن هم بسیار ساده است. کافی است که فایل کلاس را include کنید و سپس یک instance از کلاس بسازید. کد نمونه به صورت زیر است:

include \"Calendar.Class.php\";
$c = new Calendar;
$c->SetStyle();
$c->ShowJalaliMonth(1384,1);

اگر سوالی در مورد این برنامه داشتید با آدرس haghparast@gmail.com تماس بگیرید.

کلاس هاي نوشته شده توسط من در سايت www.phpclasses.org
مشاهده تقويم
دريافت فايل

<?php
//--------------------------------------------
//Class Name : Persian Calendar Class
//Published Date: 20 Apr 2005
//Author Email : haghparast@gmail.com
//License : Freeware
//--------------------------------------------
class Calendar
{
    var $OutputText = "\";
    function SetStyle()
    {
        $Style =
                \"
                <style>
                table {
                background-color: #EEEEDD;
                border-width: 0;
                font-size: 80%
                }

                td.day {
                border:1px solid #c6a646; background-color: #EEEEDD;
                text-align: center;
                direction: rtl
                }

                td.month {
                border:1px solid #c6a646; background-color: #FFCCBB;
                font-size : 9px;
                text-align: center;
                direction: rtl
                }

                td.today {
                border:1px solid #c6a646; background-color: #FFCCFF;
                text-align: center;
                direction: rtl
                }
                </style>
                \";
        print $Style;
    }

    function ReturnMonthName($monname)
    {
            switch ($monname)
            {
            case 1:
                return \"فروردين\";
                break;
            case 2:
                return \"ارديبهشت\";
                break;
            case 3:
                return \"خرداد\";
                break;
            case 4:
                return \"تير\";
                break;
            case 5:
                return \"مرداد\";
                break;
            case 6:
                return \"شهريور\";
                break;
            case 7:
                return \"مهر\";
                break;
            case 8:
                return \"آبان\";
                break;
            case 9:
                return \"آذر\";
                break;
            case 10:
                return \"دى\";
                break;
            case 11:
                return \"بهمن\";
                break;
            case 12:
                return \"اسفند\";
                break;
            }
    }
    function div($a,$b)
    {
        return (int) ($a / $b);
    }
    // Thanks to Roozbeh Pournader and Mohammad Toosi for their Date Conversion program
    function gregorian_to_jalali ($g_y, $g_m, $g_d)
    {
        $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);

       $gy = $g_y-1600;
       $gm = $g_m-1;
       $gd = $g_d-1;

       $g_day_no = 365*$gy+$this->div($gy+3,4)-$this->div($gy+99,100)+$this->div($gy+399,400);

       for ($i=0; $i < $gm; ++$i)
          $g_day_no += $g_days_in_month[$i];
       if ($gm>1 && (($gy%4==0 && $gy%100!=0) || ($gy%400==0)))
          /* leap and after Feb */
          $g_day_no++;
       $g_day_no += $gd;

       $j_day_no = $g_day_no-79;

       $j_np = $this->div($j_day_no, 12053); /* 12053 = 365*33 + 32/4 */
       $j_day_no = $j_day_no % 12053;

       $jy = 979+33*$j_np+4*$this->div($j_day_no,1461); /* 1461 = 365*4 + 4/4 */

       $j_day_no %= 1461;

       if ($j_day_no >= 366) {
          $jy += $this->div($j_day_no-1, 365);
          $j_day_no = ($j_day_no-1)%365;
       }

       for ($i = 0; $i < 11 && $j_day_no >= $j_days_in_month[$i]; ++$i)
          $j_day_no -= $j_days_in_month[$i];
       $jm = $i+1;
       $jd = $j_day_no+1;

       return array($jy, $jm, $jd);
    }

    function jalali_to_gregorian($j_y, $j_m, $j_d)
    {
        $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);

       $jy = $j_y-979;
       $jm = $j_m-1;
       $jd = $j_d-1;

       $j_day_no = 365*$jy + $this->div($jy, 33)*8 + $this->div($jy%33+3, 4);
       for ($i=0; $i < $jm; ++$i)
          $j_day_no += $j_days_in_month[$i];

       $j_day_no += $jd;

       $g_day_no = $j_day_no+79;

       $gy = 1600 + 400*$this->div($g_day_no, 146097); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */
       $g_day_no = $g_day_no % 146097;

       $leap = true;
       if ($g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */
       {
          $g_day_no--;
          $gy += 100*$this->div($g_day_no,  36524); /* 36524 = 365*100 + 100/4 - 100/100 */
          $g_day_no = $g_day_no % 36524;

          if ($g_day_no >= 365)
             $g_day_no++;
          else
             $leap = false;
       }

       $gy += 4*$this->div($g_day_no, 1461); /* 1461 = 365*4 + 4/4 */
       $g_day_no %= 1461;

       if ($g_day_no >= 366) {
          $leap = false;

          $g_day_no--;
          $gy += $this->div($g_day_no, 365);
          $g_day_no = $g_day_no % 365;
       }

       for ($i = 0; $g_day_no >= $g_days_in_month[$i] + ($i == 1 && $leap); $i++)
          $g_day_no -= $g_days_in_month[$i] + ($i == 1 && $leap);
       $gm = $i+1;
       $gd = $g_day_no+1;

       return array($gy, $gm, $gd);
    }

    function CalculateTotalDays($jmonth)
    {
        switch ($jmonth)
        {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            $TotalDays = 31;
            break;
            case 7:
            case 8:
            case 9:
            case 10:
            case 11:
            $TotalDays = 30;
            break;
            case 12:
            $TotalDays = 29;
            break;
        }
        return $TotalDays;
    }
    function ShowJalaliMonth($jyear,$jmonth)
    {
    $todaygyear = date(\"Y\");
    $todaygmonth = date(\"m\");
    $todaygday = date(\"d\");
    list( $todayjyear, $todayjmonth, $todayjday ) = $this->gregorian_to_jalali($todaygyear, $todaygmonth, $todaygday);
    list( $gyear, $gmonth, $gday ) = $this->jalali_to_gregorian($jyear, $jmonth, 1);
    $FirstDay = mktime(0,0,0,$gmonth,$gday,$gyear);
    $FirstDayArray = getdate($FirstDay);
    $DayOfWeek = $FirstDayArray['wday'];

    switch ($DayOfWeek)
    {
        case 0:
        $Difference = -1;
        break;
        case 1:
        $Difference = -2;
        break;
        case 2:
        $Difference = -3;
        break;
        case 3:
        $Difference = -4;
        break;
        case 4:
        $Difference = -5;
        break;
        case 5:
        $Difference = -6;
        break;
        case 6:
        $Difference = 0;
        break;
    }
    $this->OutputText = '<table width=\"252\">'.\"\n\";
    $this->OutputText .= '  <tr>'.\"\n\";
    $this->OutputText .= '    <td class=\"month\" colspan=\"7\" width=\"70%\">'.$this->ReturnMonthName($jmonth).'&nbsp;&nbsp;'.$jyear.'</td>'.\"\n\";
    $this->OutputText .= '  </tr>'.\"\n\";
    $this->OutputText .= '  <tr>'.\"\n\";
    $this->OutputText .= '    <td class=\"month\" width=\"13%\">جمعه</td>'.\"\n\";
    $this->OutputText .= '    <td class=\"month\" width=\"13%\">پنجشنبه</td>'.\"\n\";
    $this->OutputText .= '    <td class=\"month\" width=\"15%\">چهارشنبه</td>'.\"\n\";
    $this->OutputText .= '    <td class=\"month\" width=\"20%\">سه شنبه</td>'.\"\n\";
    $this->OutputText .= '    <td class=\"month\" width=\"13%\">دوشنبه</td>'.\"\n\";
    $this->OutputText .= '    <td class=\"month\" width=\"13%\">يکشنبه</td>'.\"\n\";
    $this->OutputText .= '    <td class=\"month\" width=\"13%\">شنبه</td>'.\"\n\";
    $this->OutputText .= '  </tr>'.\"\n\";
    for ($i=0;$i<6;$i++)
        {
            $Const = 7*$i+$Difference ;
            $this->OutputText .= '  <tr>'.\"\n\";
            $this->OutputText .= '    <td ';
            if (($Const + 7  == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear)) $this->OutputText .= \"class=\\"today"\"; else

        $this->OutputText .= \"class=\\"day"\";
            $this->OutputText .= '>'.\"\n\";
            $Output = $Const + 7;
            if (($Output>0) && ($Output<=$this->CalculateTotalDays($jmonth))) $this->OutputText .= $Output;
            $this->OutputText .= '    </td>'.\"\n\";
            $this->OutputText .= '    <td ';
            if (($Const + 6  == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear)) $this->OutputText .= \"class=\\"today"\"; else

        $this->OutputText .= \"class=\\"day"\";
            $this->OutputText .= '>'.\"\n\";
            $Output = $Const + 6;
            if (($Output>0) && ($Output<=$this->CalculateTotalDays($jmonth))) $this->OutputText .= $Output;
            $this->OutputText .= '    </td>'.\"\n\";
            $this->OutputText .= '    <td ';
            if (($Const + 5  == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear)) $this->OutputText .= \"class=\\"today"\"; else

        $this->OutputText .= \"class=\\"day"\";
            $this->OutputText .= '>'.\"\n\";
            $Output = $Const + 5;
            if (($Output>0) && ($Output<=$this->CalculateTotalDays($jmonth))) $this->OutputText .= $Output;
            $this->OutputText .= '    </td>'.\"\n\";
            $this->OutputText .= '    <td ';
            if (($Const + 4  == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear)) $this->OutputText .= \"class=\\"today"\"; else

        $this->OutputText .= \"class=\\"day"\";
            $this->OutputText .= '>'.\"\n\";
            $Output = $Const + 4;
            if (($Output>0) && ($Output<=$this->CalculateTotalDays($jmonth))) $this->OutputText .= $Output;
            $this->OutputText .= '    </td>'.\"\n\";
            $this->OutputText .= '    <td ';
            if (($Const + 3  == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear)) $this->OutputText .= \"class=\\"today"\"; else

        $this->OutputText .= \"class=\\"day"\";
            $this->OutputText .= '>'.\"\n\";
            $Output = $Const + 3;
            if (($Output>0) && ($Output<=$this->CalculateTotalDays($jmonth))) $this->OutputText .= $Output;
            $this->OutputText .= '    </td>'.\"\n\";
            $this->OutputText .= '    <td ';
            if (($Const + 2  == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear)) $this->OutputText .= \"class=\\"today"\"; else

        $this->OutputText .= \"class=\\"day"\";
            $this->OutputText .= '>'.\"\n\";
            $Output = $Const + 2;
            if (($Output>0) && ($Output<=$this->CalculateTotalDays($jmonth))) $this->OutputText .= $Output;
            $this->OutputText .= '    </td>'.\"\n\";
            $this->OutputText .= '    <td ';
            if (($Const + 1  == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear)) $this->OutputText .= \"class=\\"today"\"; else

        $this->OutputText .= \"class=\\"day"\";
            $this->OutputText .= '>'.\"\n\";
            $Output = $Const + 1;
            if (($Output>0) && ($Output<=$this->CalculateTotalDays($jmonth))) $this->OutputText .= $Output;
            $this->OutputText .= '    </td>'.\"\n\";
            $this->OutputText .= '  </tr>'.\"\n\";
        }
    $this->OutputText .= '</table>'.\"\n\";
    print $this->OutputText;
    }
}

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به PHP و فارسی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
تصاوير امنيتی قسمت دوم

چندي پيش مقاله اي تحت عنوان ايجاد تصاوير امنيتي كه توسط بنده نوشته شده بود در همين سايت قرار گرفته بود بسياري از دوستان اين مقاله را مطالعه كرده بودند و برخي هم با ايجاد تصوير مشكل داشتند به هر شكل بر روي اين مقاله و كلاس نگاه هاي زيادي شد اما من هر چه منتظر ماندم هيچ كس به يك ضعف امنيتي فاحش در اين مقاله پي نبرد نمي دانم چرا اما در كشور ما هميشه عقب ماندگي حاكم است اين مقاله به مشكل موجود در مقاله قبلي پرداخته و يك راه كار جديد براي ايجاد تصاوير امنيتي كه موسوم به CAPTCHA هستند ارائه مي دهد پيش از اينكه به ادامه مقاله بپردازم اول مشكلمان را با نام اين نوع تصاوير حل مي كنيم CAPTCHA مخفف شده
(Completely Automated Public Turing to tell Computers from Humans Apart)
مي باشد كلمات بجز واژه تيورينگ همگي واضحند تيورينگ نام شخصيست كه براي اولين بار تستي را به نام تيورينگ تست ابداع كرد تا كنون ماشيني اختراع نشده است كه بتواند به طور كامل از تست تيورينگ عبور كند تست تيورينگ به اين شكل است كه وقتي شما در حال مكالمه از طريق كامپيوتر با دو كامپيوتر ديگر هستيد كه يكي توسط انسان به شما پاسخ مي دهد و ديگري به صورت اتوماتيك و با بهره گيري از هوش مصنوعي به شما پاسخ مي گويد زماني يك ماشين به طور كامل هوشمند شناخته مي شود كه شما نتوانيد تشخيص دهيد كه كدام يك توسط انسان و كدام توسط ماشين پاسخگويي مي شود اين تصاوير نيز به همين شكل كاربران كنترل مي كنند كه حتما يك انسان در حال استفاده يا لاگين كردن باشد نه يك ماشين اما نكته اي در اين ميان مطرح مي شود آيا تا به حال به تفاوت تصاوير سايتهاي معتبر مثل ياهو يا جي ميل با تصاويري كه توسط مقاله من يا تصاويري كه در بسياري از سايتهاي ايراني تقريبا به همين شكل و شمايل توليد مي شود پي برده ايد آفرين! تصاوير سايتهاي معتبر به شكل تعجب برانگيزي افكت داده شده اند و حروف يا اعداد اكثرا از كمر شكسته شده اند يا به شكل عجيبي تابيده شده اند و اكثرا هم در بكگراند خطهاي كجي وجود دارند كه نه تنها تصاوير را زيباتر نمي كنند بلكه از زيبايي آن نيز مي كاهند براستي دليل اين افكتها چيست فكر مي كنم بچه هايي كه با علوم نوين آشنايند منظورم را متوجه شده اند بله پردازش تصوير متاسفانه خيلي ها اصلا با اين نام قريبه اند بعد از ابداع تصاوير موسوم به CAPTCHA هكرها دست به كار شده و با بهره گيري از پردازش تصوير اقدام به خواندن محتويات اين تصاوير كردند حرف از پردازش تصوير بسيار بسيار زياد است و اصلا اينجا مجال بحث در اين زمينه نيست فقط همنقدر بدانيم كه اگر حروف و اعداد به صورت واضح و طبيعي خود نمايش داده شوند توسط الگوريتمها پردازش تصوير قابل خواندن توسط ماشين مي شوند به همين دليل است كه سايتهاي معتبر افكتها عجيبي به كاراكترها مي دهند توليد اين افكتها با توابع php تا حدودي نشدنيست تا آنجا كه من در ASP.NET اطلاعات داشتم توابعي وجود دارد كه توسط آن مي شود يك سري افكتها به فونتها داد كه البته در ASP هم احتمالا بايد كلاسي را براي اين كار بنويسيم اما در PHP چه كنيم من يك راه حل در اينجا ارائه مي دهم شما هم كمي فكر كنيد و اگر فكري بهتر به ذهنتان مي رسد ارائه دهيد تا بزودي يك كلاس در اين زمينه بنويسم و در همين سايت قرار بديم.
خوب من پيشنهادي كه در اين زمينه ارائه مي دهم اين است كه بياييم و تعداد زيادي تصوير تك كاراكتر با يك بكگراند ثابت ايجاد كنيم مثلا A را بيست حالت مختلف توليد كنيم و اين كار را براي تمامي حروف و اعداد انجام دهيم چون 36 كاركتر داريم بايد حدود 720 عكس توليد كنيم اين تصاوير را با حد اقل حجم و با برنامه هاي گرافيكي ايجاد مي كنيم هنگامي كه رمز را توليد كرديم با كنار هم قرار دادن هر حرف و عدد كه در رمز وجود دارد عكسها را كنار يكدگر مي چسبانيم و يك عكس واحد توليد مي كنيم خوب زياد كار پيچيده اي نيست اما براي اينكه كار upload كردن سايت هم به سهولت انجام شود مي توانيم همه تصاوير را در يك فايل فشرده بر روي سرور فرستاده و آنجا فايل را باز كنيم.
شما نيز اگر پيشنهادي دارين در اينجا قرار بدين

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
پیدا سازی رویداد گرایی در php

ما می خواهیم در مورد روش پیدا سازی رویداد گرایی(event-driven) در php بحث کنیم.
من خودم خیلی وقت بود که تقریبا از چنین روشی استفاده می کردم. ولی چندان جالب نبود تا با خوندن کتاب Professinal PHP5 یک سری ایده به ذهنم خورد که آلان در موردش صحبت می کنیم البته باید بگم این کد در PHP4 هم کاملا جواب داده

خب خوده شما از چه روشی استفاده می کنید ؟ فکر کنم به صورت زیر :

old_script.php
<html><head><title>You doing</title></head>
<body>
<?= submit()?>
<form method=\"post\" action=\"old_script.php\">
<input type=\"text\" name=\"name\" />
<input type=\"hidden\" name=\"formsubmit\" value=\"1\" />
<input type=\"submit\" name=\"btnsubmit\" value=\"Submit It ! \" />
</form>
</body>
</html>
<?
Function submit()
{
    if(isset($_POST['formsubmit']))
{
    return "form submited and name value is : \".$_POST['name'];
}
}
?>

خب البته این هم روشی واسه خودش ولی فکر کنید هر بار فرمی می خواهید درست کنید باید این همه زحمت به خودتون بدید ! حالا فکر کنید توی فرم دوتا دکمه باشه که هر کدوم یک کار رو انجام بدند.
خب اینجاست که کلاس های و این شیوه رویداد گرایی به کمک من و شما میاند !

handler.php
<?
function handler ($classname,$method='POST')
{
    if(class_exists($classname))
    {
        if($_SERVER['REQUEST_METHOD']==$method)
        {
            if(isset($_POST['handle_event']))
            {
                $obj=new $classname ();
                $name="handler_\".$_POST['handle_event'];
                $obj->{$name}();
            }
        }
    }else
        echo \"can not handle this event !\";
}
?>

تابع دو ورودی دارد نام کلاس و نوع متدی که می خواهیم برای آن رویداد بنویسیم (POST or GET)
چک می کند که آیا چنین کلاسی وجود دارد (خط 4)
اگر صفحه به صورت متدی که مورد نظر ما است لود شده باشد (خط 6)
در صورتی که نیازی به رویداد گرای برای این صفحه باشد (خط 9)
یک شی از این کلاس درست می شود و تابع که با رویداد مورد نظر مطلبقت داشته باشد اجرا می شود (خط 11 تا 13 )

test.class.php
<?
class test
{
    function handler_show()
    {
echo 'form is submited and name is <b>'.$_POST['name'].'</b>';
}
}
?>

new_script.php
<?
require("test.class.php\");
require(\"handler.php\");
?>
<html><head><title>You doing</title></head>
<body>
<?
handler ('test');
?>
<form method=\"post\" action=\"new_script.php\">
<input type=\"text\" name=\"name\" />
<input type=\"hidden\" name=\"handle_event\" value=\"show\" />
<input type=\"submit\" name=\"btnsubmit\" value=\"Submit It ! \" />
</form>
</body>
</html>

در این فرم یک فیلد مخفی است که نشان می دهد چه عملی را می خوایم انجام بدیهم و در کدها handler_ را به اول این عمل اضافه می کنیم و یک تابع به کلاس با این نام اضافه می کنیم
فرض کنیم در صورتی که بخواهیم نام را از فرم بگیرد و به صورت بزرگ نشان دهد تنهای مقدار فیلد مخفی handle_event را به show_big تغییر می دهیم و یک تابع به نام handler_show_big مانند زیر به کلاس مان اضافه می کنیم :

function  handler_show_big()
{
    echo '<h1>'.$_POST[' name '].'</h1>';
}

این مثالی که من در اینجا آوردم شاید خیلی ساده به نظر بیاد ولی وفتی پروژه تون اون قدر بزرگ شد که ممکنه جایی تابع های رو که استفاده کردید یادتون بره مطمئنا با این روش به خیلی راحت می تونید تابع ها رو ویرایش کنید

میلاد راستیان
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
تصدیق هویت کاربر

متدهای تصدیق هویت کاربر یا همان Authentication Schemes یکی از مباحث جذاب در برنامه نویسی php است که باید نکات ایمنی را دقیقا در آن لحاظ کرد. روش های گوناگونی بدین منظور موجود است که با توجه به سطح امنیت مورد نیاز می توانید از آن ها استفاده کنید. مرسوم ترین روش برای این کار استفاده از یک بانک اطلاعاتی برای نگهداری اطلاعات کاربران است. مسلما در تصدیق هویت مبنی بر پایگاه داده ما قابلیت انعطاف و کارایی بیشری در مقایسه با کار با فایل ها به عنوان نگهدارنده اطلاعات خواهیم داشت. برای مثال کار با توابعی همچون md5 و crypt را به عنوان پنهان سازی اطلاعات در نظر بگیرید!

در این پست قصد داریم اسکریپتی بنویسم که با توجه به اطلاعات موجود در پایگاه داده Mysql هویت کاربر را تشخیص دهد. بعلت آنکه از سطح مقدماتی مقاله خارج نشویم اطلاعات را به صورت متنی در فیلد های جدول ذخیره می کنیم، اما برای رعایت نکات امنیتی حتما باید کلمه عبور را رمزنگاری کرد. query مورد نیاز برای ساخت جدول به شکل زیر است:

CREATE TABLE users (
   id INT NOT NULL,
   username VARCHAR(16),
   password VARCHAR(8),
   PRIMARY KEY(id));
INSERT INTO `users` VALUES (0, '2005', '2005');

همان گونه که مشاهده می کنید این query یک جدول بنام users ایجاد می کند که دارای سه فیلد id،username و password است. برای هر فیلد مقداری را وارد می کنیم. دقت کنید که شناسه کاربری و اسم رمز در این مقادیر برابر 2005 است.در مرحله بعدی برای اتصال به پایگاه داده یک تابع جدید بنام connect مطابق زیر ایجاد می کنیم:

<?
  function connect() {
    if(!$db = @mysql_pconnect("localhost\",\"mysqluser\",\"password\")){
      print(\"<h1>Cannot Connect to the DB!\n\");
      return 0;
    } else {
      mysql_select_db(\"php\", $db);
      return 1;
    }
}

بجای localhost سرور پایگاه داده، mysqluser نام کاربری و password کلمه عبور دسترسی به پایگاه داده را قرار دهید. ضمنا آرگومان اولی تابع mysql_select_db نشانگر نام پایگاه در دتابیس سرور است که بصورت پیشفرض php انتخاب شده است. دقت کنید آن را مطابق با نام پایگاه داده خودتان تنظیم کنید. در کل، کار تابع mysql_select_db انتخاب پایگاه داده در دتابیس است و دو آرگومان دریافت می کند همان گونه که ذکر شد، اولی نام پایگاه داده و دومی پارامتر برقراری پیوند است. در مرحله بعدی برای چک کردن اطلاعات کاربر با اطلاعات موجود در پایگاه داده، تابع check_user رو به شکل زیر ایجاد می کنیم:

  function check_user($user, $password) {
    if(connect()) {
      $password = substr($password, 0, 8);
      $sql = \"select * from users where username = '$user' and password = '$password'\";
      $result = mysql_query($sql);
      if (mysql_num_rows($result) == 1) {
        setcookie(\"user\",$user);
        setcookie(\"password\",$password);
        return 1;
      } else {
        ?>
        <h3>Sorry, you are not authorized!</h3>
        <?
        return 0;
      }
    }
}

همان طور که مشاهده می شود در این تابع دو آرگومان کلمه کاربری و رمز عبور دریافت می شود. در ابتدای کار ما در این تابع، تابع connect مرحله قبل را فراخوانی می کنیم. یک عبارت شرطی ایجاد می کنیم، اگر اتصال برقرار شد کلمه عبور و نام کاربری را که به عنوان ورودی به تابع ارسال شد با مقادیر ذخیر شده در بانک اطلاعاتی مقایسه می کنیم. اگر یکسان بود هویت کاربر تصدیق می شود در غیر اینصورت پیامی را مبنی بر عدم اختیار نمایش می دهیم. فکر نکنم نیاز به تحلیل یک یک توابع باشد.

فقط در همین حد بدانید که تابع setcookie تابعی است که کوکی توسط آن به سیستم کاربر ارسال می شود. در اکثر موارد از دو آرگومان اول تابع استفاده می شود که اولی نام و دومی مقدار است. اما این تابع چهار آرگومان دیگر نیز دارد که توضیح آن در این حوصله نمی گنجد. ما در این مثال بعد از تصدیق هویت دو نام user و password را به همراه مقادیرشان به مرورگر کاربر ارسال کردیم. تقریبا عمده کار تمام شده است تنها یک عبارت شرطی به شکل زیر ایجاد می کنیم:

  if(!isset($user) or !check_user($user, $password)) {
    ?>
    <h1>You must log in to view this page</h1>
    <form action = \"authenticate.php\" method=\"post\">
    <p>Username: <input type=\"text\" name=\"user\"/><br />
    Password: <input type=\"password\" name=\"password\" maxlength=\"8\" size=\"8\"/><br />
    <input type=\"submit\" name=\"submit\" value=\"Submit\"/>
    </p></form>
    <?
  } else {
    ?>
    <h1>Authorized!</h1>
    <?
  }
  ?>

همان طور که مشاهده می شود در عبارت شرطی فوق از عملگر or استفاده کردیم. یعنی حداقل باید یکی از دو بخش دارای ارزش TRUE باشد، تا نتیجه TRUEشود. حال دو بخش ما چیست؟ یکی اینکه توسط تابع isset تعیین می کنیم که آیا برای متغیر user مقداری در نظر گرفته شده است یا خیر؟ اگر مقدار داده شده درست بود شرط کافی است و دومی اینکه توسط تابع check_user که ایجاد کرده ایم، کلمه کاربری و رمز عبور را با اطلاعات ذخیر شده در دتابیس مقایسه می کنیم.

حال اگر حداقل یکی از دو شرط فوق برقرار بود پیام Authorized را نمایش می دهیم در غیر اینصورت یک فرم را برای ورود اطلاعات به همراه پیغام مناسب نمایش می دهیم. تنها دقت کنید چون اکشن فرم برابر با authenticate.php قرار گرفته است، نام صفحه مان را هنگام ذخیره کردن مشابه آن در نظر بگیریم. برای تمرین بیشتر می توانید این اسکریپت را از آدرس زیر دریافت کنید.

http://weblog.mybesthost.com/files/authenticate.zip
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
ماژول آپاچي mod_rewrite

او حق است

پيش از هرچيز به خوانندگان محترم عرض مي نمايم كه اين مقاله تنها به منظور آشنايي شما با يكي از قدرتمندترين و كاراترين ماژولهاي آپاچي به پديد آمده و براي كسب اطلاعات دقيقتر به منابع اين سرور قدرتمند مراجعه نمائيد.
مرجعي كه من انتخاب كردم همون راهنماي خوبمون Apache Manual هست كه اگه دوست داشتين مي تونين بهش مراجعه كنين تكنيك كاري مونم ارائه مشكل و راه حل اينطوري بهترم هست، پيش از اينكه وارد بحث بشيم مي خوام بهتون بگم كه اصلا اين قضيه مد ريرايت چي هست و به چه كاري مياد بايد عرض كنم يكي از خفن ترين ماژولهاي آپاچي همين مد ريرايت از هر نظر خفن اين ماژول به شما اين امكان رو ميده كه URL رو مطابق ميلتون پردازش كنين و به هرشكلي كه دوست دارين نمايش بدين بگفته خدايان امر اين مدريرايت حكم چاقوي سويسي رو داره به هرشكل شايد ظاهر قضيه ساده باشه اما به حق يكي از پيچيده ترين يا شايد پيچيده ترين ماژول آپاچي همين مد ريرايت حالا با هم قدم به قدم ميريم جلو:
منتها قبل از اينكه شروع كنيم اينو بهتون بگم ممكن سختي اين مقوله اونقدر باشه كه شما كاملا قضيه رو رها كنين اما تكنيكي كه اينجا در پيش گرفته شده شما رو با ده ها راه حل روبرو مي كنه كه چنان جذب موضوع مي شين كه ديگه هيچ وقت اين سختي شما رو عذاب نده و قضيه رو رها نكنين:
پيش از هر چيز شما بايد درك كنيد كه آپاچي كي يك درخواست HTTP رو پردازش مي كنه ببينيد وقتي يك درخواست به آپاچي ميرسه آپاچي در دو مرحله اونو بررسي ميكنه اول آپاچي اين قضيه رو بررسي مي كنه كه به يك سرور مجازي ارسال شده يا نه و پس از اون موتورهاي بازنويس آپاچي اقدام به پردازش دستور دهنده ها از فايلهاي پيكربندي اصلي مي كنن كه به وسيله اون دستورهاURL رو بازنويسي كنن چند گام جلوتر آپاچي آدرس را پيش مي رود تا به شاخه اي كه در خواست شده برسد و به دنبال فايلهاي پيكربندي شاخه اي مي گردد(.httaccess)كه بوسيله اون مجددا (براي بار دوم) اقدام به بازنويسي يو آر ال ميكنه در هر دو گام آپاچي با بهره گيري از فرامين مشخص شده اقدام به بازنويسي يو آر ال ميكنه بيشتر از اين قضيه رو باز نمي كنم چون واقعا خسته كننده ميشه اما حالا مي خواهيم كمي در مورد اون دستور دهنده ها بدونيم كه چي هستن ببينيد اون دستور دهنده ها در حقيقت يك سري عبارات با قاعده اند كه تحت عنوان قوانين بازنويسي (RewriteRule) در فايلهاي پيكربندي ذخيره مي شن حتما مي دونيد عبارات باقاعده چي هستن ديگه، اگر نمي دونين هيچ خيالي نيست سه سوت بهتون مي گم صد البته براي توضيحات بيشتر مراجعه كنيد به منابع و كتب اما:
اول اينكه عبارات با قاعده (Regular Expression) براي اين بكار مي روند كه ببينيم آيا يك رشته با يك الگوي مشخص مطابقت ميكنه يا نه و اينكه يك الگوي خاص رو در يك رشته جستجو كنيم و نهايتا يك الگوي مشخص رو از يك رشته بيرون بياريم حالا مي گم چه جوري ميشه به اين اهداف دست يافت ببينيند يه سري دستور زبان وجود داره كه تو عبارات باقاعده از اونها استفاده مي كنيم كه بطور خلاصه مي گم
-اين عبارت با قاعده با هر رشته حاوي "abc" مطابقت مي كند "abc"
-عبارات با قاعده مي توانند شاخه دار باشند "|" اين شاخه ها مثل OR عمل مي كنن يعني "abc|xyz" يعني هر رشته حاوي "abc" يا "xyz" مطابقت مي كند
-براكت ها براي محدود سازي استفاده مي شوند يعني "[abc]" باهر رشته حاوي يك يا تمام كاراكترهاي "a" يا "b" يا "c" مطابقت مي كند
-براي خلاصه سازي از - استفاده مي كنيم پس "[0-9]" با ارقام مطابقت مي كند صفر تا نه تك تك يا چند تا يا همه خلاصه اينكه صفر تا نه ضمن اينكه داخل براكت هم هست
-اگر خواستين از - در عبارت با قاعده خود استفاده كنين از '- استفاده كنين
-براي مستثني كردن يك ست از كاراكترها از ^ استفاده مي كنيم كه داخل براكت است يعني "^abc" با همه كاراكترها بجز كاراكترهاي "a" و "b" و يا "c" مطابقت مي كند
-علامت "x+" با هر رشته حاوي حداقل يك "x" مطابقت مي كند و علامت "x*" با هررشته حاوي صفر يا تعدا بيشتر "x" و علامت "x?" با هررشته حاوي صفر يا يك "x" مطابقت مي كند
-كروشه ها تعداد توالي يك كاراكتر را به طور مشخص تعين مي كند يعني "xy{4}" با هر رشته حاوي يك "x" كه بعد آن دقيقا چهار "y" آمده است مطابقت مي كند و "xy{4,6}" تعداد "y"بين چهار تا شش و اگر عدد دوم (اينجا شش) ذكر نشود حداقل چهار ولي ماكزيممي ندارد
-پرانتزها براي تكرار توالي استفاده مي شوند مثلا "x(yz)*" با يك رشته حاوي يك "x" و تعداد صفر يا نامحدود "yz" مطابقت مي كند
-"."با هر كاراكتري مطابقت مي كند
-"^" با ابتداي رشته مطابقت مي كند "^ab" رشته اي كه ابتداي آن "ab" باشد توجه كنيد اينجا ديگر داخل براكت نيست
-"$" مانند بالا اما اين يكي با انتهاي رشته مطابقت مي كند
اگر از هريك از اين كاراكترها خواستيد به عنوان كاراكترهاي معمولي استفاده كنيد براحتي"\$" استفاده كنيد يعني يك اسلش قبلش بگذاريد
خوب حالا شما هم تا حدودي با عبارات با قاعده آشنا شديد(من نمي دونم اين خارجيها وقتي مي خوان اسم انتخاب كنن حتما قبلش بايد اب هويج بخورن آخه اينا چيش با قاعده هرچي قاعده تو دستور زبان هست به هم ريخته هنوز براتون هيچي نگفتم خودش به تنهايي يك كتاب داره اين عبارات با قاعده ولي خوب لازمه حتما ياد بگيرينش بدردتون مي خوره)
خوب حالا براتون يه عالمه مشكل رو با راه حل مثال مي زنم اينجوري خيلي سريع مي فهمين كه چي به چيه و اگر مشكل شما در اين مجموعه نباشه خودتون مي تونين با استفاده از اينها راه حلش رو پيدا كنين فقط چون تعدادشون زياده من اونها رو در دو سطح مقدماتي و پيشرفته تقسيم مي كنم و مقدماتي هارو در اين مقاله قرار مي دم و قسمت پيشرفته را در مقاله اي جداگانه تقديم مي كنم:
قبل از هرچيز شما بايد از نصب صحيح ماژول مدريرايت در آپاچيتون مطمئين بشيد بدنبال

#LoadModule rewrite_module modules/mod_rewrite.so

در فايل پيكربندي اصلي آپاچي باشيد و آنرا از حالت توضيح خارج كنيد و آپاچي را ري استارت كنيد
خوب حالا همه چيز محياست فكر كنيد كه مي خواهيد با استفاده از GET چيزي مثل

myapp.php?target=showproducts&categoryid=123&listlimit=30

را به صفحه myapp ارسال كنيم و بعد از متغيرهاي ارسال شده در يك كوري استفاده كنيم حالا فرض كنيد يك كاربر ناقلاي فوضول بياد و URL رو به اين شكل

myapp.php?target=showproducts&categoryid=youarebeinghacked&listlimit=30

تغيير بده خوب صفحه myapp حيووني از همه چيز بي خبري تلپي همه چيز رو ميگذاره تو كوري و واويلا يا مثلا تصور بفرمائين كه شما فايلهاي گوناگوني رو در يك شاخه دارين كه با استفاده از يك برنامه URL رو پردازش ميكنين (منظور همون GET) و كاربر رو به صفحه درخواستي ميفرستين مثلا

http://www.downloadsite.com?category=47564765786237347
http://www.downloadsite.com?category=34769845698752354
http://www.downloadsite.com?category=56546792459045980
http://www.downloadsite.com?category=87536834785784754

خوب حالا فكر كنين اين كاربر طفلي از اين صفحات خوشش اومده و دوست داشته كه اونها رو در ليست علاقه مندي هاش (Favorite) ذخيره كنه فكر مي كنين مي تونه بفهمه چي به چيه و كدوم آدرس ماله كدوم صفحه خوب حالا ما ميايم و سلوشن ميديم البته ما كه نه آپاچي ميده :D
اون چيزهايي كه ما بايد در فايل هاي پيكربندي ذخيره كنيم فعلا فقط دو چيز

RewriteEngine on
RewriteRule Pattern Substitution [Flag(s)]

خط اول موتورهاي بازنويس آپاچي رو استارت ميكنه و خط دوم همون خطي كه ما بايد با استفاده از عبارات باقاعده به آپاچي بگيم كه بايد الگوي مشخص شده با عبارات باقاعده را (كه بجاي عبارت Pattern قرار مي گيرد) با جانشينش (Substitution) جايگزين كنه حالا با هم چند مثال ساده مي بينيم:
ما مي خواهيم هروقت كاربر يا خود سايت چنين URL

http://localhost/products/34676

را به سمت سرور ارسال كرد اين URL به شكل

http://localhost/siteengine/products.php?id=34676

تغيير كنه تا با استفاده از اون صفحه products.php متغير id را در اختيار بگيره اين كار را به راحتي با استفاده از

RewriteRule /products/([0-9]+) /siteengine/products.php?id=$1

انجام مي دهيم سعي كنيد خودتون بفهميد عبارات با قاعده چه چيزهايي را الگو مي كنن
خوب حالا همين مثال رو يه نموره ميتابونيم مي خواهيم آدرسي مشابه

http://somesite.hu/products/24334,d,3,2

را به صورت

http://localhost/siteengine/marso/content.php?id=24334&sort=d&order=3&start=2

بازنويسي كنيم خوب براي اين كار ما از قانون زير به سادگي استفاده مي كنيم

RewriteRule ^/products/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$) /marso/content.php?id=$1&sort=$2&order=$3&start=$4

همون طوري كه مشاهده مي كنين كارها به سادگي قابل فهمند و چيزه پيچيده اي در كار نيست نكته اي رو كه تا اينجا چيزي ازش نگفتم مساله [Flag(s)] بوده فكر مي كنين چرا تابحال چيزي از اونها نگفتم ؟ خوب معلومه چون يادم رفت بگم :D كه تو پرانتز اينجا بهتون مي گم شما با استفاده از فلگها مي تونين هدرهاي خاصي رو به مرورگرها ارسال كنين مثلا اگر به جاي [Flag(s)] قرار دهيد [NC] يا [nocase] همونطور كه متوجه شدين باعث ميشود كه Pattern به صورت case-insensitive در بياد و فلگهاي ديگر كه توضيحات بيشتر در اين باره را به مقاله تكميلي موكول مي كنم
اما اين همه مدريرايت نبود مدريرايت انعطاف پذيرتر ميشود و بازهم دست شما را براي بازنويسي URL بازتر مي كند

RewriteCond Something_to_test Condition

بله اين همون چيزيه كه الان مي خوام بهتون بگم دستور بازنويس RewriteCond اقدام به تست كردن آدرسي مي كند كه در جاي Something_to_test قرار مي گير اين رشته مي تواند يك رشته ساده باشد يا يك عبارت باقاعده موتورهاي بازنويس آپاچي اقدام به كنترل اين رشته مي كند اگر اين رشته يا عبارت باقاعده با URL متچ شود موتور بازنويس اقدام به بازنويسي قاعده زيرين مي كند وگرنه به دنبال ريرايت كانديشن هاي ديگر مي گردد و اگر ريرايت كانديشن ديگري وجود نداشت به اجراي ريرايت رولهاي باقي مانده مي پردازد اما ما نياز به يك سري مواد اوليه داريم تا بفهميم كه اين ريرايت كانديشن چقدر بدرد بخوره بجاي عبارت Something_to_string مي تونيم از موارد زير بهره بگيريم
HTTP header variables: HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_FORWARDED,HTTP_HOST, HTTP_PROXY_CONNECTION, HTTP_ACCEPT
Connection & request variables: REMOTE_ADDR, REMOTE_HOST, REMOTE_USER, REMOTE_IDENT,REQUEST_METHOD, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING, AUTH_TYPE
Server internal variables: DOCUMENT_ROOT, SERVER_ADMIN, SERVER_NAME, SERVER_ADDR,SERVER_PORT, SERVER_PROTOCOL, SERVER_SOFTWARE
System variables: TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC,TIME_WDAY, TIME
mod_rewrite special values: API_VERSION, THE_REQUEST, REQUEST_URI, REQUEST_FILENAME,IS_SUBREQ
حتما با اكثر اين موارد آشنائيد و مي توانيد حدس بزنيد كه هريك چه كاري انجام مي دن در يك مثال حسابمان را با ايم ريرايت كانديشن تصويه مي كنيم

RewriteCond %{HTTP_USER_AGENT} ^Mozilla .*
RewriteRule ^/$ /homepage.max.html [L]

RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule ^/$ /homepage.min.html [L]

RewriteRule ^/$ /homepage.std.html [L]
[code/]
فكر مي كنم اگر بيشتر توضيح بدم حرصتان در مي آيد همه چيز واضح است خط اول مرورگر كاربر را چك مي كند كه اگر با Mozilla شروع شده باشد مدريرايت زيرين استارت شده و كاربر به صفحه homepage.max.html ارجاع داده مي شود و گرنه ريرايت كانديشن دوم چك مي شود كه اين نيز مانند قبلي نام مرورگر را كنترل مي كند و مدريرايت اخر كه براي باقي مرورگرها در نظر گرفته شده يا به عنوان مثال آخر شما با استفاده از خطوط زير مي توانيد دسترسي كاربران را به تصاوير با پسوند gif يا jpg از خارج سايتتان را ببنديد
[code]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://localhost/.*$ [OR,NC]
RewriteCond %{HTTP_REFERER} !^http://mysite.com/.*$ [OR,NC]
RewriteCond %{HTTP_REFERER} !^http://www.mysite.com/.*$ [OR,NC]
RewriteRule .*\.(gif |GIF|jpg |JPG)$ http://mysite/images/bad.gif [L,R]

خوب حالا گام بعد را بر ميداريم كه آخرين گام ما در اين مقاله است فكر كنيد كه شما ده ها صفحه داريد يا هزاران برنامه فكر نمي كنم هيچ انسان (البته با IQ بالاتر از 90) پيدا شود كه بنشيند و تمامي اين فايلها و برنامه ها و صفحات را در فايلهاي پيكر بندي آپاچي ذخيره و ريرايت رول برايشان تعريف كند اما به واقع چاره چيست آيا اصلا چاره هست چه جوري مي شه اين مشكل رو حل كرد و بقول يكي از دوستان سلوووووووشن چيه؟؟؟؟
فرض مي كنيم كه شما يه ديتابيس دارين با هزار برنامه كه آدرس اون برنامه ها درون ديتابيس با يك آي دي ذخيره شده شايد بگين خوب ما اون هزارتا فايل رو داريم اما ديتا بيس رو نه منم مي گم يه برنامه با پي اچ پي بنويس كه اين كار رو برات انجام بده خوب حالا فكر مي كنم كه شما اون ديتابيس رو دارين منظورم از ديتابيس در اينجا يه فايل مثلا categoryids.txt كه اطلاعات رو داخلش اينجوري ذخيره كرديم

NetTools 3
NetTools/Messengers 34
.
.
.
[code/]
خوب حالا اين موارد را به فايل پيكربندي اصلي آپاچي اضافه مي كنيم تا با شروع به كار كردن آپاچي اين اطلاعات نيز لود بشن
[code]
RewriteMap categories txt:/path/to/file/categoryids.txt
RewriteRule ^(.*)$ open.php?categoryid=${categories:$1|0}

همونطور كه مشاهده ميشه فرامان جديدي به ميدان اومده بله ريرايت مپ كه خود نيز ده ها امكان جالب به ما مي دهد فكر مي كنم سازوكار اين دوخط هم كاملا واضح خط اول كه فايل بانك اطلاعاتي ما رو لود ميكنه و فايل دوم اون رو با استفاده از نام موجود در URL به آي دي موجود در فايل متچ مي كنه و اگر درست شد آي دي در جاي مذكور قرار مي گيرد بطور مثال يك URL برايتان در اينجا قرار مي دهم

http://www.mysite.com/NetTools/Messengers
[code/]
كه با خط زير بازنويسي ميشه
[code]
http://www.mysite.com/open.php?categoryid=34
[code/]
مثلا مي توانيد با استفاده از آن كاربران را به آينه(mirror) خود بفرستيد و بسياري امكانات جالب ديگر كه شايد خيلي از امكانات هنوز كشف و مورد استفاده قرار نگرفته باشن و در انتها براي شما چند مثال كوتاه و كارا نوشتم كه مي تونين از اونها استفاده كنين و با كمي خلاقيت چيزهاي جالبتري خلق كنين به كاراكترهايي كه آندرلاين شدن توجه كنين
[code]
http://www.mysite.com/1/2/3/details
=> content.php?category=1&subcat1=2&subcat2=3

http://www.mysite.com/bookshop/browse/bytitle
=> library.php?target=listbooks&order=title

http://www.mysite.com/bookshop/browse/byauthor
=> library.php?target=listbooks&order=author

http://www.mysite.com/bookshop/product/123
=> library.php?target=showproduct&itemid=123

http://www.mysite.com/bookshop/helpdesk/2
=> library.php?target=showhelp&page=2

http://www.mysite.com/bookshop/registration
=> library.php?target=reg

بيشتر مثالهاي اين نوشته از مقاله
mod_rewrite: A Beginner's Guide to URL Rewriting
By Tamas Turcsanyi
اقتباص گرفته شده است و روال بيان مطلب نيز بر اساس همين مقاله بوده است

خوب در پايان از خودم كه انقدر حوصله به خرج دادم و از تو 14 مقاله و 173 صفحه مطلب اين چكيده رو برايتان تهيه كردم تا حالش را ببريد واقعا سپاسگذارم و همچنين از شما كه علاقه مند بوديد تا اين همه خط نوشته را بخوانيد تا شايد كه چيزي به دانشتان افزوده گردد و سپاس گذارم از خدائي كه وجود را به من داد تا عرضه گر تحفه اي ناقابل باشم و پوزش مي طلبم بابت گزاف گويي و سخن راني هاي بي هوده كه تنها به منظور روان كردن نوشتار و سادگي مطالعه و افزايش بازدهي در فراگيري مطلبي خشك و خشن بر خود روا دانستم لازم به يادآوري مي دانم كه خوانندگان گرانقدر مي توانند سوالات احتمالي خود در انجمن هاي ايران پي اچ پي به آدرس http://www.iranphp.net مطرح نموده تا با سرعت بيشتري به پاسخهاي دقيق و مطلوب دست يابند و از ارسال نامه الكترونيكي براي بنده به منظور طرح سوالات جدا خود داري ورزند

ترجمه و گردآوري : رامين فرماني
ramin.farmani@gmail.com
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به نصب و تنظیم | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
بانكهاي اطلاعاتي تراكنشي

مي خواهم در اين مقاله برايتان از بانكهاي اطلاعاتي تراكنشي صحبت كنم در حقيقت اين نام طولاني سطح پيشرفته بانكهاي اطلاعاتي (در اينجا MySQL) است ما در اين مقاله مروري گذرا بر انواع Joinها خواهيم داشت تا اگر خدا بخواهد در پايان اين مقاله متوجه بشويم كه MySQL چيزي فراتر از يك كوري ساده و اينزرت و آپديت كردن است هم چنان مانند گذشته اساس كار بر روي راهنماي رسمي MySQL قرار دارد كه به عنوان مرجع به همه خوانندگان پيشنهاد مي شود.
در ابتدا مي خواهم برايتان كمي از جوينها بگويم بعد جوين دو تيبل را به هم و بعد چند تيبل و همينطور ادامه مي دهيم تا به يك ديدگاه كامل از جوين ها (صد البته در MySQL) برسيم:
متاسفانه اكثر كاربران تازه كار تصور مي كنند بانكهاي اطلاعاتي تفاوت چنداني با فايل ندارد و امكان بخصوصي نيز در آنها وجود ندارد در اين مقاله سعي مي كنم كمي با اين تفكر مقابله كنم و تلنگري بزنم بركساني كه هنوز احساس نياز به مطالعه يك كتاب در مورد MySQL نكردند همينجا متذكر مي شوم تمام صحبتهايي كه در اين مقاله گفته مي شود تنها نگاهي گذرا به انبوهي از قابليتها و امكانات موجود در پايگاه هاي داده مانند MySQL است و به علاقه مندان توصيه مي كنم جهت كسب اطلاعات بيشتر به منابع رسمي پايگاه هاي داده مورد نظر مراجعه كنند:
خوب حالا با هم شروع مي كنيم:
فرض بفرمائين كه دو تيبل با ساختار زير داريم

خوب حالا ما مي خواهيم با داشتن نام يك نفر نام كمپاني و آدرس او را نيز بدست آوريم به عقيده شما چكار مي توانيم بكنيم اگر تا بحال با جوين ها كار نكرده باشين راه حلي كه ارائه مي دهيد گرفتن دو كوري ساده و كنترل يك به يك ركوردهاست اما من راه بهتري پيشنهاد مي كنم ملاحضه كنين:

SELECT * FROM companies, contracts WHERE companies.company_id = contracts.company_id

خوب اين نوع جويني كه ديديد يكي از ساده ترين و پايه اي ترين انواع جوين هاست كه به اينر جوين (inner join) موسوم است همانطور كه مشاهده مي شود براي جوين كردن دو تيبل از "," استفاده كردم و هرجا ستوني را نياز داشتم با فراخواني نام تيبلش از آن استفاده كردم همانطور كه مشاهده مي كنيد روش كار بسيار ساده و واضح است شما مي توانين با اضافه كردن "AND contracts.name = 'Jay Greenspan'" به انتهاي كوري به دنبال يك نام مشخص هم بگردين.
خوب حالا مي خواهيم با همين اينر جوين چندين تيبل را به هم جوين كنيم توجه داريد كه در بيشتر مواقع نياز به متصل كردن چندين تيبل به هم داريد كه اين مهم را نيز هم اكنون به اتفاق فراميگيرم مجددا ساختاري مطابق زير در نظر بگيريد.

اگر كه بخواهيد آدرس تمامي شركتهايي كه در ايالت كاليفرنيا هستند و مشاورين متخصص دارند را بدست آوريد شما نياز به متصل كردن هر چهار تيبل به هم داريد كه اين نيز با اينر جوين به سادگي هر چه تمام تر قابل انجام است

SELECT * FROM companies, locations, experties, companies_experties WHERE state = 'CA' AND
companies_experties.expertise_id = 3 AND companies.company_id = companies_expertise.expertise_id AND
companies.company_id = location.company_id AND companies_expertise.expertise_id = expertise.expertise_id

خوب اين مثال تقريبا يك مثال پيچيده بود و اميدوارم شما را از اين نظر خسته نكرده باشم و كاملا هم متوجه قضايا و آنچه اتفاق مي افتد شده باشيد روال كار درست مانند اينر جوين قبليست و به همين دليل لزومي بر توضيح بيشتر نمي بينم بنابراين مي رويم به سراغ اوتر جوين (outer join)
مانند گذشته تصور كنيد كه دو تيبل مانند زير داريم:

خوب تيبل سمت چپ بالا نام نويسندگان كتاب است كه چنانچه متاهل باشند توسط آي دي در نظر گرفته شده به تيبل همسران در سمت راست پائين متصل مي شوند حال شما مي خواهيد نام اين نويسندگان را به همراه همسرانشان اگر متاهل باشند نمايش دهيد خوب اگر بخواهيد مانند قبل از اينر جوين استفاده كنيد داريم

SELECT * FROM contact, spouses WHERE contact.spouse_id = spouses.spouse_id

اما اين جوين اينجا به كار ما نمي آيد زيرا كه نتيجه برگشتي از جوين بالا فقط شامل رديف اول مي شود اما ما مي خواهيم نام تمامي نويسندگان چه مجرد و چه متاهل را داشته باشيم در اين مواقع ما از جوينهايي موسوم به (Left Outer Join) بهره مي گيريم كه مطابق زير استفاده مي شود :

SELECT * FROM contact LEFT JOIN spouses ON contact.spouse_id = spouses.spouse_id

Outer Joinها در پايگاه هاي اطلاعاتي مختلف متفاوت است و ممكن است جوين هايي در يكي باشد كه در ديگري وجود ندارد...
آخرين جويني كه مي خواهم برايتان توضيح دهم سلف جوين است (Self Join) فرض كنيد تيبل ما چيزي شبيه اين باشد :

خوب همانطور كه مي بينيد در اين تيبل ما چند نام داريم كه چنانچه اين افراد همسري داشته باشند آي دي همسرشان در spouse_id ذخيره شده است مي خواهيم ببينيم آيا كسي هست كه شلوارش دوتا شده باشد خوب برا اين كار ساده شايد مجبور باشيد براي هر نام يك كوري جداگانه بگيريد و به هر حال حداقل مجبوريد كه دوبار كوري بگيريد آيا راه ديگري هست؟ بله سلف جوين اين امكان را فراهم مي كند كه بسادگي اين دو كوري را در يك كوري خلاصه كنيم به كوري زير توجه نمائيد:

SELECT t1.first_name, t1.last_name, t2.first_name, t2.last_name FROM contacts t1, contacts t2 WHERE t1.spouse_id = t2.spouse_id AND t1.contact_id < t2.contact_id

تنها نكته اي كه فكر مي كنم لازم است توضيح دهم قسمت انتهايي كوري است در اين كوري چون spouse_id هر كس با خودش برابر است جز نتايج به حساب مي آورد كه اين مشكل را با قرار دادن قسمت آخر حل كرديم اما چرا بايد t1.contact_id < t2.contact_id و چرا نبايد t1.contact_id != t2.contact_id توضيح اين مطلب ساده است اگر بجاي < از != استفاده مي كرديم يك بار elliotدر t1 قرار مي گرفت و john در t2 و در نتيجه مي آمدند و بار ديگر elliot در t2 قرار مي گرفت و john در t1 و مجددا در نتيجه كوري قرار مي گرفتندند به همين جهت به جاي != از < استفاده كرده ايم
به انتها اين مقاله كوتاه رسيديم اميدوارم اين تلاش موجب فراهم آمدن تفكري تازه در شما گردد و شايد آغازگر تلاشي نو . به هرشكل تمام تلاش من بر اين بود تا با رعايت ايجاز در گفتار شما را با امكاني جديد آشنا كنم كه اميدوارم اينگونه باشد .

رامين فرماني
ramin.farmani@gmail.com
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کار با Database ها | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
مرور کلاس Config از مجموعه Pear

خب در این بحث می خوام در مورد کلاس Config صحبت کنم
فکر کنم شما هم مثل من تا به حال شده که یک کدی می نویسید که مثلا نیاز به از اطلاعات لازم برای وصل شدن به دیتابیس داره
یک روش بسیار ساده اینه که در هر صفحه ای که دارید اطلاعات رو به صورت دستی وارد کنید
حالا فکر کنید شما این کدتون رو می خواهید روی سرور اصلی می خواهید ببرید
خب اینجاست که پدرتون در میاد تا تک تک فایل های رو باز کنید و تنطیمات رو عوض کنید !
یک بار که به این مشکل بر بخورید ( من خودم تا به حال برخورد کردم که می گم البته در ASP چون زیاد وارد نبودم !) دیگه تا آخر عمر می فهمید که باید یک فایل داشته باشید که تننظیمات رو توی اون بگذارید و بالای هر صفحه ای اون فایل رو صدا بزنید مثلا :

include.php
<?
$config['DBHost']='localhost';
$config['DBUser']='root';
$config['DBPass']='';
$config['DBname']='test';
?>

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

در manual این طوری Config رو تعریف کرده :
به شما کمک می کند تا تنظیمات خود را بهتر انجام بدهید . این تنظیمات می توانند در فایل XML, آرایه ای از PHP یا در یک نوع دیتابیس باشند
من یکی از دلایلی که به این نوع ست کردن تنظیمات رو آوردم فقط به خاط XML اش بود نمی تونید باور کنید چقدر کارهای با XML ساده می شه با این کار هر کاربری اگر چه خنگ هم باشه می تونه تنظیمات رو انجام بده و همچنین به کدتون صفا می بخشه !!!

یا فرض کنید یک برنامه تحت وب دارید که نیاز به setup داره یک سری اطلاعات رو باید از کاربر بگیرید, و در فایل ذخیره کنید
خب تا گرفتن اطلاعات که مشکلی نیست وقتی می خواهید تنظیمات رو در یک فایل ذخیره کنید باید با فایل ها کناربیاید و .... این کار رو به راحتی می تونید با این کلاس انجام بدید
خلاصه کلام این که, کلاس Config کار شما رو راحت می کنه !
خب یکی از پر کاربرد ترین روش استفاده از این کلاس رو می توضیح می دم و بقیه اش توابعش دیگه با خودتون ( این کدها رو من از manual خوده pear برداشتم و در اونجا می تونید همه این کدها رو پیدا کنید)
فکر نکنم لازم به گفتن باشه که برای اینکه این کد رو بتونید اجرا کنید نیاز به دانلود کلاس Config دارید !

config-inc.php
<?
require_once 'Config.php';

$conf = new Config;
$root =& $conf->parseConfig('config.xml', 'XML');

if (PEAR::isError($root)) {
    die('Error while reading configuration: ' . $root->getMessage());
}

$settings = $root->toArray();

echo "<pre>\";
print_r($settings);
echo \"</pre>\";
?>

config.xml
<?xml version="1.0\" encoding=\"UTF-8\"?>
<conf>
<firstname>Milad</firstname>
<lastname>Rastian</lastname>
<www>http://weblog.miladmovie.com/</www>
</conf>

Export:
Array
(
[root] => Array
(
[conf] => Array
(
[firstname] => Milad
[lastname] => Rastian
[www] => http://weblog.miladmovie.com/
)
)
)

که خروجی اون شبیه بالا می شه
خب یکم توضیح :
conf$ یک شی از کلاس Config رو می سازه
در خط بعد تابع parseConfig از کلاس رو صدا می زنه و در ورودی اول آدرس فایل xml و در ورودی دوم نوع تنظیم که در اینجا همون XML هست رو ست می کنیم
در خط بعد که چک می کنه که درست تونسته فایل تنظیم رو باز کنه یا نه
در خط بعد تمام تنظیمات رو با استفاده از تابع toArray به داخل یک آرایه به نام settings$ می ریزه و شما می تونید در خروجی که به من داده ببنید تنظیمات چه جوری درآرایه قرار می گیره
مثلا اگر بخواهیم در کدمون به تنظیم firstname دست پیدا کنیم باید از کد زیر استفاده کنیم :

$settings['root']['conf']['firstname'];

این تنها یک چشمه از کارهای که Config می تونه انجام بده
یکم باش کار کنید از وقتی که گذاشتید پشیمون نمی شید!
بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
کلاس Archive_Tar از مجموعه PEAR

با این کلاس Archive_Tar خیلی حال کردم یک جا بود که من باید چندتا فایل رو کپی گرفتم و در یک بسته می گذاشتمش یک گوشه !
همون طور که می دونید gz فقط یک فایل رو فشرده می کنه ! یعنی باید اولش اگر یک شاخه یا چند تا فایل رو دارید تبدیل به یک بسته آرشیو کنید(tar) بعد اون رو زیپ کنید ( البته راه های هم هست که هر دو کار رو با هم انجام داد که آلان بحث ما یک چیز دیگست ! )
11 تا متد داره که مهمترینش عبارت اند از :

Archive_Tar::Archive_Tar() -- سازنده کلاس
Archive_Tar::add() -- اضافه کردن فایل یا شاخه به فایل
Archive_Tar::create() -- ایجاد فایل آرشیو
Archive_Tar::extract() -- باز کردن فایل ارشیو
Archive_Tar::listContent() -- لیست فایل های موجود در فایل آرشیو را بر می گرداند

خوشبختانه این کلاس بسیار ارزش مند اصلا نیازی به هیچ کلاسی نداره ولی خوب باید حتما فایل PEAR.php در سرور وجود داشته باشه ( که معولا وجود داره)
خب اینجاست که دیگه باید از خودم یک مثال از خودم در بیارم که همه متدها رو در یک کد توضیح بدم
فرض کنیم که یک شاخه داریم شبیه شکل زیر :

web/index.html
web/images/header.gif
web/images/footer.gif
web/css/style.css

testTAR.php
<?
require_once 'Archive/Tar.php';

//constructor of Archive_Tar
//Parameters $p_compress (2) by default is false, if we set it true the archive file will be compressed
$file_archive=new Archive_Tar("tarname.tar.gz\",true);

//set $files_name as array
$files_name=array();
//set file to archive
$files_name[0]=\"web/index.html\";
//set directory to archive
$files_name[1]=\"web/css/\";

//create tarname.tar.gz with
$file_archive->create($files_name);
//now tarname.tar.gz contain 1 files and 1 directory

//now we add 1 new direcory to our archive
$files_name=array();
$files_name[0]=\"web/images/\";

//add that directory to tarname.tar.gz
$file_archive->add($files_name);

//extract file to selectiob folder
$result = $file_archive->extract('extract');

//print array of file content
print_r($file_archive->listContent());
?>

فکر نکنم نیاز به توضیح داشته باشه دیگه !؟
در صورتی که ورودی دوم سازنده این کلاس رو مقدار دهی نکنیم این فایل فقط آرشیو می شود و فشرده نمی شه برای اینکه فشرده هم بشه باید مقدار true رو برای اون بفرستیم
یک لیست از فایل ها و شاخه های رو که می خواهیم آرشیو بشه در یک آرایه قرار می دهیم و بعد این آریه رو به متد create می دهیم تا یک فایل آرشیو درست کنه
همچنین درصورتی که بخواهیم بعد از ایجا فایل آرشیو, فایل یا شاخه ای رو به فایل آرشیو اضافه کنیم از متد add استفاده می کنیم
و در پایان هم با استفاده از متد extract و ورودی که بهش می دهیم مشخص می کنیم فایل آرشیو در کجا باز بشه
خط آخر هم به ما آرایه ای می ده که شامل مشخصات فایل ها ی موجود در فایل آرشیو است که نمونه ای از اون رو می تونید در زیر ببنید :

Array
(
[0] => Array
(
[checksum] => 3452
[filename] => web/index.html
[mode] => 33206
[uid] => 0
[gid] => 0
[size] => 0
[mtime] => 1126089004
[typeflag] =>
)

[1] => Array
(
[checksum] => 2854
[filename] => web/css/
[mode] => 16895
[uid] => 0
[gid] => 0
[size] => 0
[mtime] => 1126089594
[typeflag] => 5
)

[2] => Array
(
[checksum] => 3749
[filename] => web/css/style.css
[mode] => 33206
[uid] => 0
[gid] => 0
[size] => 0
[mtime] => 1126089596
[typeflag] =>
)

[3] => Array
(
[checksum] => 3152
[filename] => web/images/
[mode] => 16895
[uid] => 0

[gid] => 0
[size] => 0
[mtime] => 1126089010
[typeflag] => 5
)

[4] => Array
(
[checksum] => 4086
[filename] => web/images/header.gif
[mode] => 33206
[uid] => 0
[gid] => 0
[size] => 0
[mtime] => 1126089014
[typeflag] =>
)

[5] => Array
(
[checksum] => 4111
[filename] => web/images/footer.gif
[mode] => 33206
[uid] => 0
[gid] => 0
[size] => 0
[mtime] => 1126089232
[typeflag] =>
)

)

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]


شناسه کاربری

واژه رمز

واژه رمز را فراموش کرده اید ؟

عضو شوید
امکانات سایت
صفحه اول لینک ها دريافت فايل انجمن ها مقالات پرسش هاي همه گانی همه پرسي وبلاگ صفحه اول بخش های دیگر
نگاهی به امنیت کوکیها و session ها

در رابطه استفاده کوکی و session و توابع و کار با اونها تقریبا همه کسانی که با php کار می کنند اطلاعاتی دارند و هر php نویسی حداقل یکبار از آن اسفتاده کرده است. اما حالا میخواهیم با هم یه نگاه دیگه به این دو تا مورد که از لحاظ امنیتی خیلی حساسند بندازیم.

بخش اسکوب در کوکی را بخاطر می آوریم. مثلا من میخواهم کوکی من در فقط مورد استفاده این فایلهای پوشه /test ، پس در بخش اسکوب می نویسم : /test اما نکته ای که توجه ندارم ایه که دوست هکر ما میتونه از فایل /test.php هم اطلاعات کوکی را بخونه و یا فایلهای /test/tmp/haha.php و /test2.php.... پس باید در اسکوپ بنویسم : "/test/"

حالااگر بخواهیم کوکی مورد استفاده فایل خاصی مثل /test/cookie.php قراربگیره مینویسیم "/test/cookie.php" و درست هم مینویسیم اما اگر دوست هکر ما دوست داشته باشه از فایل /test/cookie.php-dir/haha.php اطلاعات کوکی رو بخونه ما میتونیم چیکار کنیم؟؟؟

یه راهش دستکاری تو Apache و اینکه اصلا این دوست ما دستش به اینجور فایلها نرسه که یه مقاله تو مقالات دراین باره هست.

حالا اگه خود client هک بشه و کوکی خونده بشه چی؟؟ حالا به اهمیت رمزنگاری در کوکی پی می بریم.چون اصلا اگر هکر عزیز دستش به کوکی برسه هم نمی تونه جیزی سر در بیاره!!!! درباره رمز نگاری هم که خودتون استادید و می دونید چه قدر تابع تو php در اینباره هست.

اما هنوز یه نکته کوچولو تو بخش اسکوب مونده و اون اینه که من می خوام کوکی فقط تو سایت خودم کار کنه.. پس حق دارم بنوسم : "/tesr/","test.com" اما چرا دوست ما نباید بتونه از سایت hahatest.com با کوکی ما بازی در نیاره.. پس گزینه ای که کد شما رو حرفه ای جلوه می ده اینه : ".test.com" اما ممکنه این هکر سمج بخواد از طریق www2.test.com رو کوکی ما بازی کنه.. پس شاید کد امنتر شما دیگه بتونید بنویسید...

و اما در آخر شاید سایت شما نخواهد هیچ ریسکی رو تقبل کنه .. حالا دیگه وقته کار با SSL هست. اما کار کوکی با SSL لازم اینه که در آخر تابع setCookie یه عدد "1" بنویسید و خودتون می دونید که که هنگامی که با SSL سایت شما به صورت https://test.com درمیاد.

واما کمی کار با session ...ببینید session ها خطر پذیرند و نمیشه برای یه سایت امن کاملا روی اونها حساب کرد ، مگر با ذکر دو سه تا نکته..

کلا session ها در پوشه /tmp ویا windows/temp ساخته میشن و این اساس خطر پذیری اونهاست. پس یه کار خوب ساخت session توی پوشه دلخواه است.

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

اما نکته ای که ممکنه در نظر گرفته نشه استفاده از دو تابع خیلی مفید string session_encode و bool session_decode هست که خیلی مفیده و php>=4 را ساپورت میکنه.

حالا کار خوب نوشتن یه پروژه کامل با استفاده از کوکی و session و دیتابیس است که مطالبو جابندازه.فقط در آخر بگم که اینها مراحل تکمیل امنیت پروژه بود و در هر مرحله مار امنتر میشد و همه میدانیم همه سایتها نیاز به SSL ندارند.

بازگشت به صفحه اصلی مقالات بازگشت به صفحه اصلی مقالات
[ باز گشت به کاربردی | بازگشت به صفحه اصلی مقالات | نسخه قابل چاپ ]