یک وبلاگ دیگر از یک برنامه نویس دیگر
نوشتههایی با برچسب PHP
فنی حرفه ای و رویای پیشرفت!
مهر ۲۰م
قبلا گفتم، رشته تحصیلی من برق بوده. ولی بنا به دلایلی با PHP میونه خیلی خوبی دارم و از چند سال پیش به خواست یکی از دوستانم که اون موقع مدیر گروه کامپیوتر بود، PHP رو هم درس میدم.
امسال از یه دانشگاه پیام نور، که کلاسهای فنی و حرفه ای رو هم به صورت رایگان برای دانشجوهاشون میگذارن باهام تماس گرفتن (و هنوز هم نمیدونم منو کی معرفی کرده!!) برای دوره توسعه دهنده وب با PHP از من خواستن که درس بدم.
رفتم و سرفصلها رو از سایتش گرفتم، یکی دیگه هم بود (این لینک و این لینک) بگذریم از کل قضیه مسخره بودن سرفصل، رسیدم به منابع :

موارد هشت و نه.
اول اینکه سایت PHP.com هیچ ربطی به PHP نداره جز اینکه با PHP نوشته شده!! اون سایت Parents Helping Parents هستش نه PHP : Hypertext Preprocessor !
دوم اینکه مگه MySQL محصول RedHat هستش که سایت RedHat رو معرفی میکنید براش؟؟!! خودش یتیمه مگه!! خصوصا الان که صد تا صاحب پیدا کرده!
حالا مساله اینجاست، کسی که این استاندارد رو نوشته، اصلا به این سایتها سر زده؟ اصلا اطلاعاتی درباره اینها داره؟ و آیا این شخص یا گروه صلاحیت نوشتن این استاندارد رو دارن؟ مطالب هم ثابت میکنه اینرو -خودتون بخونید- ، وگرنه میشه گفت اینها غلط چاپیه :) که من مطمئنم نیست!
باقیش رو نمیدونم ولی واقعا این استانداردیه که شما دارید به خورد ملت میدید؟؟ اونوقت این میخواد مایه پیشرفت بشه؟
بازم یک نکته کوچک تو PHP
مهر ۱۶م
یکی از مشکلاتی که برنامه نویسهای تازه کار با اون خیلی برخورد میکنن، طرز برخورد PHP با اپراتورهای منطقیه. برای نمونه == که برای بررسی اینه که دو متغیر با هم برابرن یا نه.
کد ساده ای رو در نظر بگیرید مثل :
<?php
if ('string'==true)
echo "It's equal!"
و خیلی ساده اینکه اینها برابرند و شرط درسته. در حقیقت PHP همه رشته ها رو به true تعبیر میکنه، مگه دو رشته به خصوص رو. اولی رشته ای که خالی باشه، و دومی رشته ای که حاوی 0 (کاراکتر صفر) باشه. این دو تا برابر false هستن. یعنی دقیقا یک صفر داخل رشته.(اینم از اون استثناهای PHP هستش که نمیتونم درکش کنم، ولی اینجوریه دیگه! گفتن که رشته خالی با رشته حاوی یک عدد صفر کله گنده، و NULL و FALSE هر چهار تا برابرند! علت رو میتونم حدس بزنم ولی نمیتونم درکش کنم، به راحتی میتونست اینجوری نباشه، خصوصا اون رشته حاوی صفر منظورمه.)
برای اینکه رفتار شبیه C رو داشته باشید از اپراتور === (سه مساوی) استفاده کنید، این اپراتور علاوه بر مقدار نوع رو هم بررسی میکنه. یعنی این کد :
<?php
if ('string'===true)
echo "It's equal!"
دیگه مثل قبلی نیست. این حالت دیگه if درست نیست.
شاید بگید این خیلی سادست، چیزی که همیشه میشنوم! ولی وقت عمل که میشه، میبینم همین نکته کوچک چقدر افراد رو دچار دردسر میکنه! تا حدی که امروز یکی اومده و میگه که یه باگ تو PHP کشف کردم! (همون کد اولی رو) و باقیش هم که قابل حدسه! چون بار اول بود با اون شخص روبرو میشدم، نمیشد یهو جوابشو بدم، از یه طرف هم طرف کلی ادعا داشت، که مونده بودم اصلا چی میتونم بگم!
– یه خواهش از دوستان همشهری و حضوری! من یه برنامه نویسم، حرفه ای هم کار میکنم، ولی به خدا با هیچ کس کل کل ندارم!!!! عاجزانه خواهشمندم منو تو هیچ زمینه ای علم! نکنید. گر چه قد و قواره من فقط به درد علم میخوره و بس!
HTTP Redirect
شهریور ۲۸م
یه چند وقتی هست که مدام درگیر کارهای امنیتی، خصوصا برای PHP هستم. این دفعه میخوام یه مشکل کوچیک رو توضیح بدم. خیلی ها معمولا اینکار رو انجام میدن (دست کم کدی که من امروز دیدم اینطوری بود! ) :
<?php
if (!check_current_user_has_privilege_to_this_page()){
header("Location: some_other_page.php");
}
//
echo "This is very important data!";
این کد، بررسی میکنه یه تابع دسترسی به این صفحه رو داره، اگر نه پاسش میده به یه صفحه دیگه، در غیر اینصورت (یعنی اگه کاربر دسترسی داشت) اطلاعاتی رو که باید نشون بده نشون میده، یا کارهایی که باید انجام بشه رو انجام میده. اطلاعات و یا کارهایی که ما نمیخوایم کاربر عادی بدون رد کردن شرطهای امنیتی مثل رمز ببینه.
ولی اینجا یه مشکل هست :) خیلی هم بزرگه. header() اطلاعات رو میفرسته به طرف کاربر و در طرف کاربر عمل جابجایی (redirect ) انجام میشه. حالا اگه با یه برنامه که درکی از Redirect و اصولا پروتکل HTTP نداره این صفحه باز بشه؟؟ یا بدتر، اول این افزونه فایرفاکس رو نصب کنید بعد صفحه رو باز کنید، البته قبلش آدرس صفحه رو توی تنظیمات افزون اضافه کنید، اینجوری:
میبینید که صفحه کاملا باز میشه.برای مثال آدرس
http://cyberrabbits.net/non/bigbang/headercheck.php
رو چک کنید که این مشکل رو داره، کدش هم اینه :
<?php
/*
* this is an example for redirect problem :)
* */
if (true)
header("Location: http://google.com");
echo "This is very important data, you can not see this!(or you can :) )";
قاعدتا فسمت echo هیچوقت نباید نمایش داده بشه، ولی اون افزونه نصب و فعال باشه دیده میشه :) این یعنی که این روش یه چیزی کم داره.
خوب چاره چیه؟؟
خیلی ساده :
<?php
if (!check_current_user_has_privilege_to_this_page()){
header("Location: some_other_page.php");
die(); //Very sweet :) little , beautiful function!!
}
//
echo "This is very important data!";
یه نکته کوچک در PHP
شهریور ۲۵م
همونطور که میدونید توی PHP برای اپراتور OR دو نسخه وجود داره، وشاید کمتر کسی بدون که اینها دوتا از لحاظ طرز عمل تفاوتی ندارن، ولی اولویت عملیاتی متفاوتی دارن .(چند وقت پیش یه بحثی توی فروم iranphp.org مطرح شد در اینباره.)
به عبارتی خیلیها درست نمیتونن نتیجه این کد رو حدس بزنن :
<?php
function someFunc(){
return true;
}
$x=false;
$y= $x || someFunc();
$z= $x OR someFunc();
var_dump($y);
var_dump($z);





