آموزشphp به زبان ساده
تبدیل سبد خرید به حالت داینامیک3
جلسه ی هفتم طراحی یک فروشگاه اینترنتی-تبدیل سبد خرید به حالت داینامیک(3)
در قسمت هفتم از این جلسه، به آموزش 'تبدیل سبد خرید به حالت داینامیک(3)' خواهیم پرداخت.
آنچه که در قسمت قبل طراحی شد
در قسمت قبل، موارد کلی زیر آموزش داده شدند:
- تبدیل سبد خرید از حالت استاتیک به داینامیک
مشاهده ی آنچه که در قسمت قبل طراحی شد:
آنچه که در قسمت 'تبدیل سبد خرید به حالت داینامیک(3)' خواهید آموخت
در قسمت 'تبدیل سبد خرید به حالت داینامیک(3)' موارد زیر آموزش داده خواهند شد:
توضیح اجمالی:
- ادامه ی تبدیل سبد خرید از حالت استاتیک به داینامیک
توضیح تفصیلی:
- ایجاد یک فیلد جدید برای سبد خرید که مشخص کننده ی قیمت است.
- نحوه ی ایجاد یک li جدید به هنگام افزودن یک کالای جدید به سبد خرید.
- استخراج اطلاعات محصول از خود محصول نمایش داده شده.
- اختصاص یک id یا کلاس به محصولات
و...
تبدیل سبد خرید به حالت داینامیک(3)
به سبد خریدمان دوباره نگاهی می اندازیم تا ببینیم که چه کارهای دیگری را باید بر روی آن انجام بدهبم. همان طور که در تصویر زیر مشاهده می کنید، در مکان مشخص شده به یک فیلد دیگر احتیاج داریم که علاوه بر تصویر محصول، و اسم محصول، و تعداد محصول، قیمت هر محصول را هم نشان بدهد:
یعنی دقیقا همین چیزی که در تصویر زیر می بینید:
بنابراین می خواهیم این فیلد قیمت را هم به سادگی، به سبد خرید اضافه کنیم. پس نرم افزار دریم ویور را باز می کنیم و سایتی که بر روی آن کار می کردیم را می آوریم:
فایل هایی که با آنها کار داریم عبارتند از فایل left.php و top.php پس آنها را باز می کنیم. در بحث سبد خرید، ما فقط با این دو فایل کار داشتیم چون فایل left.php فایلی بود که بخش پرفروش ترین کالاها را دربر داشت و فایل top.php هم که سبد خرید ما بود. حالا به داخل فایل top.php می رویم و در جایی که اطلاعات سبد خرید را(کالاهای موجود در سبد خرید کاربر را) از دیتابیس دریافت می کردیم، اکنون می خواهیم قیمت را هم از دیتابیس بگیریم و مشابه با تعداد محصولات در سبد خرید، آن را هم نمایش بدهیم. بنابراین فایل top.php را باز می کنیم و کدهای زیر را می آوریم:
دسترسی به موارد آموزشی بالا در بسته ی خریداری شده:
- شماره جلسه: 7
- نام فایل ویدئو: 29
- فرمت فایل: mp4.
نقطه ی شروع بحث بالا (تبدیل سبد خرید به حالت داینامیک3) در ویدئو: 00:10
تبدیل سبد خرید به حالت داینامیک4
جلسه ی هشتم طراحی یک فروشگاه اینترنتی-تبدیل سبد خرید به حالت داینامیک(4)
در قسمت هشتم از این جلسه، به آموزش 'تبدیل سبد خرید به حالت داینامیک(4)' خواهیم پرداخت.
آنچه که در قسمت قبل طراحی شد
در قسمت قبل، موارد کلی زیر آموزش داده شدند:
- تبدیل سبد خرید از حالت استاتیک به داینامیک
مشاهده ی آنچه که در قسمت قبل طراحی شد:
آنچه که در قسمت 'تبدیل سبد خرید به حالت داینامیک(4)' خواهید آموخت
در قسمت 'تبدیل سبد خرید به حالت داینامیک(4)' موارد زیر آموزش داده خواهند شد:
توضیح اجمالی:
- ادامه ی تبدیل سبد خرید از حالت استاتیک به داینامیک
توضیح تفصیلی:
- اضافه کردن یک بخش جدید به سبد خرید
- نشان دادن تعداد کل کالاهای سبد خرید به کاربر
- نحوه ی نمایش دادن جمع کل قیمت محصولات موجود در سبد خرید
- نحوه ی ایجاد دکمه ی تسویه حساب سبد خرید
تبدیل سبد خرید به حالت داینامیک(4)
کار دیگری که الان باید انجام دهیم این است که، این بخش پایین را ایجاد کنیم:
یعنی درواقع بخشی را ایجاد کنیم که، هم جمع کل قیمت را نشان بدهد و هم دکمه ی تسویه حساب.
این بخش را همان طوری که مشخص است، باید در داخل div سبدی که قبلا ساخته بودیم اضافه کنیم. فقط یک نکته ای وجود دارد که ما باید به آن توجه داشته باشم. قبلا در ابتدا ما یک div را ساختیم تحت عنوان sabad، اجازه بدهید که ابتدا به داخل نرم افزار دریم ویور برویم تا بهتر متوجه موضوع بشویم:
همان طور که در تصویر بالا می بینید، ما قبلا یک div را تحت عنوان sabad ساخته بودیم. در داخل این دایو sabad، ابتدا آمدیم و علامت مثلث را قرار دادیم با استفاده از یک تگ img . و بعد یک قسمت دیگری را تحت عنوان sabad1 ایجاد کردیم که در داخل آن با استفاده از تگ ul تگ های li را echo کردیم ومحصولاتمان را داخل sabad1 نشان دادیم:
حالا سوال اینجاست که، ما باید قسمتی که مربوط به دکمه ی نمایش کل قیمت، و دکمه ی تسویه حساب است را در کدام یک از این بخش ها قرار دهیم؟ آیا باید آن را در داخل عنصر دیو sabad قرار دهیم یا داخل دیو با آی دی sabad1 ؟
در واقع باید در کجا کدنویسی آن را انجام دهیم؟
اگر که یک مقدار به محل قرار گیری این بخش دقت کنیم، می توانیم جواب را به سادگی متوجه شویم. همان طور که در تصویر زیر مشاهده می کنید، زمانی که ما در اینجا، اسکرول را با سمت بالا یا پایین می آوریم، قسمت نشان داده شده در عکس زیر ثابت است. یعنی قرار نیست محل قرار گیری این قسمت عوض شود:
دسترسی به موارد آموزشی بالا در بسته ی خریداری شده:
- شماره جلسه: 8
- نام فایل ویدئو: 30
- فرمت فایل: mp4.
نقطه ی شروع بحث بالا (تبدیل سبد خرید به حالت داینامیک4) در ویدئو: 07:29
تجرد یا abstract در PHP
تجرد یا Abstract:
تجرد یا Abstract موقعی استفاده می شود که بخواهیم کلاس یا تابعی را بدون داشتن بدنه تعریف کنیم و بخواهیم بدنه آن را بعداً تعریف کنیم.
به عنوان مثال اگر بخواهیم چندین کلاس مختلف برای کار با دیتابیس های مختلف در برنامه تعریف کنیم که در آن برخی کارها یکسان می باشد؛ میتوانیم یک کلاس abstract برای تعریف اولیه و توابع یکسان آنها تعریف کنیم و سپس به نسبت هر دیتابیس توابع مخصوص آن را فراخوانی کرد.
مزیت های استفاده از abstarct:
- کم تر شدن کدهای نوشته شده
- افزایش سرعت برنامه
- روان تر و خواناتر بودن کدها
مثال:
<?php
abstract class Base_DB{
private $id;
abstract function update($data,$id);
abstract function insert($data);
function save($data){
if(is_null($this->id)){
$this->insert($data);
}else{
$this->update($data,$this->id);
}
}
}
class MySQL_DB extends Base_DB{
function update($data,$id)
{
// کدهای مربوط به ویرایش
}
function insert($data)
{
// کدهای مربوط به درج کردن
}
}
class Oracle_DB extends Base_DB{
function update($data,$id)
{
// کدهای مربوط به ویرایش
}
function insert($data)
{
// کدهای مربوط به درج کردن
}
}
؟>با کمک کلاس های MySQL_DB و Oracle_DB که در بالا تعریف شد می توان با تابع save و یا هر تابع دیگری کارهای مربوطه را انجام داد؛ توجه داشته باشید که توابع update و insert که در کلاس Base_DB به صورت abstract تعریف شده اند باید در کلاسهایی که از آن سرچشمه می گیرند تعریف شده باشند.
interface
کلاسهایی که به صورت interface تعریف می شوند تقریباً همانند کلاس هایی هستند که به صورت abstract تعریف می شوند اما نحوه تعریف و استفاده آنها متفاوت می باشد.
مثال:
<?php
interface class Base_DB {
public function update($data,$id);
public function insert($data);
}
class MySQL_DB implements Base_DB{
function update($data,$id)
{
// کدهای مربوط به ویرایش
}
function insert($data)
{
// کدهای مربوط به درج کردن
}
}
class Oracle_DB implements Base_DB{
function update($data,$id)
{
// کدهای مربوط به ویرایش
}
function insert($data)
{
// کدهای مربوط به درج کردن
}
}
؟>توجه داشته باشید که کلاسهایی که به صورت interface تعریف می شوند نباید شامل بدنه یک تابع باشند؛ در صورتی که کلاس های abstract می توانستند ادغامی از توابع معمولی و توابع abstract شوند.
به این نکته نیز توجه داشته باشید که کلاسهای interface بجای extends با implements توسعه می یابند.تشخیص کلاس یک شئ
در برنامه نویسی توجه به این نکته که آیا شئ مورد نظر از کلاس مد نظر ما ساخته شده است یا نه نکته ای است که کاربرد های زیادی دارد.
برای این منظور می توان از دستور instanceof استفاده کرد؛
instanceof همچنین برای کلاس هایی که از یک کلاس دیگر ارث بری کرده اند نیز استفاده می شود؛
مثال:
<?php
class Parent
{
// ...
}
class PLUS extends Parent
{
// ...
}
$test = new PLUS();
if($test instanceof PLUS)
{
echo "test comes from PLUS....<br />";
}
if($test instanceof Parent)
{
echo "test comes from Parent....<br />";
}
?>خروجی کد بالا:
test comes from PLUS....
test comes from Parent....همانطور که در مثال بالا دیده میشود test$ هم از نوع PLUS است و هم از نوع Parent!
تجزیه کننده dom چیست؟
تجزیه کننده DOM چیست؟
یک سری اشیاء استاندارد برای دسترسی و دستگاری فایل های HTML و XML فراهم می کند و در سه بخش زیر مجزا شده است:
- هسته DOM: یک سری اشیاء استاندارد برای فایل های ساخت یافته تعریف می کند.
- XML DOM: یک سری اشیاء استاندارد برای فایل های XML تعریف می کند.
- HTML DOM: یک سری اشیاء استاندارد برای فایل های HTML تعریف می کند.
تجزیه کننده XML
برای خواندن، ویرایش کردن، ایجاد و خلاصه دستگاری یک فایل XML، به یک تجزیه کننده XML نیاز داریم.
به صورت کلی دو نوع تجزیه کننده XML وجود دارد:
- تجزیه کننده درختی: این تجزیه کننده فایل XML را به یک ساختار درختی منتقل می کند و تمام فایل را تحلیل کرده و دسترسی به عناصر درخت را فراهم می کند.
- تجزیه کننده رویدادی: یک فایل XML را به صورت یک سری از رویدادها می بیند و زمانی که یک رویداد خاص اتفاق می افتد، یک تابع را برای بررسی آن صدا می زند.
تجزیه کننده DOM از نوع درختی است.
به فایل XML زیر توجه کنید:
<?xml version="1.0" encoding="ISO-8859-1"?>
<from>Amir</from>تجزیه کننده DOM فایل XML بالا را به صورت زیر می بیند(سه سطح):
- سطح اول درخت: یک فایل XML را مشخص می کند.
- سطح دوم درخت: ریشه عنصر را مشخص می کند که تگ <from> است.
- سطح سوم درخت: متن عنصر که کلمه "Amir" است.
نصب تجزیه کننده XML
توابع تجزیه کننده DOM قسمتی از هسته PHP هستند و نیازی به نصب وجود ندارد.
فایل XML زیر در مثال های آینده استفاده خواهد شد:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>لود و چاپ یک فایل XML
مثال:در مثال زیرمی خواهیم یک تجزیه کننده XML تعریف کرده و فایل XML بالا را داخل آن لود کنیم و سپس در خروجی چاپ کنیم:
<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load("note.xml");
print $xmlDoc->saveXML();
?>خروجی کد بالا:
ToveJaniReminderDon't forget me this weekend!
اگر در Browser ویندوزتان گزینه "View source" را انتخاب کنید، فایل HTML زیر را خواهید دید:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>مثال بالا یک شی از DOMDocument ایجاد می کند و فایل "note.xml" را داخل آن لود می کند.
سپس تابع ()saveXML فایل XML لود شده را داخل یک رشته قرار می دهد، حالا می توانیم آنرا در خروجی چاپ کنیم.
حلقه زدن در یک فایل XML
مثال: در مثال زیر می خواهیم یک تجزیه کننده XML تعریف کنیم و فایل XML قبلی را در آن لود کرده و بین عناصر آن یک حلقه بزینم:
<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load("note.xml");
$x = $xmlDoc->documentElement;
foreach ($x->childNodes AS $item)
{
print $item->nodeName . " = " . $item->nodeValue . "<br />";
}
?>خروجی کد بالا:
#text =
to = Tove
#text =
from = Jani
#text =
heading = Reminder
#text =
body = Don't forget me this weekend!
#text =در مثال بالا می بینید که بین هر عنصر یک نود خالی وجود دارد.
در زمان ایجاد یک فایل XML، در بین نودهای آن فضاهای خالی قرار می گیرد، تجزیه کننده XML با این فضاهای خالی مانند یک عنصر معمولی برخورد می کند و اگر مراقب آنها نباشید، برای شما مشکل ایجاد خواهند کرد.
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
تجزیه کننده expat چیست؟
XML چیست؟
XML برای شرح و بیان اطلاعات طراحی شده است، در واقع ساختار اطلاعات را شرح می دهد.
در XML هیچ تگ از پیش تعریف شده ای وجود ندارد، و باید خودمان تگ ها را تعریف کنیم.
تجزیه کننده Expat چیست؟
برای خواندن، ویرایش کردن، ایجاد و خلاصه دستگاری یک فایل XML، به یک تجزیه کننده XML نیاز داریم.
به صورت کلی دو نوع تجزیه کننده XML وجود دارد:
- تجزیه کننده درختی: این تجزیه کننده فایل XML را به یک ساختار درختی منتقل می کند و تمام فایل را تحلیل کرده و دسترسی به عناصر درخت را فراهم می کند.(همان طور که قبلاً گفته شد تجزیه کننده DOM از نوع درختی است)
- تجزیه کننده رویدادی: یک فایل XML را به صورت یک سری از رویدادها می بیند و زمانی که یک رویداد خاص اتفاق می افتد، یک تابع را برای بررسی آن صدا می زند.
تجزیه کننده Expat از نوع رویدادی است.
نکته: تجزیه کننده رویدادی، به جای اینکه روی ساختار تمرکز کند روی محتوای یک فایل XML تمرکز می کند، به همین خاطر دسترسی به اطلاعات در این نوع تجزیه کننده سریع تر است.
به فایل XML زیر توجه کنید:
<from>Amir</from>
یک تجزیه کننده رویدادی فایل XML بالا را به صورت سه رویداد زیر گزارش می دهد:
- شروع عنصر: from
- شروع بخص اطلاعات با مقدار: "Amir"
- بستن عنصر: form
مثال XML بالا با یک فرمت درست نوشته شده است، اما به خاطر اینکه DTD ندارد، معتبر نیست.
نکته: DTD یا Document Type Definition مشخص کننده قوانین به کار رفته در یک سند است، به این قوانین الگو می گویند، الگوها ابزارهای مهمی برای نگهداری پیوستگی اسناد محسوب می گردند. با مقایسه سند معینی با الگوی آن اعتبار آن سند تعیین می شود. اگر یک سند با تمام قوانین موجود در الگوی آن مطابقت داشته باشد به آن یک سند معتبر می گویند. معتبر بودن یک سند نشانه مطلوب بودن داده های آن است.
تجزیه کننده Expat یک تجزیه کننده بدون اعتبار است، و برای آن فرقی نمی کند که سند شنا از DTD استفاده کرده یا نه!
سند XML شما باید در یک فرمت درست نوشته شده باشد والا تجزیه کننده Expat خطایی نمایش خواهد داد.
نصب تجزیه کننده Expat
توابع تجزیه کننده Expat قسمتی از هسته PHP هستند و نیازی به نصب وجود ندارد.
فایل XML زیر در مثال های آینده استفاده خواهد شد:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>اعلان یک تجزیه کننده XML
در PHP می توانیم یک تجزیه کننده XML را اعلان کنیم، برای رویدادهای مختلف، تعدادی رسیدگی کننده (Handler) تعریف می شود و سپس فایل XML را تحزیه می کنیم.
مثال:
<?php
//Initialize the XML parser
$parser=xml_parser_create();
//Function to use at the start of an element
function start($parser,$element_name,$element_attrs)
{
switch($element_name)
{
case "NOTE": echo "-- Note --<br />"; break;
case "TO": echo "To: "; break;
case "FROM": echo "From: "; break;
case "HEADING": echo "Heading: "; break;
case "BODY": echo "Message: ";
}
}
//Function to use at the end of an element
function stop($parser,$element_name)
{
echo "<br />";
}
//Function to use when finding character data
function char($parser,$data)
{
echo $data;
}
//Specify element handler
xml_set_element_handler($parser,"start","stop");
//Specify data handler
xml_set_character_data_handler($parser,"char");
//Open XML file
$fp=fopen("test.xml","r");
//Read data
while ($data=fread($fp,4096))
{
xml_parse($parser,$data,feof($fp)) or die (sprintf("XML Error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
//Free the XML parser
xml_parser_free($parser);
?>خروجی کد بالا:
-- Note --
To: Tove
From: Jani
Heading: Reminder
Message: Don't forget me this weekend!توضیح مثال بالا:
- تابع ()xml_parser_create یک تجزیه کننده XML را اعلان می کند.
- تابع start به عنوان رسیدگی کننده به رویدادهای مختلف ایجاد شده است.
- تابع ()xml_set_element_handler مشخص می کند، زمانی که تجزیه کننده با تگ باز و بسته مواجه شد، کدام تابع اجرا شود.
- تابع ()xml_set_character_data_handler مشخص می کند، زمانی که تجزیه کننده با اطلاعات مواجه شد، کدام تابع اجرا شود.
- تابع ()xml_parse فایل "test.xml" را تجزیه می کند.
- در صورتی که خطایی رخ دهد، تابع ()xml_error_string خطای گزارش شده را به شرحی مناسب تبدیل می کند.
- در آخر تابع ()xml_parser_free حافظه اختاص داده شده به تجزه کننده را آزاد می کند.
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
تعریف توابع در PHP
تعریف توابع در PHP
قدرت واقعی PHPدر توابع آن است، در PHP بیش از 1000 تابع از قبل نوشته شده وجود دارد.
در این فصل به شما نشان خواهیم داد که در PHP چگونه می توانید توابع خودتان را تعریف کنید.
یک تابع به وسیله صدا زدن آن اجرا خواهد شد، شما می توانید از هر جای صفحه آنرا صدا بزنید.
نحوه تعریف توابع:
function functionName()
{
code to be executed;
}توجه:برای نامگذاری توابع موارد زیر را در نظر داشته باشید:
- اسامی توابع به نحوی انتخاب شوند که نام انتخاب شده معرفی کننده عملی باشد که تابع انجام می دهد
- نام تابع می تواند با حروف و یا علامت "_" شروع شود(با عدد نمی تواند شروع شود).
مثال: یک تابع ساده که با صدا زدن آن نام من چاپ می شود:
<html>
<body>
<?php
function writeName()
{
echo "pahlavan sadegh";
}
echo "My name is ";
writeName();
?>
</body>
</html>خروجی کد بالا:
My name is pahlavan sadegh
ارسال پارامتر به توابع
یک پارامتر چیزی شبیه یک متغیر است، پارامترها بعد از نام تابع داخل پرانتز تعریف می شوند.
مثال1: در مثال زیر با ارسال نام شخص به تابع، بعد از صدا زدن تابع، نام های مختلف با فامیلی یکسان چاپ می شود.
<html>
<body>
<?php
function writeName($fname)
{
echo $fname . " Ahmadi.<br />";
}
echo "My name is ";
writeName("Ali");
echo "My sister's name is ";
writeName("Sara");
echo "My brother's name is ";
writeName("Amir");
?>
</body>
</html>خروجی کد بالا:
My name is Ali Ahmadi.
My sister's name is Sara Ahmadi.
My brother's name is Amir Ahmadi.مثال2: تابع زیر دو پارامتر دارد.
<html>
<body>
<?php
function addNumbers($a , $b)
{
$sum = $a + $b;
echo $sum;
}
addNumbers(100,200);
؟>
</body>
</html>خروجی کد بالا:
300
نکته: به صورت پیش فرض پارامترهایی که به توابع ارسال می شوند، طوری هستند که در صورتی که در تابع تغییر کنند مقدار اصلی آنها تغییری نخواهد کرد و به همان صورت باقی خواهند ماند، اما اگر در تعریف تابع قبل از اسم متغیر از علامت "&" استفاده کنیم، این ویژگی تغییر می کند یعنی با تغییر یک متغیر در درون تابع، اصل متغیر هم تغییر خواهد نمود، به مثال زیر توجه کنید.
مثال:
<html>
<body>
<?php
function changeit(&$string)
{
echo "String is: " . $string . '<br />';
$string="Learning PHP";
echo "String Changed to: " . $string . '<br />';
}
$str="PLUS";
changeit($str);
echo $str;
?>
</body>
</html>خروجی کد بالا:
String is: PLUS
String Changed to: Learning PHP
Learning PHPبازگرداندن یک مقدار توسط توابع
شما می توانید از دستور return برای بازگرداندن یک مقدار استفاده کنید، یعنی کافی است نتیجه را جلوی دستور return قرار دهید.
مثال:
<html>
<body>
<?php
function add($x,$y)
{
$total=$x+$y;
return $total;
}
echo "1 + 16 = " . add(1,16);
?>
</body>
</html>خروجی کد بالا:
1 + 16 = 17
توابع از پیش تعریف شده:
در php بیش از 5300 تابع از پیش تعریف شده وجود دارد که البته برای اجرای آنها ممکن است در ورژن های مختلف برخی توابع وجود نداشته باشند و یا برای اجرای بعضی توابع احتیاج باشد تا extension خاصی نصب باشد.
توابع از پیش تعریف شده همانند توابعی که کاربر تعریف می کند اجرا می شوند.برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
تفاوت دستور echo و print
در PHPدو روش اصلی برای چاپ وجود دارد: echo و print
تقریباً در هر مثالی از این بیاموز از echo (و print) استفاده شده است. بنابراین در این مطلب سعی شده است تا در این باره مقداری بیشتر توضیح داده شود.
دستور echo و print در PHP
تفاوت های echo و print:
- echo: یک یا بیشتر از یک آرگومان را می گیرد و مقداری را برنمی گرداند. برای اتصال دو رشته هم می توان از "." و هم از "," استفاده کرد.
- print: تنها یک آرگومان را می گیرد و همیشه مقدار 1 را برمی گرداند. برای اتصال دو رشته فقط می توان از "." استفاده کرد.
شباهت های echo و print:
- هر دو تابع نیستند.
- جزئی از ساختار زبانی هستند و می توان از آنها با یا بدون پرانتز استفاده نمود.
نکته: echo سرعت بیشتری نسبت به print دارد.
دستور echo در PHP
نمایش رشته ها
در مثال زیر، نحوه نمایش رشته های مختلف با استفاده از دستور echo نشان داده شده است: (همچنین توجه داشته باشید که رشته چاپ شده می تواند شامل تگ های HTML باشد)
مثال (تفاوت دستور echo و print)
<?php
echo "<h2>PHP is fun!</h2>";
echo "Hello world!<br>";
echo "I'm about to learn PHP!<br>";
echo "This", " string", " was", " made", " with multiple parameters.";
?>خروجی کد بالا:
PHP is fun! Hello world!
I'm about to learn PHP!
This string was made with multiple parameters.نمایش متغیرها
در مثال زیر، نحوه ی چاپ رشته ها و متغیر ها با دستور echo نشان داده شده است:
مثال (تفاوت دستور echo و print)
<?php
$txt1="Learn PHP";
$txt2="Beyamooz.com";
$cars=array("Volvo","BMW","Toyota");
echo $txt1;
echo "<br>";
echo "Study PHP at $txt2";
echo "My car is a {$cars[0]}";
?>خروجی کد بالا:
Learn PHP
Study PHP at Beyamooz.com
My car is a Volvoتوجه: اگر متغییری درون علامت " قرار بگیرد مقدار متغییر به جای آن قرار می گیرد. اما اگر درون علامت ' قرار بگیرد مقدار متغییر جایگزین نمی شود.
دستور print در PHP
نمایش رشته ها
در مثال زیر، نحوه نمایش رشته های مختلف با استفاده از دستور print نشان داده شده است: (همچنین توجه داشته باشید که رشته چاپ شده می تواند شامل تگ های HTML باشد)
مثال (تفاوت دستور echo و print)
<?php
print "<h2>PHP is fun!</h2>";
print "Hello world!<br>";
print "I'm about to learn PHP!";
?>خروجی کد بالا:
PHP is fun! Hello world!
I'm about to learn PHP!نمایش متغیرها
در مثال زیر، نحوه ی چاپ رشته ها و متغیر ها با دستور print نشان داده شده است:
مثال (تفاوت دستور echo و print)
<?php
$txt1="Learn PHP";
$txt2="Beyamooz.com";
$cars=array("Volvo","BMW","Toyota");
print $txt1;
print "<br>";
print "Study PHP at $txt2";
print "My car is a {$cars[0]}";
?>خروجی کد بالا:
Learn PHP
Study PHP at Beyamooz.com
My car is a Volvoبرای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
توابع کار با فایل ها در PHP
مقدمه ی توابع کار با فایل ها در PHP یا (Filesystem)
توابع مربوط به فایل ها در PHPبه شما امکان می دهند تا filesystem را دستکاری کرده و تغییر دهید.
نحوه نصب کردن
توابع filesystem جزئی از هسته ی php هستند. و نیازی نیست تا برای استفاده از این توابع آنها را نصب کنید.
توابع filesystem در php5
تابع توضیحات basename تابع ()basename، نام فایل مورد نظر را از یک مسیر، برمی گرداند.
chgrp تابع ()chgrp درواقع usergroup را از فایل مشخص شده تغییر می دهد.
chmod تابع ()chmod دسترسی های یک فایل مشخص را تغییر می دهد.
chown تابع ()chown مالکیت یک فایل مشخص را تغییر می دهد.
clearstatcache تابع ()clearstatcatche درواقع وضعیت کش شدن فایل را مشخص می کند.
copy تابع ()copy یک فایل را کپی می کند.
delete به جای آن به تابع unlink یا unset مراجعه کنید.
dirname تابع ()dirname، نام دایرکتوری را از یک مسیر برمی گرداند.
disk_free_space تابع ()disk_free_space از یک دایرکتوری مشخص، مقدار فضای خالی را به بایت برمی گرداند.
disk_total_space تابع ()disk_total_space فضای کلی یک دایرکتوری مشخص را با بایت برمی گرداند.
diskfreespace یک نام مستعار تابع disk_free_space است.
fclose تابع ()fclose یک فایل باز شده را می بندد.
feof تابع ()feof بررسی می کند که آیا به EOF رسیده ایم یا نه.
fflush تابع ()fflush تمام خروجی بافر شده را دریک فایل باز شده(open) می نویسد.
fgetc تابع ()fgetc یک کاراکتر تکی از یک فایل باز شده را برمی گرداند.
fgetcsv تابع ()fgetcsv یک خط از داده های یک فایل باز شده ی csv را تجزیه می کند.
fgets تابع ()fgets یک خط از یک فایل باز شده را برمی گرداند.
fgetss تابع ()fgetss از یک فایل باز شده، یک خط را برمی گرداند به طوری که تگ های HTML و PHP آن خذف شده اند.
file تابع ()file یک فایل را درون یک آرایه، می خواند.
file_exists تابع ()file_exists بررسی می کند که آیا یک فایل یا یک دایرکتوری، موجود است یا نه.
file_get_contents تابع ()file_get_contents یک فایل را در یک رشته می خواند.
file_put_contents تابع ()file_put_contents یک رشته را درون یک فایل می نویسد.
fileatime تابع ()fileatime زمان آخرین دسترسی به یک فایل مشخص را برمی گرداند.
filectime تابع ()filectime آخرین زمانی که یک فایل مشخص مورد تغییر واقع شده است را برمی گرداند.
filegroup تابع ()filegroup از یک فایل مورد نظر، group ID را برمی گرداند.
fileinode تابع ()fileinode مقدار inode از یک فایل مورد نظر را برمی گرداند.
filemtime تابع ()filemtime آخرین زمانی که محتوای فایل مورد نظر تغییر کرده است را برمی گرداند.
fileowner تابع ()fileowner درواقع user ID(مالک) را از یک فایل مشخص برمی گرداند.
fileperms تابع ()fileperms مجوزهای(permissions) یک فایل یا دایرکتوری را برمی گرداند.
filesize تابع ()filesize سایز یک فایل مشخص را برمی گرداند.
filetype تابع ()filetype نوع فایل را از یک فایل یا دایرکتوری مشخص برمی گرداند.
flock تابع ()flock یک فایل را قفل کرده و یا آزاد می کند.
fnmatch تابع ()fnmatch نام یک فایل یا رشته را با استفاده از یک الگوی(pattern) مشخص، مورد تطابق قرار می دهد.
fopen یک فایل یا url را باز می کند.
fpassthru تابع ()fpassthru تمام داده ها را از مکان کنونی، در یک فایل باز شده می خواند تا هنگامی که به پایان فایل(EOF) برسد و سپس نتیجه را در خروجی می نویسد.
fputcsv تابع ()fputcsv، یک خط داده را به فرمت CSV در می آورد و آن را در یک فایل باز، می نویسد.
fputs این تابع یک نام مستعار از تابع fwrite است.
fread تابع ()fread عمل خواندن را از یک فایل باز شده انجام می دهد.
fscanf Parses input from an open file according to a specified format
fseek تابع ()fseek در یک فایل باز شده پویش می کند.
fstat تابع ()fstat اطلاعاتی را درباره ی یک فایل باز شده برمی گرداند.
ftell تابع ()ftell مکان کنونی(current position) را در یک فایل باز شده، برمی گرداند.
ftruncate تابع ()ftruncate یک فایل باز شده را به یک طول مشخص کوتاه می کند.
fwrite تابع ()fwrite در درون یک فایل باز شده، عمل نوشتن را انجام می دهد.
glob تابع ()glob یک آرایه از نام فایل ها یا دایرکتوری هایی که با یک الگوی مشخص تطابق دارند را برمی گرداند.
is_dir تابع ()is_dir بررسی می کند که آیا فایل مشخص شده یک دایرکتوری است یا نه.
is_executable تابع ()is_executable بررسی می کند که آیا فایل مشخص شده قابل اجرا(executable) است یا نه.
is_file تابع ()is_file بررسی می کند که آیا یک فایل مشخص، یک فایل حقیقی است یا نه.
is_link تابع ()is_link بررسی می کند که آیا فایل مشخص شده یک لینک است یا نه.
is_readable تابع ()is_readable بررسی می کند که آیا فایل مشخص شده قابل خواندن است یا نه.
is_uploaded_file تابع ()is_uploaded_file بررسی می کند که آیا فایل مورد نظر، به وسیله ی HTTP POST آپلود شده است یا نه.
is_writable تابع ()is_writeable بررسی می کند که آیا فایل مورد نظر قابل خواندن است ی نه.
is_writeable یک مستعار از تابع is_writable است.
lchgrp Changes group ownership of symlink
lchown Changes user ownership of symlink
link Creates a hard link
linkinfo تابع ()linkinfo اطلاعاتی را درباره ی یک hard link برمی گرداند.
lstat تابع ()lstat اطلاعاتی را درباره ی یک فایل یا یک لینک سمبلیک برمی گرداند.
mkdir تابع ()mkdir یک دایرکتوری را ایجاد می کند.
move_uploaded_file تابع ()move_uploaded_file یک فایل آپلود شده را به یک مکان جدید حرکت می دهد.
parse_ini_file تابع ()parse_ini_file یک فایل پیکربندی(ini) را تجزیه کرده و تنظیمات درون آن را به صورت یک آرایه برمی گرداند.
parse_ini_string یک رشته ی پیکربندی را تجزیه می کند.
pathinfo تابع ()pathinfo یک آرایه را برمی گرداند که دربردارنده ی اطلاعاتی درباره ی یک مسیر(path)است.
pclose تابع ()pclose یک pipe را که به وسیله ی popen باز شده است را می بندد.
popen تابع ()popen یک pipe را که در برنامه ای که در پارامتر command مشخص شده است را باز می کند.
readfile تابع ()readfile یک فایل را می خواند و آن را در خروجی می نویسد.
readlink تابع ()readlink در واقع target مورد نظر از یک لینک سمبلیک را برمی گرداند.
realpath تابع ()realpath نام مسیر(phathname) مطلق را برمی گرداند.
realpath_cache_get Returns realpath cache entries
realpath_cache_size Returns realpath cache size
rename تابع ()rename یک فایل یا دایرکتوری را تغییر نام می دهد.
rewind تابع ()rewind مکان اشاره گر فایل را به ابتدای فایل برمی گرداند.
rmdir تابع ()rmdir یک دایرکتوری خالی را حذف می کند.
set_file_buffer تابع ()set_file_buffer اندازه ی بافر یک فایل باز شده را ست می کند.
stat تابع ()stat اطلاعاتی را درباره ی یک فایل برمی گرداند.
symlink تابع ()symlink از target موجود به وسیله ی link مشخص شده، یک لینک سمبلیک را ایجاد می کند.
tempnam تابع ()tempnam یک فایل موقت را با یک نام یکتا در یک دایرکتوری مشخص ایجاد می کند.
tmpfile تابع ()tmpfile یک فایل موقت را با یک نام یکتا در حالت read-write یا +w، ایجاد می کند.
touch تابع ()touch زمان دسترسی(access) و زمان اصلاح(modification) فایل مورد نظر را ست می کند.
umask تابع ()umask دسترسی ها را برای فایل ها تغییر می دهد.
unlink تابع ()unlink یک فایل را حذف می کند.
توابع کار با فیلترها در PHP
مقدمه ی توابع فیلتر
از توابع فیلتر، برای اعتبار سنجی و فیلتر کردن داده ها استفاده می شود.
نحوه نصب کردن
از PHP 5.2.0 به بعد، توابع فیلتر به طور پیش فرض فعال هستند. و نیازی به نصب این توابع نمی باشد.
توابع فیلتر در PHP5
تابع توضیحات filter_has_var تابع ()filter_has_var بررسی می کند که آیا یک نوع input مشخص موجود است یا نه.
filter_id تابع ()filter_id در واقع ID فیلتر یک نام فیلتر را برمی گرداند.
filter_input تابع ()filter_input یک متغیر خارجی(بعنوان مثال یک فرم ورودی) را گرفته و به طور اختیاری آن را فیلتر می کند.
filter_input_array تابع ()filter_input_array متغیرهای خارجی(مثل input فرم) را گرفته و به طور اختیاری آنها را فیلتر می کند.
filter_list تابع ()filter_list لیستی از تمام فیلترهای پشتیبانی شده را برمی گرداند.
filter_var_array تابع ()filter_var_array چند متغیر را گرفته و به طور اختیاری آنها را فیلتر می کند.
filter_var تابع ()filter_var به وسیله ی یک فیلتر مشخص شده، یک متغیر را فیلتر می کند.
ثابت های از پیش تعریف شده ی فیلتر در php
ثابت ID توضیحات FILTER_VALIDATE_BOOLEAN 258 فیلتر FILTER_VALIDATE_BOOLEAN یک مقدار را بعنوان یک مقدار بولی، فیلتر می کند.
FILTER_VALIDATE_EMAIL 274 فیلتر FILTER_VALIDATE_EMAIL یک آدرس ایمیل را اعتبار سنجی می کند.
FILTER_VALIDATE_FLOAT 259 فیلتر FILTER_VALIDATE_FLOAT متغیرها را بعنوان یک عدد float(عدد با ممیز شناور) فیلتر می کند.
FILTER_VALIDATE_INT 257 از تابع FILTER_VALIDATE_INT برای اعتبار سنجی مقدار یک عدد صحیح(integer) استفاده می شود.
FILTER_VALIDATE_IP 275 فیلتر FILTER_VALIDATE_IP یک آدرس IP را اعتبار سنجی می کند.
FILTER_VALIDATE_REGEXP 272 فیلتر FILTER_VALIDATE_REGEXP یک عبارت منظم را فیلتر می کند.
FILTER_VALIDATE_URL 273 فیلتر FILTER_VALIDATE_URL درواقع یک URL را اعتبار سنجی می کند.
FILTER_SANITIZE_EMAIL 517 فیلتر FILTER_SANITIZE_EMAIL تمام کاراکترهای غیر مجاز را از یک آدرس ایمیل حذف می کند.
FILTER_SANITIZE_ENCODED 514 فیلتر FILTER_SANITIZE_ENCODED کاراکترهای خاص را رمزگذاری کرده و یا حذف می نماید.
FILTER_SANITIZE_MAGIC_QUOTES 521 فیلتر FILTER_SANITIZE_MAGIC_QUOTES تابع addslashes را بر روی یک رشته اجرا می کند.
FILTER_SANITIZE_NUMBER_FLOAT 520 فیلتر FILTER_SANITIZE_NUMBER_FLOAT تمام کاراکترهای غیرمجاز را از یک عدد float حذف می کند.
FILTER_SANITIZE_NUMBER_INT 519 فیلتر FILTER_SANITIZE_NUMBER_INT تمام کاراکترهای غیرمجاز را از یک عدد حذف می کند.
FILTER_SANITIZE_SPECIAL_CHARS 515 فیلتر FILTER_SANITIZE_SPECIAL_CHARS کاراکترهای خاص را حذف می کند.
FILTER_SANITIZE_FULL_SPECIAL_CHARS FILTER_SANITIZE_STRING 513 فیلتر FILTER_SANITIZE_STRING تگ ها را حذف می کند و همچنین کاراکترهای خاص را از یک رشته حذف کرده یا رمزگذاری می کند.
FILTER_SANITIZE_STRIPPED 513 فیلتر FILTER_SANITIZE_STRIPPED کاراکترهای ناخواسته را حذف کرده و یا رمزگذاری می کند.
FILTER_SANITIZE_URL 518 فیلتر FILTER_SANITIZE_URL تمام کاراکترهای غیرمجاز را از یک رشته حذف می کند.
FILTER_UNSAFE_RAW 516 فیلتر FILTER_UNSAFE_RAW کاری خاصی انجام نمی دهد و یا کاراکترهای خاص را رمز گذاری کرده یا خذف می کند.
FILTER_CALLBACK 1024 فیلتر FILTER_CALLBACK یک تابع تعریف شده توسط کاربر را فراخوانی کرده تا مقدار مورد نظر را فیلتر نماید.
جملات شرطی در PHP
جملات شرطی
اغلب اوقات هنگام نوشتن یک اسکریپت، شما نیاز دارید که تصمیم های متفاوتی در مقابل نتایج مختلف بگیرید، برای تحقق این موضوع از جملات شرطی استفاده می کنیم.
انواع جملات شرطی در PHP:
- ... if:هنگامی که شرط درست باشد، دستور مقابل if اجرا می شود.
- if... else: اگر شرط درست باشد دستور مقابل if وگرنه دستور مقابل else اجرا می شود.
- if... elseif... else: برای اجرای یک دستور از بین چند دستور کاربرد دارد.
- PHP Switch: برای انتخاب و اجرای یک دستور از بین چند دستور استفاده می شود.
دستور if
نحوه استفاده:
if (Condition)
{
Statement 1
Statement 2
...
}دستور(Statement) مورد نظر تنها موقعی اجرا می شود که شرط(Condition) برقرار باشد، یعنی مقدار آن برابر true باشد.
مثال: در کد PHP زیر اگر امروز جمعه باشد، جمله "Have a nice weekend" چاپ می شود.
<html>
<body>
<?php
$d=date("D");
if ($d=="Fri") echo "Have a nice weekend!";
?>
</body>
</html>دستور if...else
این دستور که در واقع می تواند کامل کننده if باشد، تعیین می کند که اگر شرط درست نبود چه دستوری اجرا شود.
نحوه استفاده:
if (condition)
code to be executed if condition is true;
else
code to be executed if condition is false;مثال: در مثال زیر اگر امروز جمعه باشد جمله "Have a nice weekend" چاپ می شود وگرنه جمله "Have a nice day" چاپ خواهد شد.
<html>
<body>
<?php
$d=date("D");
if ($d=="Fri")
echo "Have a nice weekend!";
else
echo "Have a nice day!";
?>
</body>
</html>دستور if...elseif....else
همان طور که در بالا گفته شد این نوع if برای اجرای یک دستور از بین چند دستور کاربرد دارد.
نحوه استفاده:
if (condition)
code to be executed if condition is true;
elseif (condition)
code to be executed if condition is true;
else
code to be executed if condition is false;مثال:در مثال زیر اگر امروز جمعه باشد جمله "Have a nice weekend" چاپ می شود و اگر یکشنبه بود جمله "Have a nice Sunday" چاپ می شود وگرنه جمله "Have a nice day" چاپ خواهد شد.
<html>
<body>
<?php
$d=date("D");
if ($d=="Fri")
echo "Have a nice weekend!";
elseif ($d=="Sun")
echo "Have a nice Sunday!";
else
echo "Have a nice day!";
?>
</body>
</html>توجه: نوع دیگر اجرای دستورات کنترلی(مثال):
if ($i == 1):
echo "i is 1";
$i+=2;
elseif ($i == 2):
echo "i is 2";
$i+=3;
else:
echo "is not 1 or 2";
$i-=1;
endif;برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
حذف اطلاعات یک جدول در PHP
حذف اطلاعات یک جدول با استفاده از MySQLi و PDO
دستور DELETE FROM برای حذف رکورد از یک جدول استفاده می شود.
نحوه استفاده:
DELETE FROM table_name
WHERE some_column = some_valueنکته: قسمت WHERE مشخص می کند که چه رکورد یا رکوردهایی باید حذف بشوند، توجه داشته باشید که اگر این قسمت را در نظر نگیرید کلیه رکوردهای جدول حذف می شوند.
برای کسب اطلاعات بیشتر در مورد SQL، به لینک روبرو مراجعه فرمایید: آموزش SQL-مقدمه
به جدول "MyGuests" که در فصل های قبلی همین آموزش ایجاد شده است توجه کنید:
id firstname lastname email reg_date 1 John Doe این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید 2014-10-22 14:26:15 2 Mary Moe این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید 2014-10-23 10:22:30 3 Julie Dooley این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید 2014-10-26 10:48:23 در مثال زیر، رکوردی که id آن برابر با 3 است در جدول "MyGuests" حذف خواهد شد:
مثال(MySQLi Object-oriented)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// ایجاد ارتباط
$conn = new mysqli($servername, $username, $password, $dbname);
// اطمینان از صحت ارتباط
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// تنظیم کوئری حذف
$sql = "DELETE FROM MyGuests WHERE id=3";
if ($conn->query($sql) === TRUE) {
echo "Record deleted successfully";
} else {
echo "Error deleting record: " . $conn->error;
}
$conn->close();
?>مثال(MySQLi Procedural)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// ایجاد ارتباط
$conn = mysqli_connect($servername, $username, $password, $dbname);
// اطمینان از صحت ارتباط
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// تنظیم کوئری حذف
$sql = "DELETE FROM MyGuests WHERE id=3";
if (mysqli_query($conn, $sql)) {
echo "Record deleted successfully";
} else {
echo "Error deleting record: " . mysqli_error($conn);
}
mysqli_close($conn);
?>مثال(PDO)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// تنظیم حالت برخورد با خطاها
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// تنظیم کوئری حذف
$sql = "DELETE FROM MyGuests WHERE id=3";
// بدلیل اینکه کوئری نتیجه ای را برنمی گرداند از تابع زیر استفاده می کنیم
$conn->exec($sql);
echo "Record deleted successfully";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>نتیجه کار بعد از حذف رکورد:
id firstname lastname email reg_date 1 John Doe این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید 2014-10-22 14:26:15 2 Mary Moe این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید 2014-10-23 10:22:30 برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
حذف محصول از سبد خرید
جلسه ی هشتم طراحی یک فروشگاه اینترنتی-حذف محصول از سبد خرید
در قسمت اول از این جلسه، به آموزش 'حذف محصول از سبد خرید' خواهیم پرداخت.
آنچه که در قسمت قبل طراحی شد
در قسمت قبل، موارد کلی زیر آموزش داده شدند:
- ایجاد قسمت های قیمت کل و ورود به درگاه پرداخت در سبد خرید
مشاهده ی آنچه که در قسمت قبل طراحی شد:
آنچه که در قسمت 'حذف محصول از سبد خرید' خواهید آموخت
در قسمت 'حذف محصول از سبد خرید' موارد زیر آموزش داده خواهند شد:
توضیح اجمالی:
- نحوه ی حذف محصول از سبد خرید با استفاده از جی کوئری
توضیح تفصیلی:
- انجام کدنویسی جی کوئری برای دکمه ی حذف محصول از سبد خرید.
- استفاده از ajax برای حذف محصول.
- حذف li مورد نظر از سبد خرید به صورت آنی
- تعریف id یا کلاس برای دکمه های ضربدری شکل.
حذف محصول از سبد خرید
چون که قرار است ما، دستورات جی کوئری و ajax را زمانی اجرا کنیم که کاربر روی این ضربدر های قرمز کلیک می کند، پس بهتر است که به این ضربدرها، یک آی دی و یا کلاس خاص بدهیم، تا بتوانیم در دستورات جی کوئری به سادگی به این علامت های ضربدر دسترسی داشته باشیم:
یعنی در جایی که در فایل top.php آمدیم و محصولاتمان را از tblsabad دریافت کردیم، و سپس یک li را echo کردیم که در داخل این li علامت ضربدر هم وجود داشت، یک آی دی را تحت عنوان delete مشخص کنیم:
پس id این ضربدر های قرمز برابر با delete شد. حالا اگر که صفحه را رفرش کنیم، و کلید f12 را فشار دهیم، می بینیم که id این ضربدر ها، delete می باشد. این آی دی باعث می شود که ما کدهای جی کوئری مان را بتوانیم راحت تر بنویسیم.
حالا به سراغ صفحه ی left.php می رویم. درون این قسمت که ما تگ اسکریپت را باز کردیم و دستورات قبلی را نوشتیم، حال می آییم و یک دستور جدید را هم اجرا می کنیم. حال می خواهیم ببینیم که سلکتور ما در اینجا، چه چیزی است. یعنی در چه زمانی می خواهیم عملیات delete برای محصول را انجام بدهیم؟ مشخص است که زمانی می خواهیم این کار را انجام دهیم که کاربر روی دکمه ی delete کلیک می کند. پس در اینجا ما سلکتور خودمان را مشخص می کنیم:
کد
$("#sabad1 li #delete").clickاین می شود همان سلکتور ما. زمانی که کاربر بر روی این سلکتور کلیک می کند، یک تابع باید اجرا شود:
دسترسی به موارد آموزشی بالا در بسته ی خریداری شده:
- شماره جلسه: 8
- نام فایل ویدئو: 31
- فرمت فایل: mp4.
نقطه ی شروع بحث بالا (حذف محصول از سبد خرید) در ویدئو: 03:08
- ایجاد قسمت های قیمت کل و ورود به درگاه پرداخت در سبد خرید
حفظ مقادیر فرم در PHP
در این آموزش نحوه ی جلوگیری از خالی شدن فیلدهای فرم، زمانی که کاربر روی دکمه submit کلیک می کند را نشان خواهیم داد.
حفظ مقادیر فرم در PHP
زمانی که کاربر، مقادیر فیلدهای فرم را تنظیم و روی دکمه submit کلیک می کند، تمام فیلدها، مقادیرشان را از دست می دهند. حالا تصور نمایید که کاربر، در ورود اطلاعات یک فیلد (مثلاً فیلد "ایمیل") خطایی داشته باشد، بنابراین باید از ابتدا شروع به وارد کردن اطلاعات کند...!
بمنظور حفظ مقادیر فیلدهای فرم، برای فیلدهای متنی، باید یک کد PHP کوچک در خصوصیت value تگ <input> قرار دهیم. همچنین برای عنصر <textarea> باید کد PHP را بین تگ های باز و بسته <textarea> و </textarea> قرار دهیم. این قطعه کدها، مقادیر متغیرهای name, $email, $website, $comment$ را نمایش می دهند.
سپس، در مورد فیلد "جنسیت" باید مشخص کنیم که کدام گزینه انتخاب شده است. بنابراین باید خصوصیت ckecked آنرا دستکاری کنیم (نه خصوصیت value):
نام: <input type="text" name="name" value="<?php echo $name;?>">
ایمیل: <input type="text" name="email" value="<?php echo $email;?>">
وب سایت: <input type="text" name="website" value="<?php echo $website;?>">
توضیحات: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>
جنسیت:
<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="female") echo "checked";?>
value="female">زن
<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="male") echo "checked";?>
value="male">مردمثال تکمیل شده اعتبارسنجی فرم در PHP
در زیر، کد تکمیل شده اعتبارسنجی فرم در PHP آمده است:
مثال (حفظ مقادیر فرم در PHP)
<!DOCTYPE HTML>
<html>
<head>
<style>
body {direction:rtl;}
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
if (empty($_POST["name"]))
{$nameErr = "Name is required";}
else
{
$name = test_input($_POST["name"]);
// check if name only contains letters and whitespace
if (!preg_match("/^[a-zA-Z ]*$/",$name))
{
$nameErr = "Only letters and white space allowed";
}
}
if (empty($_POST["email"]))
{$emailErr = "Email is required";}
else
{
$email = test_input($_POST["email"]);
// check if e-mail address syntax is valid
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
{
$emailErr = "Invalid email format";
}
}
if (empty($_POST["website"]))
{$website = "";}
else
{
$website = test_input($_POST["website"]);
// check if URL address syntax is valid (this regular expression also allows dashes in the URL)
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))
{
$websiteErr = "Invalid URL";
}
}
if (empty($_POST["comment"]))
{$comment = "";}
else
{$comment = test_input($_POST["comment"]);}
if (empty($_POST["gender"]))
{$genderErr = "Gender is required";}
else
{$gender = test_input($_POST["gender"]);}
}
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>مثال اعتبارسنجی فرم ها در PHP</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<div>
<span>نام:</span><input type="text" name="name" value="<?php echo $name;?>">
<span class="error">*</span>
</div>
<div>
<span>ایمیل:</span><input type="text" name="email" value="<?php echo $email;?>">
<span class="error">*</span>
</div>
<div>
<span>وب سایت:</span>
<input type="text" name="website" value="<?php echo $website;?>">
<span class="error"></span>
</div>
<div>
<span>توضیحات:</span><textarea name="comment" rows="5" cols="40">
<?php echo $comment;?>
</textarea>
<span class="error">*</span>
</div>
<div>
<span>جنسیت:</span>
<input type="radio" name="gender" value="female" <?php if (isset($gender) && $gender=="female") echo "checked";?>>زن
<input type="radio" name="gender" value="male" <?php if (isset($gender) && $gender=="male") echo "checked";?>>مرد
</div>
</div><input type="submit" name="submit" value="ارسال اطلاعات"></div>
</form>
<?php
if ($nameErr!="" || $emailErr!="" || $genderErr!="" || $websiteErr!="")
echo "<span style='color:red' >
$nameErr <br /> $emailErr <br /> $genderErr <br /> $websiteErr
</span>";
else
{
echo "<br /><h2>خروجی کدتان</h2>";
echo "نام :$name";
echo "<br />";
echo "ایمیل: $email";
echo "<br />";
echo "وب سایت: $website";
echo "<br />";
echo "توضیحات: $comment";
echo "<br />";
echo "جنسیت: $gender";
}
?>
</body>
</html>خروجی کد بالا:
مثال اعتبارسنجی فرم ها در PHP
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
حلقه for در PHP
حلقه for در PHP
از حلقه for زمانی که تعداد دفعات اجرای دستورات را بدانید استفاده می شود یعنی دستورات داخل حلقه از یک عدد مشخص به تعدادی مشخص تکرار می شود.
نحوه استفاده:
for (init; condition; increment)
{
code to be executed;
}پارامترها:
- init: تنها یکبار در ابتدای حلقه اجرا می شود، و اغلب برای تعریف یک شمارنده استفاده می شود.
- condition: ارزیابی تکرار حلقه، اگر شرط برقرار باشد دستورات اجرا می شوند، در غیر اینصورت دستورات ادامه نمی یابند.
- increment: بعد از هربار اجرای دستورات حلقه، این دستور اجرا می شود و اغلب برای افزایش شمارنده استفاده می شود.
نکته:
- در for می توان هرکدام از پارامترهای بالا را خالی گذاشت، به این صورت که اگر شرط خالی باشد، مقدار آن برابر با true در نظر گرفته می شود و حلقه بینهایت بار اجرا میشود! (البته با استفاده از دستور break که بعداً به آن اشاره می شود، می توان آن را قطع نمود)
- در for همچنین می توان برای پارامترهای بالا چند دستور مختلف را اجرا نمود به اینصورت که با علامت "," آنها را باید از یکدیگر جدا نمود.
مثال:
در مثال زیر یک حلقه تعریف شده که با i=1 شروع می شود، و تا زمانی که i<=5 باشد ادامه خواهد یافت و به مقدار i در هر بار اجرای حلقه یک واحد اضافه می شود.
<html>
<body>
<?php
for ($i=1; $i<=5; $i++)
{
echo "The number is " . $i . "<br />";
}
?>
</body>
</html>خروجی کد بالا:
The number is 1
The number is 2
The number is 3
The number is 4
The number is 5حلقه foreach درPHP
مخصوص کار با آرایه ها می باشد.
نحوه استفاده:
foreach ($arrayas $value)
{
code to be executed;
}این دستور تمام مقادیر آرایه را یکی یکی از ابتدایی تا انتهایی به درون value می ریزد و دستورات را اجرا می نماید.
نکته:مقدار value کپی داده می باشد و با تغییر آن داده اصلی در آرایه تغییری نمی کند، اما با قرار دادن علامت "&" در ابتدای value یک نشانگر از آن برگردانده می شود، بدین معنا که با تغییر آن داده اصلی درون آرایه نیز تغییر می کند.
مثال1:مثال زیر یک حلقه را نشان می دهد که مقادیر گرفته شده از یک آرایه را چاپ می کند.
<html>
<body>
<?php
$x=array("one","two","three");
foreach ($x as $value)
{
echo $value . "<br />";
}
?>
</body>
</html>خروجی کد بالا:
one
two
threeمثال2: با قرار دادن علامت "&" در ابتدای value اگر در حلقه این مقدار تغییر کند، داده اصلی نیز تغییر می کند.
<html>
<body>
<?php
$arr=array(1,2,3,4);
foreach($arr as &$value)
{
echo $value;
echo " ";
$value *= 2;
}
echo "<br />";
foreach($arr as $value)
{
echo $value;
echo " ";
}
?>
</body>
</html>خروجی کد بالا:
1 2 3 4
2 4 6 6مثال3: چاپ کلید و مقدار آن (
key and value
)<html>
<body>
<?php$a = array(
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);
foreach ($a as $k => $v) {
echo "a[$k] => $v"."<br />";
}
?>
</body>
</html>خروجی کد بالا:
a[one] => 1
a[two] => 2
a[three] => 3
a[seventeen] => 17مثال4: چاپ کلید و مقدار آن (
key and value
) در یک آرایه دو بعدی<html>
<body>
$families = array("Ahmadi"=>array("a"=>"Ali","b"=>"Reza","c"=>"Sara"),
"Naderi"=>array("a"=>"Amir"),
"Mohamadi"=>array("a"=>"Poya","b"=>"Parniya")
);
foreach ($families as $k => $v)
foreach ($v as $b=>$v)
echo "families[$k][$b] => $v "."<br />";
</body>
</html>خروجی کد بالا:
families[Ahmadi][a] => Ali
families[Ahmadi][b] => Reza
families[Ahmadi][c] => Sara
families[Naderi][a] => Amir
families[Mohamadi][a] => Poya
families[Mohamadi][b] => Parniyaبرای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
حلقه ها در PHP
حلقه ها در PHP
اغلب مواقعی که کد می نویسیم، می خواهیم که یک مجموعه از دستورات بارها و بارها اجرا بشوند، بجای اینکه آن چند خط که اغلب یکسان هستند را در دستورات تکرار کنیم از حلقه ها استفاده می کنیم.
انواع دستورات حلقه ای در PHP:
- while:تا زمانی که شرط حلقه درست باشد، دستورات اجرا می شود.
- do...while:دستورات داخل حلقه چه شرط حلقه درست باشد و چه نباشد برای یک بار اجرا می شود، و در مراحل بعدی اگر شرط حلقه درست بود، دستورات اجرا می شوند.
- for:دستورات داخل حلقه از یک عدد مشخص به تعدادی مشخص تکرار می شود.
- foreach:برای کار با آرایه ها کاربرد دارد.
حلقه while
این دستور تا زمانی که شرط برقرار باشد دستورات را اجرا می کند و شرط قبل از اجرای دستورات چک می شود. بدین معنا که اگر در وسط اجرای دستورات متغیرها طوری تغییر کنند که شرط برقرار نباشد، دستورات همچنان تا پایان اجرا می شوند و نیز اگر شرط از ابتدا برقرار نباشد دستورات دیگر اجرا نخواهند شد.
نحوه استفاده:
while (condition)
{
code to be executed;
}مثال:
در مثال زیر یک حلقه تعریف کرده ایم که با i=1 شروع می شود و دستورات داخل حلقه تا زمانی که i<=5 باشد ادامه می یابد، البته توجه داشته باشید که مقدار متغیر i در داخل حلقه هر بار یک واحد اضافه می شود و اگر این تغییر، شرط حلقه را false کند، دستورات داخل حلقه تا پایان حلقه ادامه خواهد یافت.
<html>
<body>
<?php
$i=1;
while($i<=5)
{
echo "The number is " . $i . "<br />";
$i++;
}
?>
</body>
</html>خروجی کد بالا:
The number is 1
The number is 2
The number is 3
The number is 4
The number is 5دستور do...while
این دستور شباهت بسیار زیادی به دستور while دارد با این تفاوت که شرط در پایان اجرای دستورات چک می شود یعنی به این صورت که اگر از ابتدا هم شرط برقرار نباشد، دستورات یکبار اجرا می شوند و بعد شرط چک می شود.
نحوه استفاده:
do
{
code to be executed;
}
while (condition);مثال:
تفاوت این مثال با مثال قبلی در دو چیز است:
- چون شرط حلقه در پایان دستورات چک می شود، دستورات داخل حلقه حتماً برای یک بار اجرا می شوند.
- چون دستور ;++i$ قبل از دستور چاپ است، بنابراین اعداد از 2 تا 6 چاپ می شود.
<html>
<body>
<?php
$i=1;
do
{
$i++;
echo "The number is " . $i . "<br />";
}
while ($i<=5);
?>
</body>
</html>خروجی کد بالا:
The number is 2
The number is 3
The number is 4
The number is 5
The number is 6حلقه forو foreach در فصل بعدی توضیح داده خواهد شد.
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
دستور prepare در PHP
دستورات آماده برای مقابله با SQL injection ها بسیار کارآمداند.
دستورات آماده (Prepared) و Bind کردن پارامترها
با استفاده از دستورات آماده یا Prepared، می توانید یک کوئری یکسان را به تعداد دفعات دلخواه با راندمان بالا اجرا نمایید.
نحوه عملکرد دستورات آماده یا Prepared:
- Prepare: با استفاده از این دستور می توانید قالبِ یک کوئری SQL را ایجاد کرده و به پایگاه داده ارسال نمایید. در واقع دلیل استفاده از کلمه قالب در اینجا این است که بجای پارامترهای لازم در کوئری، از علامت سوال (؟) استفاده می کنیم.
مثال (دستور prepare در PHP)
INSERT INTO MyGuests VALUES(?, ?, ?)
- حالا قالب SQL ارسال شده، توسط پایگاه داده، تجزیه و کامپایل می شود و در ادامه بهینه ساز کوئری (query optimization) روی آن اجرا می شود و در نهایت نتیجه کار بدون اجرا در پایگاه داده ذخیره می شود.
- Execute: در ادامه ی اسکریبت، مقادیر لازم را به پارامترهای کوئری مان Bind می کنیم و با استفاده از دستور Execute، کوئری را اجرا می کنیم. اما نکته ای که وجود دارد این است که کوئری ما همچنان در پایگاه داده وجود دارد و می توانیم مجدداً آنرا با پارامترهای جدید اجرا کنیم...!
روش استفاده از دستورات آماده در مقایسه با اجرای مستقیم کوئری ها دو مزیت اصلی دارد:
- دستورات آماده، زمان تجزیه (parsing) کوئری را کاهش می دهند و این در حالی است که برای مواقعی که قصد داریم یک کوئری را به دفعات اجرا کنیم، این زمان فقط یکبار محاسبه خواهد شد.
- از آنجایی که برای هر بار اجرای کوئری، فقط باید پارامترها را ارسال کنیم، بنابراین پهنای باند کمتری مصرف خواهد شد.
- دستورات آماده برای مقابله با SQL injection ها بسیار کارآمد هستند و این بخاطر استفاده از یک پروتوکول متفاوت برای انتقال مقادیر پارامترهاست.
تزریق SQL یا SQL injection چیست؟
SQL injection زمانی رخ می دهد که شما از کاربر یک ورودی می خواهید ( مثلا نام خانوادگی ، سن و... ) و کاربر بجای نام، یک دستور MySQL را وارد می نماید و این دستور بدون اطلاع شما بر روی دیتابیس اجرا می شود.
مثال (دستور prepare در PHP)
$username="''; Delete From users";
$query="Select From users where usernamr=$username";
echo $query;نتیجه کد بالا
Select From users where usernamr= ''; Delete From users
توضیح: همان طور که در کد بالا مشاهده می کنید، ورودی مخرب، باعث می شود که دو کوئری روی پایگاه داده اجرا شود و از آن مهمتر، کوئری دوم است که باعث می شود تا تمام اطلاعات جدول users حذف شود...!
دستورات آماده یا Prepared در MySQLi
در مثال زیر،نحوه ی استفاده از دستورات آماده یا Prepared و همچنین نحوه ی Bind کردن پارامترها در MySQLi نشان داده شده است:
مثال(MySQLi with Prepared Statements)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// ایجاد ارتباط به پایگاه داده
$conn = new mysqli($servername, $username, $password, $dbname);
// اطمینان از صحت ارتباط
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// تنظیم کوئری و بایند کردن پارامترها با استفاده از دستورات آماده
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
// تنظیم پارامترها و اجرای کوئری
$firstname = "John";
$lastname = "Doe";
$email = "این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید ";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید ";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید ";
$stmt->execute();
echo "New records created successfully";
$stmt->close();
$conn->close();
?>توضیح مثال بالا:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"در کوئری مان می توانیم از علامت سوال (؟) استفاده کنیم، این علامت در ادامه با یک عدد صحیح (integer)، رشته (string)، عدد اعشاری (double) یا داده های با اندازه بزرگ (BLOB - Binary Large OBject) جایگزین خواهد شد.
در ادامه نگاهی به تابع ()bind_param خواهیم انداخت:
$stmt->bind_param("sss", $firstname, $lastname, $email);با استفاده از تابع ()bind_param، می توانیم پارامترها را به کوئری SQL مان Bind کنیم و به پایگاه داده بگوییم که چه پارامترهایی داریم. همچنین با استفاده از آرگومان اول یعنی "sss"، نوع پارامترها را تعیین می کنیم. کاراکتر s به MySQL می گوید که پارمتر ما از نوع رشته (string) است.
نوع آرگومان ها می تواند یکی از چهار گزینه زیر باشد:
- i - integer
- d - double
- s - string
- b - BLOB
برای هر کدام از آرگومان ها، باید یکی از چهار مقدار بالا را تنظیم کنیم.
زمانی که نوع پارامترها را مشخص می کنیم، ریسک تزریقات SQL یا SQL injections توسط هکرها را به حداقل می رسانیم.
توجه: اگر قصد دارید که داده ی دریافتی از کاربران را در پایگاه داده ذخیره کنید، اعتبارسنجی داده ها یک امر بسیار مهم است. دستورات آماده یا Prepared در PDO
در مثال زیر،نحوه ی استفاده از دستورات آماده یا Prepared و همچنین نحوه ی Bind کردن پارامترها در PDO نشان داده شده است:
مثال(PDO with Prepared Statements)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
try {
//ایجاد ارتباط
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// تنظیم حالت برخورد با خطاها
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// تنظیم کوئری و بایند کردن پارامترها با استفاده از دستورات آماده
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
// تنظیم پارامترها و اجرای کوئری
$firstname = "John";
$lastname = "Doe";
$email = "این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید ";
$stmt->execute();
// تنظیم پارامترها و اجرای کوئری
$firstname = "Mary";
$lastname = "Moe";
$email = "این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید ";
$stmt->execute();
// تنظیم پارامترها و اجرای کوئری
$firstname = "Julie";
$lastname = "Dooley";
$email = "این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید ";
$stmt->execute();
echo "New records created successfully";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
- Prepare: با استفاده از این دستور می توانید قالبِ یک کوئری SQL را ایجاد کرده و به پایگاه داده ارسال نمایید. در واقع دلیل استفاده از کلمه قالب در اینجا این است که بجای پارامترهای لازم در کوئری، از علامت سوال (؟) استفاده می کنیم.
دستور switch در PHP
دستور Switch
برای انتخاب و اجرای یک دستور از بین چند دستور استفاده می شود.
این دستور در برخی موارد شباهت بسیار زیادی به دستورات if... elseif... else دارد.
دستور switch یک حالت خاص هم دارد به نام default که اگر هیچکدام از مقادیر درست نبود، آن قسمت اجرا می شود.
نحوه استفاده:
switch (n)
{
case label1:
code to be executed if n=label1;
break;
case label2:
code to be executed if n=label2;
break;
default:
code to be executed if n is different from both label1 and label2;
}کد بالا چگونه کار می کند:
- case
از کلمه case بجای if else استفاده می کنیم و حالت مختلف شرط را در جلوی آن می نویسیم و سپس علامت ":" می گذاریم، در حقیقت اگر متغییر ما یعنی n برابر با مقدار مقابل case بود، نتیجه این می شود که باید دستورات مربوط به آن case اجرا شود، در غیر اینصورت case بعدی مقایسه می شود.
- break
دستور break یکی از بخشهای switch است که به مفسر PHP می فهماند که در کجا، قسمت case تمام می شود، در حقیقت از تداخل قسمتهای مختلف جلوگیری می کند. دقت کنید که شما هم باید آنرا قبل از شروع case بعدی بنویسید.
- default
اگر هیچکدام از مقادیر مقابل caseها با متغییر n برابر نبود، در این صورت دستورات مربوط به default اجرا می شود.
مثال:
<html>
<body>
<?php
$x=3;
switch ($x)
{
case 1:
echo "Number 1";
break;
case 2:
echo "Number 2";
break;
case 3:
echo "Number 3";
break;
default:
echo "No number between 1 and 3";
}
?>
</body>
</html>خروجی کد بالا:
Number 3
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
رسیدگی به خطاها در PHP
رسیدگی یا مدیریت خطاها در php
رسیدگی به خطاها در phpبسیار ساده است. به صورت پیشفرض اگر خطایی رخ دهد، یک پیغام خطا که توضیح دهنده ی خطا است، همراه با نام فایل و شماره خط به مرورگر فرستاده می شود.
هنگام ایجاد برنامه های تحت وب، بررسی خطاها یک بخش مهم است. اگر کد شما امکان بررسی خطا را نداشته باشد، در این صورت بسیار غیرحرفه ای عمل کرده اید و ممکن است در معرض خطر امنیتی قرار بگیرید.
در زیر بعضی روش های معمول بررسی خطا در php توضیح داده خواهد شد:
- استفاده از دستور ساده ()die
- خطاهای معمولی و راه اندازی رسیدگی کننده خطا
- واقعه نگاری خطاها
استفاده از تابع ()die
این تابع متنی را که به عنوان پارامتر برای آن مشخص کرده ایم، چاپ می کند و از کد جاری خارج می شود.
مثال:در این مثال با استفاده از تابع ()fopen یک فایل متنی را به صورت فقط خواندنی باز می کنیم:
<?php
$file=fopen("welcome.txt","r");
?>اگر فایل وجود نداشته باشد، با خطای زیر مواجه می شویم:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2برای اینکه کاربر با پیغام خطای بالا مواجه نشود، قبل از هر چیز، وجود فایل "welcome.txt" را بررسی می کنیم:
<?php
if(!file_exists("welcome.txt"))
die("File not found");
else
$file=fopen("welcome.txt","r");
?>کد بالا کارامدتر از کد قبلی است، حالا اگر فایل وجود نداشته باشد بعد از اجرای اسکریپت، پیغام خطای زیر نمایش داده می شود:
File not found
توجه: در اسکریپت بالا، بعد از اجرای دستور ()die، ادامه اجرای اسکریپت متوقف می شود.
متوقف کردن اسکریپت، به این سادگی، همیشه راه درست نیست. بیایید نگاهی به توابع تناوبی رفع خطا در php بیندازیم.
ایجاد یک تابع رسیدگی کننده خطا (error handler)
ایجاد این تابع کاملاً ساده است، و هرگاه که در کد PHP خطایی رخ داد این تابع فراخوانی می شود.
این تابع باید بتواند حداقل با دو پارامتر کار کند(سطح خطا و پیغام خطا) اما تا پنج پارامتر را بپذیرد(اختیاری: فایل، شماره خط و متن پیغام):
نحوه استفاده:
error_function(error_level,error_message,error_file,error_line,error_context)
پارامتر توضیحات error_level الزامی است، سطح گزارش خطا را مشخص می کند. جدول زیر را برای انواع سطوح گزارش خطا ببینید.
error_message الزامی است، پیغام خطا را برای خطای تعریف شده توسط کاربر مشخص می کند.
error_file اختیاری است. نام فایلی را که خطا در ان رخ داده است مشخص می کند.
error_line اختیاری است. شماره خطی را که خطا در آن رخ داده است مشخص می کند.
error_context اختیاری است. یک آرایه که شامل تمام متغییرهای در حال استفاده هنگام رخداد خطا با مقادیرشان است را مشخص می کند.
سطوح گزارش خطا:
مقدار نام ثابت توضیحات 2 E_WARNING خطاهای زمان اجرا غیر جدی. اجرای script متوقف نمی شود
8 E_NOTICE اخطارهای زمان اجرا.script چیزی پیدا کرده که ممکن است خطا باشد? اما می تواند در اجرای معمولی script نیز رخ دهد
256 E_USER_ERROR خطای جدی کاربرساز. مانند یک E-ERROR که توسط کابر با استفاده از تابع trigger_error( ) در php به وجود می آید.
512 E_USER_WARNING هشدار غیرجدی کاربرساز. مانند یک E_WARNING است که توسط کابر با استفاده از تابع trigger_error( ) در php به وجود می آید.
1024 E_USER_NOTICE اخطار کاربرساز. مانند یک E_NOTICE است که توسط کابر با استفاده از تابع trigger_error( ) در php به وجود می آید.
4096 E_RECOVERABLE_ERROR خطای جدی گرفتنی. مانند یک E_ERROR است اما بوسیله ی رفع خطای تعریف شده توسط کاربر می توان ان را گرفت(set_error_handler( ) را نیز ببینید)
8191 E_ALL همه ی خطاها و هشدارها?به جز سطح E_STRICT) E_STRICT در php 6.0 جزئی از E_ALL خواهد شد.)
حالا اجازه دهید تا یک تابع برای رسیدگی کردن به خطاها ایجاد کنیم، که شامل ورودی های زیر است:
- errno$: سطح خطا
- errstr$: متن خطا
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}کد بالا موقعی که راه اندازی شد، "سطح خطا" و "متن خطا" را می گیرد و سپس با چاپ کردن دو مورد ذکر شده به اجرای اسکریپت پایان می دهد.
در حال حاضر باید تصمیم بگیریم که چه موقع تابع بالا، راه اندازی شود.
تنظیم رسیدگی کننده خطا
ما قصد داریم تابع "customError" را به عنوان پیشفرض رسیدگی کننده خطا در PHP معرفی کنیم، این کار به سادگی با استفاده از تابع زیر در PHP امکان پذیر است:
set_error_handler("customError");
نکته: یک پارامتر دوم می تواند برای مشخص کردن سطح خطا به تابع ()set_error_handler اضافه شود، ولی چون می خواهیم که تابع معمولی مان همه ی خطاها را رفع کند، ()set_error_handler تنها با یک پارامتر فراخوانی می شود.
مثال: در زیر سعی کرده ایم با چاپ متغییر "test$" که وجود ندارد تابع "رسیدگی کننده خطا" یا همان "customError" را تست کنیم:
<?php
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr";
}
set_error_handler("customError");
echo($test);
?>خروجی کد بالا:
Error: [8] Undefined variable: test
راه اندازی یک خطا
در اسکریپتی که کاربران می توانند داده وارد کنند، می توان موقع رخداد یک ورودی غیرمجاز خطاها را راه اندازی کرد. در php، این کار با تابع ()trigger_error انجام می شود.
مثال: در این مثال اگر متغییر "test" بزرگتر از "1" باشد، یک خطا رخ می دهد:
<?php
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below");
}
?>خروجی کد بالا:
Notice: Value must be 1 or below
in C:\webfolder\test.php on line 5یک خطا می تواند هر جایی در اسکریپت که بخواهید راه اندازی شود و با افزودن پارامتر دوم شما می توانید مشخص کنید که چه سطح خطایی راه اندازی شود.
مثال: در این مثال یک خطا با سطح E_USER_WARNING رخ می دهد، اگر متغییر "test" بزرگتر از "1" باشد، تابع رسیدگی کننده خطا، راه اندازی شده و اسکریپت را خاتمه می دهیم:
<?php
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}
set_error_handler("customError",E_USER_WARNING);
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>خروجی کد بالا:
Error: [512] Value must be 1 or below
Ending Scriptاکنون که طریقه ی رسیدگی به خطاها و چگونگی راه اندازی آن ها را یاد گرفتیم، اجاز دهید نگاهی به واقعه نگاری (Log) خطاها بیندازیم.
واقعه نگاری خطاها (Log)
به طور پیش فرض، php یک گزارش خطا به سیستم واقعه نگاری سرورها یا یک فایل، بسته به اینکه پیکر بندی گزارش خطا چگونه درفایل php.ini تنظیم شده است ارسال می کند. با استفاده از تابع ()error_log شما می توانید گزارش های خطا را به به یک فایل مشخص شده یا یک مقصد دور ارسال کنید.
ارسال پیغام های خطاها به خودتان از طریق email می تواند روش خوبی برای آگاه شدن از خطاهای خاص باشد.
مثال: در این مثال اگر یک خطای خاص رخ دهد ما یک e-mail را همراه با یک پیغام خطا به آدرس مشخص شده می فرستیم و اسکریپت خاتمه خواهد یافت:
<?php
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Webmaster has been notified";
error_log("Error:[$errno]$errstr",1,"این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید ","From:این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید ");
}
set_error_handler("customError",E_USER_WARNING);
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>خروجی کد بالا:
Error: [512] Value must be 1 or below
Webmaster has been notifiedو در ادامه ایمیل دریافت شده چیزی شبیه زیر خواهد بود:
Error: [512] Value must be 1 or below
توجه:این نباید برای همه ی خطاها استفاده شود، خطاهای معین باید با سیستم واقعه نگاری پیش فرض php در سرور ثبت شوند.
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHPکلیک کنید.
ساختار دستورات در PHP
ساختار دستورات در PHP
دستورات PHP همیشه با <?php آغاز و با ?> خاتمه می یابد. یک بلوک اسکریپتی PHP می تواند در هر جایی از کد HTML قرار بگیرد. در یک سرور که به تکنیک مختصر نویسی مجهز است می توان بلوک اسکریپتی php را با <? شروع و با ?> خاتمه داد.
توجه: برای داشتن حداکثر سازگاری، ما حالت استاندارد (<?php) را پیشنهاد می کنیم.
<?php
?>یک فایل php به طور معمول ترکیبی از تگ های HTML و تعدادی کد های اسکریپتی PHP است.
مثال: در مثال زیر، متن "Hello world" توسط دستور echo چاپ می شود:<html>
<body>
<?php
echo "Hello World";
?>
</body>
</html>هر خط در php باید با علامت (;) پایان پذیرد. این علامت یک جدا کننده است و برای تمیز دادن یک مجموعه از دستورالعمل ها از دیگری استفاده می شود.
دو دستور پایه ای برای ارسالِ خروجیِ متنی وجود دارد:
- echo
- print
در مثال بالا از دستور echo برای فرستادن رشته ی "hello world" به خروجی استفاده شده است.
نکته: این فایل باید دارای پسوند php باشد. اگر پسوند فایل html باشد کد php اجرا نخواهد شد.
(Comment) توضیحات در PHP
در php از // برای یک خط comment و از /* و*\ برای یک بلوک بزرگ از توضیحات استفاده می کنیم.
<html>
<body>
<?php
//This is a comment
/*
This is
a comment
block
*/
?>
</body>
</html>PHP یک زبان غیرحساس به حروف بزرگ و کوچک (case-insensitive)
در PHP، هیچکدام از توابع، کلاس ها و کلمات کلیدی (مانند if و while و...) به حروف بزرگ و کوچک، حساس نیستند.
در مثال زیر، هر سه دستور echo، صحیح و یکسان است:
مثال (ساختار دستورات در PHP)
<!DOCTYPE html>
<html>
<body>
<?php
ECHO "Hello World!<br>";
echo "Hello World!<br>";
EcHo "Hello World!<br>";
?>
</body>
</html>خروجی کد بالا:
Hello World!
Hello World!
Hello World!اما، در PHP تمام متغیرها به حروف بزرگ و کوچک حساس اند. (case-sensitive)
در مثال زیر، تنها دستور اول مقدار متغیر color$ را نمایش می دهد: (دلیل این اتفاق، این است که با سه متغیر color$ و COLOR$ و coLOR$ مانند سه متغیر متفاوت برخورد می شود)
مثال (ساختار دستورات در PHP)
<!DOCTYPE html>
<html>
<body>
<?php
$color="red";
echo "My car is " . $color . "<br>";
echo "My house is " . $COLOR . "<br>";
echo "My boat is " . $coLOR . "<br>";
?>
</body>
</html>خروجی کد بالا:
My car is red
My house is
My boat isبرای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
سازنده کلاس در PHP
سازنده یا Constructor
سازنده تابعی است که در هنگام ایجاد کلاس به صورت اتوماتیک فراخوانی می شود و می توان توسط آن تنظیمات اولیه همانند ایجاد ارتباط با دیتابیس و یا کارهای مشابه را انجام داد.
در PHP 4 سازنده تابعی می باشد که نام آن همان نام کلاس می باشد و در PHP 5 تابعی است که با نام"construct__" می باشد.
مثال1:در مثال زیر به دو روش، تابع سازنده تعریف شده است:
<?php
class className{
function __construct()
{
echo 'className created from PHP5 format';
}
function className()
{
echo 'className created from PHP4 format';
}
}
$a=new className();
؟>خروجی کد بالا:
اگر در PHP 5 اجرا شود خروجی آن className created from PHP5 format خواهد بود و اگر در PHP 4 اجرا شود خروجی آن className created from PHP4 format خواهد بود.
توجه: در PHP 5 چنانچه تابع construct__ وجود نداشته باشد مدل PHP 4 آن اجرا خواهد شد.
مثال2:
<?php
class My_class
{
public $name;
function __construct($Param="Amir")
{
$this->name=$Param;
}
function SayHello()
{
print "Hello My Name is $this->name"."<br />";
}
}
$obj1=new My_Class();
$obj1->SayHello();
$obj2=new My_Class("Reza");
$obj2->SayHello();
?>خروجی کد بالا:
Amir
Rezaهمانطور که دیدید در مثال بالا یک سازنده ساختیم و مقدار دیفالتش را روی "Amir" گذاشتیم که اگر هیچی وارد نشد این عبارت چاپ بشود.
مخرب یا Destructors
درکنار سازنده مخرب نیز وجود دارد که معکوس سازنده عمل می کند، قبل از، از بین رفتن کلاس اجرا می شود و برای خالی کردن حافظه و یا قطع ارتباط دیتابیس و کارهای مشابه به کار می رود.
در واقع مخرب، زمانی فراخوانی می شود که تمام رفرنس های کلاس مورد نظر رفته اند.
مثال:
<?php
class className{
funcrion __construct()
{
echo 'Start of className';
}
function __destruct()
{
echo 'End of className';
}
}
$a=new className();
?>خروجی کد بالا:
Start of className
End of className