مجموعه مقالات فارسی

مقالات
موضوع
PHP
MySQL
کدهای کاربردی
برنامه های بازمتن
برنامه های کمکی
روش های طراحی

-- Old Weblog --


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

6 | امروز:
89 | ديروز:
77130 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | مهر 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 |  |  |  |  |  | 1
2 | 3 | 4 | 5 | 6 | 7 | 8
9 | 10 | 11 | 12 | 13 | 14 | 15
16 | 17 | 18 | 19 | 20 | 21 | 22
23 | 24 | 25 | 26 | 27 | 28 | 29
30 |  |  |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

7 | امروز:
89 | ديروز:
77131 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آذر 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 |  |  | 1 | 2 | 3 | 4
5 | 6 | 7 | 8 | 9 | 10 | 11
12 | 13 | 14 | 15 | 16 | 17 | 18
19 | 20 | 21 | 22 | 23 | 24 | 25
26 | 27 | 28 | 29 | 30 |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

8 | امروز:
89 | ديروز:
77132 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

PHP/HTML editor for VS .Net | -
PHPScript | -
Windows Vista | -
xajax version 0.1 beta4 | -
PHP2Go Framework | -
Phalanger version 1.0 RC1 | -
PHPMailer 1.73 | -
phpXplorer - File Management System | -
PHP Project Manager 0.5 | -
مقاله: تصدیق هویت کاربر | -
PHP Anti Virus | -
آشنایی با تاريخچه PHP | -
پروژه سيستم مديريت محتواي ايراني | -
AJAX Matters | -
Utah PHP Users Group | -
پلی میان PHP و JAVA | -
iBlog - Ilia Alshanetsky | -
PHP Coding Standard | -
<< 1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

13 | امروز:
89 | ديروز:
77137 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

نصب و پيکربندي phpMyVisites | -
مجله امنیت In Secure | -
مقاله :Database Design | -
Miranda Instant Messenger | -
سرویس ایمیل رایگان XASA | -
سایت XOOPS فارسی | -
Monket:Ajax enabled online calendar | -
mp[3]act :Ajax Web application | -
Ben Ramsey's weblog | -
AjaxAC - PHP framework for AJAX | -
بهترین های برنامه های رایگان! | -
امکانات جدید PHP 5.1 | -
PHP ده ساله شد! | -
منابع مختلف فراگیری AJAX | -
The Semantic Web | -
AJAX - information and tutorials | -
Ajax Blog | -
Yahoo + PHP + Ajax =>mindset | -
<< 1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

17 | امروز:
89 | ديروز:
77141 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

Ajaxian.com | -
Tony Marston's Web Site | -
www.WebSecurity.ir | -
مقاله : آشنايي با MVC | -
مقاله: کار با cURL در PHP | -
MySQL Programming in a Breeze | -
برنامه انجمن Pariah BB | -
Design Patterns for AJAX Usability | -
RADMAN ITD weblog | -
The anatomy of an AJAX framework | -
phpMyLinks: Managing HTTP URLs | -
PHP & AJAX presentation | -
AJAX Spreadsheet | -
مشکلات Ajax | -
UNIX Commands cheat sheet | -
MySQL Cheat Sheet | -
ایجاد یک سیستم ارسال خبر با PHP | -
سایت IranAMP | -
<< 1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

18 | امروز:
89 | ديروز:
77142 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

www.Pure-PHP.de | -
Navicat 2005 منتشر شد. | -
PHP Installation Generator | -
Ajax, Ajax Everywhere | -
Apple's home pages | -
Netscape 8 منتشر شد. | -
PHP & AJAX Presentation Online | -
PHP + J2EE | -
ساخت یک وبلاگ با Dreamweaver وPHP | -
PHP Tutorials | -
BackBase.com | -
جستجوي الماس در Amazon | -
phpStat 1.5 منتشر شد. | -
phpBB 2.0.15 منتشر شد. | -
کار با فريم ورک PRADO | -
DWR : Ajax For JAVA | -
dodgeball + Google | -
Curiosity is bliss | -
<< 1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

19 | امروز:
89 | ديروز:
77143 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

mod_rewrite Cheat Sheet | -
Caching output in PHP | -
LightPress 1.0.0 منتشر شد. | -
ويلاگ Robert Peake | -
سيستم وبلاگ Gallina | -
The Strange Zen Of JavaScript | -
مقاله: Password Hashing | -
کتاب PHP 5 power programming | -
* Pure Potential * | -
Mambo -> Jango | -
ساخت يك Dictionary‌ با روش Ajax | -
XtraGoogle | -
Serendipity 0.8‌ منتشر شد. | -
FlickrJS:: A wrapper for Flickr API | -
PfP Studio Alpha2 منتشر شد. | -
Ajax.NET Blog | -
Jaws: مجموعه اي از ابزارهاي php | -
PHP Freaks‌ با ظاهري جديد | -
<< 1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

20 | امروز:
89 | ديروز:
77144 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

Code Stylist PHP Studio منتشر شد. | -
phpMyBackupPro 1.5 منتشر شد. | -
FORMfields PHP Framework | -
Mach-II 0.1.3 منتشر شد. | -
whateverland : يك photoblog زيبا | -
Java CMS/Portals VS PHP | -
codeZoo :منبعي براي برنامه نويسان JAVA | -
WAMP5 1.4.4 منتشر شد. | -
PHP Editor for Visual Studio .NET | -
زبان هاي برنامه نويسي NET. | -
pLog 1.0 منتشر شد. | -
MySQL 4.1 + PHP 5 :Web Hosting | -
PHP 5.0.4 && 4.3.11 منتشر شدند. | -
Green Orange Framework | -
مقايسه wordpress و textpattern | -
PHP CMSs VS JAVA CMSs | -
AJAX Toolkit v0.10 منتشر شد. | -
Phalanger:PHP .NET compiler | -
<< 1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

10 | امروز:
89 | ديروز:
77134 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

خدمات مختلف Google | -
Switching from MT to WordPress | -
سايت نقشه تهران( كتاب اول) | -
مرورگر جديد Maxthon | -
PHP Studio v1.50 منتشر شد. | -
"Little Jo" 0.1 منتشر شد. | -
مقاله:ساخت يك سيستم نظرسنجي | -
استفاده msn از php و MySQL ! | -
PHPProxy 0.6 منتشر شد. | -
Zend Core for IBM | -
ZEND Studio 4 منتشر شد. | -
چگونگي پيشرفت يك پروژه open Source ! | -
اولين تصويري كه روي وب قرار گرفت! | -
راهنماي استفاده از XMLHttpRequest | -
this can't be the end | -
مقدمه اي بر توابع كار با تصاوير در PHP | -
Node Runner v0.6.0 منتشر شد. | -
Cool Things You Can Do With PHP | -
<< 1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

9 | امروز:
89 | ديروز:
77133 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

Ajax : روشي نوين در طراحي برنامه هاي كاربردي وب | -
PHPEmaillist 0.3 منتشر شد. | -
101 دليل براي برتري JAVA نسبت به NET. | -
امكانات جديد در Zend Studio 4 | -
PunBB 1.2.1 منتشر شد. | -
ماژول جديد php براي Daffodil DB | -
PHP Cryptography | -
Webligo نرم افزار سرويس ميزباني وبلاگ | -
مروري بر XAMPP | -
ASP.NET 2.0 QuickStart | -
سايت Chris Shiflett در مورد امنيت php | -
Flickr: سايتي براي اشتراك تصاوير | -
kPlaylist 1.5 منتشر شد. | -
سايت فارسي Coppermine | -
phpCodeGenie 3.0.2 منتشر شد. | -
ScriptViewer 2.0.0 منتشر شد. | -
PHP 4.3.10 & 5.0.3 منتشر شدند! | -
آيا PHP بهتر از JAVA است؟ | -
<< 1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

11 | امروز:
89 | ديروز:
77135 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

PHP 5.0.3RC2 منتشر شد. | -
phpPgAdmin 3.5.1 منتشر شد. | -
www.phpbeans.com | -
EngInSite : يك اديتور قدرتمند براي PHP | -
TinyButStrong 2.0 منتشر شد. | -
WACT 0.2 منتشر شد. | -
ALVAN WEB :وبلاگي مفيد براي كاربران Wordpress | -
آشنايي با XAMPP و نحوه نصب آن | -
ippfp 0.2.8 منتشر شد. | -
PHPEclipse 1.1.2 منتشر شد. | -
چرا از PHP استفاده كنيم؟ | -
PHP Web Toolkit 1.0.3 منتشر شد. | -
PHP Runner: كاري از آرش مصلحي | -
افزايش روز به روز كاربران Mambo | -
25 پروژه برتر sourceforge.net | -
PHP 4.3.10RC1 منتشر شد. | -
10 ويژگي يك ميزبان linux | -
phpCMS 1.2.1 منتشر شد. | -
<< 1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

12 | امروز:
89 | ديروز:
77136 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

PEAR پنج ساله شد! | -
phpBB 2.0.11 منتشر شد. | -
PHP 5، Oracle و آينده | -
FUDforum 2.6.8 منتشر شد. | -
phpPgAdmin 3.5 منتشر شد. | -
سايت mambo فارسي | -
BIF 0.4.1 منتشر شد. | -
Firefox 1.0 منتشر شد. | -
php را بهتر بشناسيم! | -
Seagull 0.3.11.p1 منتشر شد. | -
PHPopenmonitor 1.1 منتشر شد. | -
مقاله فارسي:امنيت در PHP | -
PHPSiteStats 0.7 منتشر شد. | -
OpenPHPNuke 2.2.0 منتشر شد. | -
PHPSurveyor و انتخابات امريكا | -
B-Forms 1.1 منتشر شد. | -
PhpNuke 7.5 كاملا فارسي شده | -
Midgard 1.6.0 منتشر شد. | -
<< 1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

14 | امروز:
89 | ديروز:
77138 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

PHPX 3.5.4 منتشر شد. | -
WAMP5 1.4 منتشر شد. | -
Apache HTTP Server 1.3.33 منتشر شد. | -
برندگان مسابقه zend اعلام شدند. | -
PhpMyLibrary 2.0.3 منتشر شد. | -
XAMPP 1.4.9 منتشر شد. | -
Yawp 1.0.4 منتشر شد. | -
WAMP5 1.3 منتشر شد. | -
آشنايي با htaccess. | -
WordPress 1.2.1 منتشر شد. | -
PHPdataMiner 0.40 منتشر شد. | -
phpMyFAQ 1.4.2 منتشر شد. | -
0.4.0 ActiveLink PHP XML Package منتشر شد. | -
Scry 1.1 منتشر شد. | -
برنامه نويسي سريع با php | -
برنامه نويسي قدرتمند با php5 | -
مهاجرت از Access به MySQL | -
eZ publish 3.4.2 منتشر شد. | -
<< 1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

15 | امروز:
89 | ديروز:
77139 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

phpMyAdmin 2.6.0 منتشر شد. | -
PHP 5.0.2 منتشر شد. | -
fckeditor يك اديتور بازمتن و قدرتمند! | -
<< 1 2 3 4 5 6 7 8 9 10 11 12 13
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

16 | امروز:
89 | ديروز:
77140 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

21 | امروز:
89 | ديروز:
77145 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

25 | امروز:
89 | ديروز:
77149 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

22 | امروز:
89 | ديروز:
77146 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

23 | امروز:
89 | ديروز:
77147 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

24 | امروز:
89 | ديروز:
77148 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Flickr : نمونه اي موفق از به كارگيري محصولات Open Source

Flickr وب سايتي براي به اشتراك گذاري تصاوير( online photo-sharing) مي باشد.
اين وب سايت يك نمونه عملي از به كارگيري تكنولوژي هاي مختلف Open Source است.
قدرت اين سايت هم بواسطه همين ابزارهاي مختلف Open Source است:
Red Hat Linux + Apache Web server + MySQL databases + PHP, Perl + Smarty templates + Postfix mail gateways و حتي ImageMagick براي كار روي تصاوير

Flickr مجموعه عظيمي از تصاوير ديجيتالي را شامل مي شود كه نگهداري آنها مستلزم داشتن يك پايگاه داده قدرتمند با وظايف سنگين(heavy-duty) است.MySQL مشهورترين پايگاه داده Open Source پشتوانه خوبي از اطلاعات را براي اين سايت فراهم آورده است. Flickr حدود 250000 كاربر دارد و در هر دقيقه بايد حدود 5000 صفحه را در اختيار كاربران قرار دهد كه اين صفحات شامل 100000 پرس و جو(query) از پايگاه داده مي شود.MySQL نقش خود را به عنوان يك پايگاه داده براي برنامه هاي با مقياس بزرگ در اينجا به خوبي ايفا كرده است.
جدای از بحث پايگاه داده ، براي مديريت تصاوير وقتي كه شما تصويري را آپلود مي كنيد مراحل زير انجام مي شوند كه همبستگي ابزارهاي Open Source را نشان مي دهند:

  • it is resized by ImageMagick
  • The EXIF and IPTC metadata tags are extracted with Perl
  • Java is used for processing daemons and for FlickrLive, a real-time chat application
  • Web pages you see are generated from Smarty templates and PHP scripts

Cal Henderson مدير سايت Flickr گفته است كه در دسترس بودن ابزارهاي open sourceموجب شد كه زمان زيادي در طراحي صرفه جويي شود و از حدود 20000 خط از كدهاي Open Source استفاده كرده است.

"The sheer amount of PHP and Perl code out there means someone's done everything before. We use bits of PEAR and Smarty for all the templating."
1383-11-21 ساعت 19:05:03
PHP يا ASP.NET ؟

PHP بهتر است یا ASP.NET ؟! این قصه سر دراز دارد! به بیشتر انجمن های روی وب که سر میزنی تاپیکی با این عنوان می بینی. دوستداران جناب بیل گیتس در یک طرف و دشمنان او که مرتب به دنبال حفره های جدید امنیتی در ویندوز هستند،در طرف دیگر میدان قرار دارند. این جدال ،در واقع، رویارویی ذهن های بسته در برابر ذهن های باز و رو به آینده می باشد. به قول یکی از دوستان، مغز مثل یک چتر نجاته که وقتی باز بشه تازه شروع به کار می کنه!

وب سایت Oracle در مقاله ای حمایت خود از PHP را نشان می دهد و مقایسه ای یک طرفه بین PHP و ASP.NET انجام می دهد:

 | PHP 4 | PHP 5 | ASP.NET
Software price | free | free | free
Platform price | free | free | $$
Speed | strong | strong | weak
Efficiency | strong | strong | weak
Security | strong | strong | strong
Platform | strong | strong | weak (IIS only)
Platform | any | any | win32 (IIS only)
Source available | yes | yes | no
Exceptions | no | yes | yes
OOP | weak | strong | strong

از طرف دیگر مایکروسافت مقاله ای برای مهاجرت از PHP به ASP.NET می نویسد و در انجمن های خود سعی می کند PHP کارها را هم وارد چارچوب خود کند.علاقمندان مایکروسافت PHP را زبانی محدود و بسته در برابر کران های نامحدود ASP.NET می دانند.آنها PHP را زبانی Java-Like می دانند که از شرکت Sun (دوست سابق و دشمن امروز مایکروسافت)آب می خورد و آن را برای پروژه های در مقیاس بزرگ(Large-Scale) اصلا مناسب نمی بینند.

حالا به نظر شما PHP بهتر است یا ASP.NET ؟ اگر هدف شما برنامه نویسی تحت وب است، PHP زبان مناسب شما است. PHP ساده است، انعطاف پذیری بالایی دارد و مرتب در حال رشد است. اگر هدف شما برنامه نویسی تجاری تحت وب است به نظر من ASP.NET مناسب تر است زیرا از اندیشه یک شرکت کاملا تجاری برخواسته است! حال شما مختارید که یکی را انتخاب کنید یا هر دو(البته ، دو پادشاه در اقلیمی نگنجند).

PHP comes from Developers, not Marketers.

If PHP was a person, it would have started out as a high school nerd that none of the popular kids noticed. No bright clothes or rich parents. Probably would have worked at the local burger joint to save up for college.

When we grow up, we recognize that the nerds knows the answers that get the jobs done faster.

After spending years writing dumb jock apps with ASP, I learned that there are simply better ways to do things.

Rather than falling for the massive marketing hype of Microsoft, I look to the nerd to see what he's doing, and he's doing everything with PHP.

I no longer care what "superior" qualities Microsoft claims to have over whatever it is they are afraid of.

Because PHP is built by developers for developers, rather than by marketers for BDMs, I know I'm generally going to get the best solution to solve my problem with minimal overhead (redundant BS code).

There are modules for just about anything I could ever imagine. And oh yeah! That little thing called SOAP Microsoft claims makes .NET so superior to all other things. PHP supports that too. At the end of the day, PHP allows me to do far more than I could ever do with bonehead tools.

Posted by Peter Drinnan on May 10th, 2003 at 03:06:17 GMT

1383-09-01 ساعت 20:50:56
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

31 | امروز:
89 | ديروز:
77155 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 ساعت 08:26:31
تقويم هجري شمسي در PHP

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

این تقویم از توابع تبدیل تاریخ میلادی به جلالی (jdf) که توسط گروه پروژه های فارسی ارائه شده،استفاده می کند. فایل مربوط به تقویم از اینجا قابل دریافت است.

توضیحی در مورد کد برنامه: کدنویسی این برنامه کار ساده ای است. برای ساخت جدول تقویم،باید ابتدا اولین روز هر ماه را پیدا کنیم و سپس به اندازه آن در جدول خانه خالی درج کنیم(توجه کنید که هر سطر جدول ۷ ستون دارد ) در ادامه بسته به ماه مربوطه(۳۱،۲۹ و یا ۳۰ روزه) بقیه روزها را در جدول درج می کنیم و جدول را می بندیم.(فقط مساله ای که وجود دارد سالهای کبیسه مثل امسال است که باید لحاظ شود.) برای حرکت بین ماههای مختلف از ارسال پارامترها به روش GET استفاده می کنیم. این توضیح کلی نحوه ساخت تقویم جلالی بود.برای مشاهده جزئیات کار به کد منبع برنامه مراجعه کنید.

1383-07-09 ساعت 10:34:29
ساخت يك كلاس Timer ساده

در اين قسمت به ساخت يك كلاس Timer مي پردازيم كه كاربردهاي زيادي مي تواند داشته باشد.براي مثال براي اندازه گيري زمان ايجاد يك صفحه (Page Generation Time) كه در آن Query هاي زيادي وجود دارد، مي توان از اين كلاس استفاده نمود و با بهينه سازي اين Query ها، زمان ايجاد صفحه را كاهش داد. در زير كد مربوط به اين كلاس آورده شده است:

 // Class:     microTimer
// Description: calculates the micro time

class microTimer {
    function start() {
        global $starttime;
        $mtime = microtime ();
        $mtime = explode (' ', $mtime);
        $mtime = $mtime[1] + $mtime[0];
        $starttime = $mtime;
    }
    function stop() {
        global $starttime;
        $mtime = microtime ();
        $mtime = explode (' ', $mtime);
        $mtime = $mtime[1] + $mtime[0];
        $endtime = $mtime;
        $totaltime = round (($endtime - $starttime), 5);
        return $totaltime;
    }
}
تحليل كد: اين كلاس دو متد (تابع عضو) شروع و پايان دارد كه دقيقا كار يك زمان سنج را انجام مي دهد. تابع ()microtime يكي از توابع پركاربردphp مي باشد كه زمان را به صورت رشته"msec sec" بر مي گرداند كه sec زمان جاري اندازه گيري شده از مبدا زمان UNIX مي باشد.(0:00:00 January 1, 1970 GMT)
msec هم بخش مربوط به مايكرو ثانيه مي باشد. توسط تابع explode و مشخص كردن كاراكتر جداكننده اين دوبخش را از هم جدا مي كنيم و در آرايه اي قرار مي دهيم. با جمع كردن اين دو بخش، زمان جاري را به صورت مايكرو ثانيه بدست مي آوريم. پارامتر دوم تابع ()round ،مشخص مي كند كه عدد اعشاري مورد نظر تا چند رقم round شود.
استفاده از كلاس Timer :براي اندازه گيري زمان ايجاد يك صفحه، در ابتداي آن كد زير را مي نويسيم و يك Object از روي class خود ايجاد مي كنيم:
 //در قسمت آغازين كد برنامه شما
$Timer = new microTimer;
$Timer->start();
در انتهاي برنامه خود هم تابع stop از كلاس Timer را فراخواني مي كنيم:
 //در انتهاي كد برنامه
echo"<!-- execution time: ".$Timer->stop()." -->";

1383-04-09 ساعت 22:47:25
نمايش تعداد بازديدكنندگان ديروز ، امروز و كل

در اين قسمت به ساخت يك شمارنده ساده (Hit Counter) با استفاده از php و MySQL مي پردازيم.
قبل از هر چيز با كمك PhpMyAdmin جدولي با ساختار زير ايجاد كنيد:

 # Table structure for table `counter`
#

CREATE TABLE `counter` (
  `id` tinyint(4) NOT NULL default '1',
  `total` bigint(20) unsigned NOT NULL default '0',
  `yesterday` int(10) unsigned NOT NULL default '0',
  `today` int(10) unsigned NOT NULL default '0',
  `date` date default NULL
) TYPE=MyISAM;

#
# Dumping data for table `counter`
#

INSERT INTO `counter` VALUES (1, 0, 0, 0, NOW());
اين جدول شامل يك فيلد مشخصه، سه فيلد براي شمارش بازديدها و يك فيلد براي تاريخ مي باشد.توجه داشته باشيد كه اين جدول، يك record بيشتر ندارد و عمليات بر روي جدول با Update كردن همين ركورد انجام مي شود. به عنوان پيش فرض مقادير صفر و همچنين تاريخ جاري را در اين ركورد ثبت مي كنيم.
حالا كه ساختار ذخيره داده ها را مشخص كرديم به نوشتن كد برنامه مي پردازيم:
//اطلاعات لازم براي اتصال به پايگاه داده
$db_user="username";
$db_pass="password";
$db_name="MyDB";
//اتصال به پايگاه داده
$con=mysql_connect('localhost',$db_user,$db_pass);
mysql_select_db($db_name,$con);
اولين مرحله كار ، اتصال به پايگاه داده مي باشد.در كد بالا بايد اطلاعات مربوط به اتصال را به درستي وارد كنيد و الا اجراي برنامه در همين جا متوقف خواهد شد!
//دريافت نتايج از جدول
$result=mysql_query("SELECT * FROM counter");
$row=mysql_fetch_array($result);
$total=$row['total'];
$yesterday=$row['yesterday'];
$today=$row['today'];
$date=$row['date'];
list($year,$month,$day)=split('-',$date);
در اين مرحله اطلاعات قبلي ذخيره شده در پايگاه داده را بازيابي مي كنيم. تابع split رشته اي را به عنوان آرگومان دوم خود دريافت كرده و طبق آرگومان اول كه حاوي كاراكتر جداكننده مي باشد آن را تقسيم مي كند و نتيجه را در آرايه اي به ما برمي گرداند. دستورlist عناصر آرايه را به متغيرهاي ليست، نسبت مي دهد.
 $CurrentDate=date("Y-m-d"); //زمان جاري
list($CurrentYear,$CurrentMonth,$CurrentDay)=split('-',$CurrentDate);
در اين قسمت با استفاده از تابع date زمان جاري را بدست مي آوريم.توجه داشته باشيد كه آرگومان اين تابع فرمت دريافت تاريخ را مشخص مي كند.
 //تابع به روزرساني جدول
function Update($today,$yesterday,$total,$date){
    mysql_query("UPDATE counter SET today='$today',yesterday='$yesterday',total='$total' ,date='$date' WHERE id=1");
}
تابع Update وظيفه به روزرساني جدول را بر عهده دارد.اين تابع ، مقادير فيلدها را بر اساس پارامترهاي دريافتي تنظيم مي كند.
 //مقايسه تاريخ جاري با تاريخ ذخيره شده در جدول و انجام محاسبات لازم
$total++;
if($CurrentYear==$year){
    if($CurrentMonth==$month){
        if($CurrentDay==$day){
            $today++;
            Update($today,$yesterday,$total,$CurrentDate);
        }else{
            if($CurrentDay==++$day){
                $yesterday=$today;
                $today=1;
                Update($today,$yesterday,$total,$CurrentDate);
            }else{
                $yesterday=0;
                $today=1;
                Update($today,$yesterday,$total,$CurrentDate);
            }
        }
    }else{
        if($CurrentMonth==++$month){
            $yesterday=$today;
            $today=1;
            Update($today,$yesterday,$total,$CurrentDate);
        }else{
            $yesterday=0;
            $today=1;
            Update($today,$yesterday,$total,$CurrentDate);
        }
    }

}
else{
    if($CurrentYear==++$year){
        $yesterday=$today;
        $today=1;
        Update($today,$yesterday,$total,$CurrentDate);
    }
    else{
    $yesterday=0;
    $today=1;
    Update($today,$yesterday,$total,$CurrentDate);
    }
}
هسته اصلي برنامه، قسمت بالا مي باشد.اين قسمت در واقع تمرين ساختارهاي شرطي تو در تو مي باشد. دستورات مقايسه اي زمان جاري را با زمان ذخيره شده قبلي مقايسه مي كنند و طبق آنها عمل شمارش را انجام مي دهند.سپس با استفاده از تابع Update عمل به روزرساني جدول صورت مي گيرد.
 //بازيابي مجدد اطلاعات از جدول
$result=mysql_query("SELECT * FROM counter");
$row=mysql_fetch_array($result);
$total=$row['total'];
$yesterday=$row['yesterday'];
$today=$row['today'];
در آخر كار، يك پرس و جوي ديگر انجام مي دهيم و اطلاعات به روز شده را دريافت مي كنيم و در متغيرهاي مربوطه درج مي كنيم.براي نمايش شمارنده، به صورت زير عمل مي كنيم:
 //نمايش شمارنده
echo "today:<strong>$today</strong><br>";
echo"yesterday: <strong> $yesterday</strong><br>";
echo"total:<strong> $total</strong>";
حالا مي توانيد كدهاي بالا را در فايلي به نام counter.php ذخيره كنيد و آن را آزمايش كنيد. با استفاده از كد زير مي توانيد اين فايل را به صفحه اصلي سايت خود ضميمه كنيد:
<?php
include_once("counter.php");
?>
فايل سورس برنامه به همراه ساختار جدول از اينجا قابل دريافت است.
به خاطر درگيري با امتحانات پايان ترم( huh) خيلي نتونستم به جزئيات بپردازم.اميدوارم كه با نوشتن اين برنامه، چيز جديدي ياد گرفته باشيد cool
اگر نظر خاصي براي بهبود برنامه داريد يا اينكه ايرادي در برنامه مي بينيد، حتما در بخش نظرات بنويسيد wink

1383-03-31 ساعت 22:43:25
نمايش ۵ مراجعه کننده آخر سايت

در این قسمت به ساخت برنامه ای برای نمایش مراجعه کننده آخر سایت می پردازیم. با استفاده از php و MySQL نوشتن این برنامه بسیار ساده است. قبل از هر کاری باید یک Table ساده درست کنیم تا لینک های ورودی را در آن ذخیره کنیم. ساختار Table ما به صورت زیر است:

 <!-- create the following table in phpmyadmin -->

CREATE TABLE referers (
id INT (10) not null AUTO_INCREMENT,
site VARCHAR (255),
time INT (10),
PRIMARY KEY (id)
);
حالا به نوشتن اصل برنامه می پردازیم .ادیتور خود را باز کرده، کد زیر را در آن وارد کنید وآن را با نام refs.php ذخیره کنید:

<?php

$db_host = "localhost";
$db_username = "username";
$db_password = "password";
$db_name = "database_name";

$ref = $_SERVER['HTTP_REFERER'];
$domain = explode("www.", $_SERVER['SERVER_NAME']);

mysql_connect($db_host,$db_username,$db_password) or die(mysql_error());
mysql_select_db($db_name) or die(mysql_error());

if ($ref != "")
{
if (!eregi($domain[1], $ref))
{

    $time = time();

    $addref = "INSERT INTO referers (site, time) VALUES ('$ref', '$time')";
    mysql_query($addref);
  }
}

function show_refs()
{
   $getref = "SELECT * FROM referers ORDER BY time DESC LIMIT 5";
   $reflist = mysql_query($getref);

   echo "<b>Last 5 Referers:</b><br>\n";

   while($r=mysql_fetch_array($reflist))
{
   $site = $r['site'];

   echo "<a target=\"_blank\"  href= \"$site\" >$site</a><br>\n ";
  }
}

?>
تحلیل کد:محور اصلی این برنامه،استفاده از متغیر $_SERVER['HTTP_REFERER'] می باشد.
این متغیر، آدرس سایتی را که کاربر از طریق آن وارد سایت ما شده است را،در بر دارد. نکته ای که در برنامه باید رعایت شود،مساله کاربران خودی( کاربرانی که در حال گردش در سایت ما می باشند) است. با استفاده از متغیر $_SERVER['SERVER_NAME'] و انجام یک مقایسه ساده،از نمایش آدرس وب سایت خود جلوگیری می کنیم. تابع explode برای جداسازی از یک رشته استفاده می شود، پارامتر اول تابع به عنوان جدا کننده(seperator) می باشد.نتیجه به عنوان یک آرایه از رشته های جدا شده برگردانده می شود. بقیه برنامه،یک INSERT ساده و یک SELECT با محدودیت 5 رکورد می باشد.

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

 // add this to the top of your homepage

<?  include("refs.php");  ?> ?>

سپس تابع show_refs را در محل مناسب برای نمایش ،فراخوانی کنید:

 //then where you want to show the list use:

<? show_refs(); ?> ?>
برنامه تمام شد،به همین راحتی! smiley بهتر است که به فکر افزودن امکانات بیشتری به برنامه خود باشید.مثلا یک برنامه ساده برای آمارگیری بنویسید تا با شمردن تعداد لینک های ورودی،شما را از بیشترین مراجعه کنندگان آگاه سازد. یا با به کارگیری متغیرهای Server اطلاعات بیشتری از کاربران خود،کسب کنید.در زیر دو متغیر مهم و کاربردی دیگر معرفی شده اند:

$_SERVER['REMOTE_ADDR'] :The IP address from which the user is viewing the current page.

$_SERVER['HTTP_USER_AGENT']:header from the current request, if there is one. This is a string denoting the user agent being which is accessing the page. A typical example is: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Among other things, you can use this value with get_browser() to tailor your page's output to the capabilities of the user agent.

1383-02-21 ساعت 22:37:25
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

32 | امروز:
89 | ديروز:
77156 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 ساعت 01:12:48
توابع جديد در PHP 5

امروز که داشتم لیست توابع جدید اضافه شده در PHP 5 را می دیدم متوجه توابع کاربردی جالبی شدم که تصمیم گرفتم چند تا از اونا رواینجا معرفی کنم:

تابع array_combine یکی از این توابع می باشد که دو آرایه را به عنوان ورودی می پذیرد و سپس با ترکیب این دو آرایه یک آرایه جدید می سازد و آن را برمی گرداند،بدین صورت که آرایه اول به عنوان اندیس ها (Keys) و آرایه دوم به عنوان مقادیر (Values) آرایه جدید می باشد.اگر طول دو آرایه ورودی با هم برابر نباشد یا خالی باشند، این تابع مقدار FALSE را بر می گرداند.به مثال زیر توجه کنید:

$a = array('green', 'red', 'yellow');
$b = array('avocado', 'apple', 'banana');
$c = array_combine($a, $b);

print_r($c);

خروجی:

Array
(
    [green]  => avocado
    [red]    => apple
    [yellow] => banana
)

تابع کاربردی دیگرarray_walk_recursive  می باشد. این تابع دو پارامتر ورودی دارد:اولی یک آرایه و دومی یک تابع . نحوه کار این تابع بدین صورت است که به همه اعضای آرایه دریافتی،تابع ورودی(پارامتر دوم) را به صورت بازگشتی اعمال می کند.این تابع در صورت اجرای موفق مقدار TRUE و در غیر این صورت FALSE را برمی گرداند. نکته مهم در استفاده از این تابع این است که پارامتر اول این تابع یعنی آرایه مورد نظر به صورت ارجاع مستقیم است و تغییرات اعمال شده مستقیما بر خود آرایه اثر می کنند و مقادیر آن را تغییر می دهند. برای فهم بهتر به مثال زیر توجه کنید:

$sweet = array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');

function test_print($item, $key)
{
    echo "$key holds $item ";
}

array_walk_recursive($fruits, 'test_print');

خروجی:

a holds apple
b holds banana
sour holds lemon

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

1383-07-15 ساعت 19:55:06
ساخت فايلهای PDF در PHP

در این مقاله به معرفی یکی از قابلیت های PHP ، که ساخت فایلهای PDF می باشد،می پردازیم.PDF مخفف Portable Document Format می باشد که توسط شرکت Adobe عرضه شده است.ساخت اسناد PDF توسط کتابخانه PDFlib انجام می شود. برای استفاده از extension مربوط به PDFlib باید به فایل PHP.INI رفته و آن را فعال کنید.(این کار با برداشتن سمیکالن ';' از ابتدای آن انجام می شود. توجه کنید که مسیر مربوط به extension ها را در PHP.INI درست وارد کرده باشید!)

ساخت یک سند PDF در چهار مرحله انجام می شود:

  1. ساخت یک Handle برای کار با سند
  2. تعیین فونت ها و رنگ های سند
  3. انجام عملیات نوشتن و رسم بر روی Handle با استفاده از توابع از پیش تعریف شده
  4. ذخیره سند نهایی

حالا مرحله به مرحله به ساخت یک سند PDF ساده می پردازیم:

در مرحله اول باید یک Handle برای سند خود درست کنیم که این کار توسط تابع ()pdf_new انجام می شود:

$pdf = pdf_new();

برای انجام عملیات مختلف بر روی سند،از این Handle استفاده خواهیم کرد. بعد از این کار،باید نام فایل PDF خود را تعیین کنیم که این کار توسط تابع ()pdf_open_file انجام می شود:

pdf_open_file($pdf, "HelloWorld.pdf");

وقتی فایل جدید را ساختید،می توانید داخل آن به ساخت صفحات PDF بپردازید:

// start a new page (A4)
pdf_begin_page($pdf, 595, 842);

با استفاده از تابع ()pdf_begin_page اندازه صفحات را مشخص می کنیم.واحد اندازه ها در اینجا Points می باشد که هر Point برابر ۱.۷۲ اینچ می باشد. برعکس این تابع، تابع ()pdf_end_page می باشد که بعد ازتمام شدن کار نوشتن صفحات،آنها را می بندد.

در مرحله دوم برای نوشتن در صفحات ابتدا نوع فونت مورد نظر را انتخاب می کنیم.این کار توسط تابع ()pdf_find_font انجام می شود.این تابع ۳ پارامتر دارد که اولی نوع فونت را مشخص می کند،دومی encoding مورد استفاده را معلوم می کند و سومی ،یک متغیر Boolean می باشد که مشخص می کند که آیا فونت در سند مربوطه ضمیمه شود یا خیر.بعد از این کار با استفاده از تابع ()pdf_setfont و مشخص کردن اندازه فونت، از فونت استفاده می کنیم :

$arial = pdf_findfont($pdf, "Arial", "host", 1); pdf_setfont($pdf, $arial, 10);

در مرحله سوم،حالا که فونت مشخص شد، با به کارگیری تابع ()pdf_show_xy و دادن مختصات و متن مورد نظر،آن رادر صفحه نمایش می دهیم:

pdf_show_xy($pdf, "Hello,World!",50, 750);
pdf_show_xy($pdf, "This is My first PDF document!", 50,730);

بعد از این که کار نوشتن در صفحه تمام شد، با استفاده از تابع()pdf_end_page صفحه را می بندیم:

pdf_end_page($pdf);

در مرحله چهارم، سند نهایی را با استفاده از تابع ()pdf_close ذخیره می کنیم:

pdf_close($pdf);

به همین راحتی یک سند بسیار ساده PDF ساختیم. توابع کتابخانه ای بسیار زیادی وجود دارند که اجازه انجام عملیات مختلف روی یک سند PDF را به ما می دهند.بهتر است برای کسب اطلاعات بیشتر،سری به اینجا بزنید.

<?php
// create handle for new PDF document
$pdf = pdf_new();
// open a file
pdf_open_file($pdf, "HelloWorld.pdf");
// start a new page (A4)
pdf_begin_page($pdf, 595, 842);
// get and use a font object
$arial = pdf_findfont($pdf, "Arial", "host", 1); pdf_setfont($pdf, $arial, 20);
// print text
pdf_show_xy($pdf, "Hello,World!",50, 750);
pdf_show_xy($pdf, "This is My first PDF document!", 50,730);
// end page
pdf_end_page($pdf);
// close and save file
pdf_close($pdf);
?>

﻿
1383-02-22 ساعت 22:40:25
Phuse : جستجوگر مخصوص PHP کارها

Phuse مخفف PHP Unfied Search Engine می باشد.این موتور جستجو مخصوص PHP کارها طراحی شده است.این جستجوگر هنوز در مرحله آزمایش و تکمیل می باشد.شما می توانید نسخه BETAی آن را در اینجا ببینید.در حال حاضر با استفاده از این موتور جستجو می توانید داخل ۵ وب سایت زیر به جستجو بپردازید:

  1. PHPDeveloper.org (news)
  2. PHPComplete.com (tutorials)
  3. EvilWalrus.com (code)
  4. Forums.Devnetwork.net (forums)
  5. PHPClasses.org (classes)

برای کسب اطلاعات بیشتر سری به اینجا بزنید.
1383-02-15 ساعت 22:39:25
مروری سریع بر PHP 5

ظهور PHP 3 در سال ۱۹۹۷ انقلابی در نحوه ساخت وب سایت های دینامیک به وجود آورد و این امکان را به برنامه سازان وب داد که به راحتی و به سرعت، برنامه های کاربردی تحت وب قدرتمندی خلق کنند. در ادامه PHP 4 قدرتی بیشتر از سابق پیدا کرد،PHP 4 با معرفی Zend Engine بازدهی PHP را بسیار بالا برد و اجازه گسترش بیشتر از قبل را به PHP داد. نسخه پنجم PHP که نقطه عطفی در تاریخ PHP محسوب می شود، ویژگی های اساسی و پیشرفت های مهمی را ارائه می کند.

Zend Engine II به عنوان قلب PHP 5، یک مدل برنامه نویسی شی ء گرای(Object Oriented) بسیار قدرتمند و جدید را عرضه می کند که به برنامه سازان اجازه می دهد که به ساخت برنامه های کاربردی تحت وب،بر پایه اشیاء و در مقیاس بزرگ ، با استفاده از روش ها و الگوهای طراحی رایج بپردازند. Zend Engine II زیربنایی را برای ماژولهای توسعه دهنده در حال پیشرفت فراهم می آورد که PHP را بسیار راحت تر و قدرتمند تر ار آنچه که شما انتظار دارید،می سازد.

PHP 5 یک راه جدید و پیشرفته را برای رویارویی با XML ارائه می کند که یک بستر مناسب و ایده آل برای پردازش XML می باشد. ماژول گردآوری شده جدید SimpleXML اطلاعات XML را به صورت یک نوع داده محلی در PHP در می آورد که باعث می شود پردازش XML سریعتر از قبل انجام شود و همین کار PHP را به یک زبان ایده آل برای پردازش برنامه های کاربردی XML تبدیل می کند. در تکمیل ویژگی های XML جدید، یک ماژول SOAP جدید ارائه می شود که کار با وب سرویس ها را از طریق یک API سریع و آسان می دهد.

اگر جزو علاقمندان به کارگیری پایگاه داده در برنامه های خود هستید، دیگر احتیاجی به نصب یک پایگاه داده مثل MySQL برای انجام کارهای ساده خود ندارید، زیرا یک پایگاه داده داخلی به نامSQLite این کارها را برای شما انجام می دهد. برای برنامه های کاربردی در مقیاس بزرگتر ماژول جدید MySQLi به کاربران اجازه می دهد که از ویژگی های جدید MySQL 4.1 در برنامه های خود استفاده کنند که بازدهی بیشتری را نسبت به نسخه های قبلی MySQL فراهم می کند.

منبع مطلب:http://www.devshed.com نویسنده: Zeev Suraski

1383-01-16 ساعت 22:29:25
1 2 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

27 | امروز:
89 | ديروز:
77151 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
كار با Data Object ها در php5-قسمت3

در قسمت ۱و۲ به معرفی یک DataObject پرداختیم.کلاسی به نام DO_User تعریف کرده و متدهای حذف،اضافه و بروزرسانی مرتبط با آن را برای یک سطر از رکوردها نوشتیم. در این قسمت به بررسی پرس و جوهایی(Query)می پردازیم که بیش از یک سطر را برمی گردانند.

ساده ترین روش برای حل این مساله،ساخت آرایه ای از DataObject ها است که شامل تمام رکوردهای دریافتی باشد.این راه حل ممکن است در نگاه اول منطقی به نظر برسد اما اگرquery شما ۱۰۰۰۰ سطر و یا بیشتر را برگرداند چه اتفاقی می افتد؟ یک ارایه بسیار بزرگ از اشیاء احتیاج به حجم زیادی از حافظه دارد و بار زیادی را به host شما تحمیل می کند و ممکن است منجر به از کارافتادن(Shut Down) سایت شما شود.پس بهتر است به فکر یک راه حل دیگر برای دریافت چند سطر ازداده ها باشیم:

راه بهتر این است که یک کلاس جدید برای این کار تعریف کنیم.این کلاس را Re a dOnlyResultSet می نامیم زیرا مجموعه نتایج،فقط قابل خواندن است.این نوع نامگذاری معمولا در الگوهای طراحیJ2EE برای ثبات و یکدست بودن(Consistency) ، مورد استفاده قرار می گیرد.قبل از اینکه این کلاس را بنویسیم،یک متد جدید به نام()find به کلاس DO_User اضافه می کنیم که مجموعه نتایج را برگرداند:

public function find()
{
  $sql = "SELECT * FROM User";

  // This array will hold the where clause
  $where = array();

  // Using PHP 5's handy new reflection API
  $class = new ReflectionClass('DO_User');

  // Get all of DO_User's variable (or property) names
  $properties = $class->getProperties();

  // Loop through the properties
  for ($i = 0; $i < count($properties); $i++) {
    $name = $properties[$i]->getName();
    if ($this->$name != '') {
      // Add this to the where clause
      $where[] = "`" . $name . "`='"
      . mysql_escape_string($this->$name) . "'";
    }
  }

  // If we have a where clause, build it
  if (count($where) > 0){
    $sql .= " WHERE " . implode(' AND ', $where);
  }

  $rs = mysql_query($sql);
  include_once('class-ReadOnlyResultSet.php');
  return new ReadOnlyResultSet($rs);
}

PHP 5 به صورت توکار(built-in) از Reflection API پشتیبانی می کند که توسط آن می توان در مورد یک کلاس و یا شیء خاص اطلاعات گرفت.معمولا به این کار، مهندسی معکوس(Reverse Engineering) می گویند. ما در اینجا از Reflection API برای دریافت متغیرهای عضو یا Properties یک DataObject استفاده می کنیم.اگر فرصت داشتید حتما نگاهی به این API جدید بیندازید تا به قدرت آن پی ببرید!

توجه کنید که قبل از فراخوانی find باید داده هایی را که می خواهیم روی آنها جستجو انجام داهیم،در متغیرهای عضو کلاس قرار دهیم.متد find یک query بر اساس متغیرهای set شده درست می کند و نتیجه آن را به صورت یک شیء ReadOnlyResultSet برمی گرداند. در ادامه کد مربوط به کلاس ReadOnlyResultSet را می نویسیم:

class ReadOnlyResultSet {
    // This member variable will hold the native result set
  private $rs;

    // Assign the native result set to an instance variable
  function __construct($rs)
  {
    $this->rs = $rs;
  }

    // Receives an instance of the DataObject we're working on
  function getNext($dataobject)
  {
    $row    = mysql_fetch_array($this->rs);

    // Use reflection to fetch the DO's field names
    $class    = new ReflectionObject($dataobject);
    $properties = $class->getProperties();

    // Loop through the properties to set them from the current row
    for ($i = 0; $i < count($properties); $i++) {
      $prop_name        = $properties[$i]->getName();
      $dataobject->$prop_name = $row[$prop_name];
    }

    return $dataobject;
  }

  // Move the pointer back to the beginning of the result set
  function reset()
  {
    mysql_data_seek($this->rs, 0);
  }

  // Return the number of rows in the result set
  function rowCount()
  {
    return mysql_num_rows($this->rs);
  }
}

کلاس ReadOnlyResultSet یک پوشش(Wrapper) برای مجموعه نتایج می باشد که یک نمونه DataObject برمی گرداند.بهتر است برای همه پروژه هایی که می نویسیم از یک ReadOnlyResultSet عمومی استفاده کنیم و دیگر آن را تغییر ندهیم.

*نکته: php 5 با اشیاء به صورت ارجاع مستقیم(refrence) کار می کند(مثل JAVA) و نیازی به استفاده از & نیست.

کلاس ReadOnlyResultSet علاوه بر متد سازنده کلاس(Constructor)، سه متد دارد. متد ()reset اشاره گر نتایج را به اول آن برمی گرداند.متد ()rowCount تعداد سطرها را بر می گرداند.متد ()getNext پیچیده ترین متد این کلاس است که نیاز به کمی توضیح دارد:

از آنجا که این کلاس باید برای همه DataObject ها کار کند،باید راهی پیدا کنیم که به این متد بگوییم که با کدام DataObject کار کند. به همین علت باید DataObject مورد نظر را به عنوان پارامتر با این تابع بدهیم. خط اول این متد،سطر بعدی از مجموعه نتایج را واکشی می کند،سپس با استفاده از یک حلقه تکرار و استفاده از Reflection API خواص(properties) مربوط به اشیاء را پر می کنیم. به استفاده از ReflectionObject به جای ReflectionClass دقت کنید.ما در اینجا سعی داریم که مهندسی معکوس را برای یک شیء به کار ببریم نه یک کلاس!

حالا وقت آن رسیده که در عمل کلاس ReadOnlyResultSet را تست کنیم.مثال زیر تمام رکوردهایی را که FirstName آنها ali است جستجو می کند:

<?php
include_once('class-DO_User.php');
$user      = new DO_User();

// We'll use a literal string here,
// but this could come from anywhere,
// such as $_POST or $_GET
$user->firstName = 'ali';

// Call find(), which returns an instance of ReadOnlyResultSet
$rs        = $user->find();
?>

<html>
  <head>
    <title>Found Users</title>
  </head>
  <body>
    <p>Here the found users:</p>
    <table border="1">
      <tr>
        <td>User ID</td>
        <td>First Name</td>
        <td>Last Name</td>
        <td>Email</td>
      </tr>
<?php
// Loop through the result set
for ($i=0; $i < $rs-rowCount(); $i++) {

  // Pass on a new instance of DO_User, receiving it back filled in
  $userRow = $rs->getNext(new DO_User());
   // Display the current row in an HTML table
?>
      <tr>
        <td><?=$userRow->userId?></td>
        <td><?=$userRow->firstName?></td>
        <td><?=$userRow->lastName?></td>
        <td><?=$userRow->email?></td>
      </tr>
<?php
}
?>
    </table>
  </body>
</html>

دقت کنید که وقتی rs->getNext$ را فراخوانی می کنیم،یک نمونه جدید از DO_User می سازیم.از این جااست که کلاس ما می فهمد با کدام نوع از اشیاء داده ای سر و کار دارد.

منابع:

  • Source code: [ReadOnlyResultSet] [DO_User]
  • PHP 5: [Zend's PHP5 InfoCenter] [Reflection API]
  • Design Patterns: [Data Access Object] [Data Transfer Object]
  • http://www.onlamp.com/
    • 1383-08-19 ساعت 22:55:10
    كار با Data Object ها در php5-قسمت2

    همانطور که در قسمت اول بحث شد، لایه دسترسی به داده ها و لایه انتزاع پایگاه داده دو چیز متفاوتند.شما می توانید یکی از این دو لایه و یا حتی هر دو را برای بدست آوردن انعطاف (flexibility) بیشتر به کار ببرید.کار لایه انتزاع پایگاه داده، مخفی کردن RDBMS ای است که در پس زمینه در حال اجرا است.اگر شما در نوشتن دستورات SQL خود، تبحر داشته باشید،به راحتی می توانید از یک database server به دیگری کوچ کنید،بدون آنکه تغییری در فراخوانی های توابع یا SQL بدهید.Pear::DB این کار را به خوبی انجام می دهد.

    لایه دسترسی به داده ها(Data Access Layer) روشی است برای مشخص کردن جداول خود، تا بتوانید بدون استفاده از SQL در Business layer برنامه خود(جایی که کد تمام توابع برنامه قرار می گیرد) با داده های جداول، تعامل داشته باشید. Data Object ها ،گزینه خوبی برای لایه دسترسی به داده ها هستند زیرا از آنجا که رابطه مستقیم با جداول دارند،می توانید بدون تغییر در آنها،چندین بار از آنها در طول برنامه خود استفاده کنید.

    در قسمت ۱ ،کلاسی با نام DO_User ساختیم ویک متد ساده برای دریافت رکورد بر اساس فیلد userId نوشتیم.در این قسمت به توسعه کلاس DO_User می پردایم:

    افزودن یک رکورد جدید(INSERT)

    در اینجا یک متد جدید به نام insert را به کلاس خود اضافه می کنیم.این متد،یک رکورد جدید به جدول ما اضافه می کند:

    public function insert()
    {
          $sql = "INSERT INTO User SET
      firstName='"     . mysql_escape_string($this->firstName) . "',
      lastName='"      . mysql_escape_string($this->lastName)  . "',
      email='"       . mysql_escape_string($this->email)   . "'";

          mysql_query($sql);
          $this->userId = mysql_insert_id();
    }

    ممکن است سوال کنید که اطلاعات برای درج شدن از کجا گرفته می شوند،زیرا تابع insert هیچ پارامتری ندارد! جواب این است که قبل از فراخوانی این تابع باید متغیرهای عضو کلاس مقداردهی شده باشند به جز متغیر userId که بعد از افزودن رکورد جدید توسط تابع mysql_insert_id به آن مقدار می دهیم. مثال زیر نحوه به کارگیری این متد را نشان می دهد:

    <?php
    include_once('class-DO_User.php');

    $user      = new DO_User();
    $user->firstName = 'Jane';
    $user->lastName  = 'Doe';
    $user->email   = 'jane.doe@example.com';

    $user->insert();
    ?>
    <html>
      <head>
        <title>INSERT Example</title>
      </head>
      <body>
        <p>The user was added to the User table.
        The userId is: <?=$user->userId?></p>
      </body>
    </html>

    در مثال بالا ابتدا یک شیء از نوع DataObject را نمونه سازی می کنیم.سپس متغیرهای لازم را مقداردهی کرده و تابع insert را فراخوانی می کنیم. ما می توانیم با به کارگیری توام دو متد get و insert یک رکورد را کپی کنیم. می توانیم ابتدا یک تغییر جزئی در مقادیر بدهیم(مثلا آدرس ایمیل را عوض کنیم) و سپس رکورد را کپی کنیم:

    <?php
    include_once('class-DO_User.php'    );
    $user = new DO_User    ();

    // Again just using a literal int for now.
    $user->get(5    );

    // Change the email address in the DataObject
    // NOTE: This doesn't affect the DB at all,
    // just the value in the DataObject
    $user->email = 'jdoe@example.com'    ;

    // Next, we call insert() to create a NEW record in the User table
    $user->insert    ();

    ?>
    <html>
      <head>
        <title>Copy Row INSERT Example</title>
      </head>
      <body>
        <p>The user was copied to the User table.
        The userId is: <?=$user->userId?></p>
      </body>
    </html>

    مثال بالا نشان می دهد که با به کارگیری DataObject چقدر کار تعامل با پایگاه داده،آسان می شود.

    بروز رسانی رکوردها(UPDATE)

    بازیابی یک رکورد،تغییر بعضی مقادیر و افزودن آن به صورت یک رکورد جدید کار ارزشمندی است اما در اکثر مواقع، شما نیاز به UPDATE کردن یک رکورد دارید.در این جا متدی به نام update به کلاس خود اضافه می کنیم:

    public function update()
    {
          $sql =     "UPDATE User SET
      firstName='"     . mysql_escape_string($this->firstName) .     "',
      lastName='"      . mysql_escape_string($this->lastName)  .     "',
      email='"       . mysql_escape_string($this->email)   .     "'
      WHERE
      userId="       . mysql_escape_string($this->userId    );

          mysql_query($sql    );
    }

    این متد بسیار شبیه متد insert است.به مثال زیر توجه کنید:

    <?php
    include_once('class-DO_User.php');
    $user = new DO_User();

    // Again just using a literal int to get a row.
    $user->get(5);

    // Change the email address
    $user->email = 'janedoe@example.com';

    // Perform the update
    $user->update();

    ?>
    <html>
      <head>
        <title>UPDATE Example</title>
      </head>
      <body>
        <p>The user updated. The userId is: <?=$user->userId?></p>
      </body>
    </html>

    حذف سطرها(DELETE)

    در اینجا تابعی با نام delete به کلاس خود اضافه می کنیم:

    public function delete()
    {
          $sql =     "DELETE FROM User
      WHERE
      userId="     . mysql_escape_string($this->userId    );

          mysql_query($sql    );
    }

    کار کردن با delete مشابه update می باشد.این متد هم از فیلد کلید اولی یعنی userID استفاده می کند.

    ارزش DataObject ها وقتی مشخص می شود که با آنها کار کنید! در قسمت بعدی به متدهای پیچیده تر برای بسط کلاس خود می پردازیم.
    1383-08-16 ساعت 13:42:16
    كار با Data Object ها در php5-قسمت1

    امروزه کار با database یکی از مسائل روزمره برنامه نویسان وب به شمار می آید،از یک پردازش ساده فرم گرفته تا برنامه های کاربردی در مقیاس بزرگ(large-scale). تقریبا در اکثر موارد از database استفاده می کنیم. بعد از کارکردن روی چند پروژه، زمان زیادی طول نخواهد کشید که متوجه می شوید،چهار عمل اصلی ساده در کار با database به طور مرتب تکرار می شوند.این اعمال عبارتند از:

    • پیداکردن و انتخاب رکوردها(SELECT)
    • به روزرسانی رکوردهای جاری(UPDATE)
    • افزودن رکوردهای جدید(INSERT)
    • حذف رکوردها(DELETE)

    شما در جاهای مختلف برنامه مجبورید که یک Query را بازنویسی کرده و یا آن را از قسمت های قبلی برنامه Copy-Paste کرده و سپس تغییرات لازم را روی آن اعمال کنید.عده ای از برنامه نویسان ترجیح می دهند که از یک لایه انتزاعی(Abstraction Layer) مثل PEAR::DB و یا DBX استفاده کنند.استفاده از یک لایه انتزاعی چیز خوبی است اما هدف اصلی در آن ،این است که RDMBS را محو کند یا به اصطلاح Transparent سازد و برنامه شما مستقل از RDMBS شود.یک لایه انتزاعی، راهی برای مجردسازی(abstraction) ساختارdatabase شما ازائه نمی دهد. اینجاست که یک لایه دسترسی مجزا می تواند مفید واقع شود.شما می توانید لایه دسترسی داده دا از راههای مختلف پیاده سازی کنید، اما در این مقاله، توجه ما معطوف به Data Object ها می باشد. مفهوم Data Object برگرفته از الگوهای طراحی به خوبی مستند شده( very well-documented design p a tterns) به نام Data Access Object و الگوهای شیء انتقال(Transfer Object) است.این الگوها می توانند بسیار پیچیده باشند،اما با کمی تفکر می توانیم به راحتی از ایده ها و اهداف پایه ای آنها در php5 استفاده کنیم.

    *یک شیء داده(Data Object) چیست؟

    همانطور که ذکر شد، ایده Data Object برگرفته از یک الگوی طراحی است.اگر نگاهی به الگوهای طراحی کنید، متوجه می شوید که تقریبا اغلب آنها بر مبنای شیءگرایی (object orienta tion)هستند. در این جا می خواهیم از مدل شی ای جدید php5 استفاده گسترده ای داشته باشیم.همچنین برای مثالهای خود از MySQL استفاده می کنیم.

    در اصل،هرData Object یک کلاس کدنویسی شده است که یک table را در database شما به طور مستقیم مشخص می کند.برای هر table یک کلاس خاص می نویسیم.کلاس،شامل متغیرهای عضو(مطابق با فیلدهای جدول) و مجموعه ای از توابع یا متدها(حداقل برای انجام ۴ عمل اصلی ذکرشده)می باشد.فرض کنید یک جدول ساده برای نگهداری مشخصات کاربر داریم:

    TABLE: User
    userId INT
    firstName VARCHAR(30)
    lastName VARCHAR(40)
    email VARCHAR(100)

    برای این جدول کلاسی تعریف می کنیم که شامل متغیرهای عضو مطابق با فیلدهای جدول باشد.بهتر است که برای Data Object خود یک پیشوند بگذاریم(مثل DO_)تا آن را با کلاسهای هم نام دیگر اشتباه نگیریم.(این یک الگوی رایج در php برای شبیه سازی namespae ها می باشد)

    class DO_User {
      public     $userId    ;
      public     $firstName    ;
      public     $lastName    ;
      public     $email    ;
    }

    مثال بالا یک سطر ساده از جدول را نشان می دهد.اگر یک شیء Do_user را نمونه سازی(instantiate) کنیم،می توانیم یک سطر از داده ها را نگهداری کنیم.حالا چطور اطلاعات را از database واکشی کرده و در این شیء ذخیره کنیم؟ برای این کار یک متد جدید به نام ()get به کلاس خود اضافه می کنیم تا از database برای یک کاربر خاص Query بگیریم. ما از userID(کلید اولیه) هر کاربر به عنوان پارامتر استفاده می کنیم:

     class DO_User {
      public     $userId    ;
      public     $firstName    ;
      public     $lastName    ;
      public     $email    ;

          // This function will perform a select on the table looking for
        // a specific userId.
          public function get($userId    )
      {
            $sql =     'SELECT * FROM User WHERE userId='
                     . mysql_escape_string($userId    );
            $rs  = mysql_query($sql    );
            $row = mysql_fetch_array($rs    );

            $this->userId  = $row['userId'    ];
            $this->firstName = $row['firstName'    ];
            $this->lastName  = $row['lastName'    ];
            $this->email   = $row['email'    ]
      }
    }

    حالا با استفاده از این Data Object می توانیم با database خود تعامل داشته باشیم.هیچ نیازی با استفاده از SQL نیست.مثال زیر اطلاعات مربوط به یک کاربر را دریافت و در Web Browser نمایش می دهد:

    <?php
    include_once('class-DO_User.php');
    $user = new DO_User();

    // We'll use a literal integer here,
    // but this could come from anywhere,
    // such as $_POST or $_GET
    $user->get(5);

    ?>
    <html>
      <head>
        <title>User Info</title>
      </head>
      <body>
        <p>Here is the user info:</p>
        <table border="1">
          <tr>
            <td>User ID</td>
            <td>    <?=$user->userId?></td>
          </tr>
          <tr>
            <td>First Name</td>
            <td>    <?=$user->firstName?></td>
          </tr>
          <tr>
            <td>Last Name</td>
            <td>    <?=$user->lastName?></td>
          </tr>
          <tr>
            <td>Email</td>
            <td>    <?=$user->email?></td>
          </tr>
        </table>
      </body>
    </html>

    همانطور که مشاهده می کنید استفاده از یک Data Object بسیار ساده است. تابع ()get ای که اضافه کردیم یک Query ساده را انجام می دهد و یک کلید اولیه مشخص(userID ) جستجو می کند. توجه کنید که چون از فیلد با کلید اولیه استفاده کردیم، تنها یک رکورد از داده ها را دریافت می کنیم و مقادیر آنها را در متغیرهای عضو کلاس قرار می دهیم.در قسمت های بعدی در مورد دریافت چند سطر از رکوردها نیز بحث خواهیم کرد.
    1383-08-11 ساعت 23:24:26
    آشنايي با ext/mysqli در PHP5-قسمت اول

    چرا از ext/mysqli استفاده کنیم؟

    يكي از ويژگي هاي جالبي كه در 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 كنيد و از اين به بعد با اين ماژول كار كنيد:

      1. سرعت بيشتر
      2. امنيت بيشتر

    حرف i در انتهاي ext/mysqli به معناي ,improved, interface, ingenious, incompatible incomplete مي باشد!
    1383-07-05 ساعت 10:25:26
    آشنايي با ext/mysqli در PHP5-قسمت دوم

    نحوه کار با 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
", 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:
");

/* Fetch the results of the query */
while( $row = mysqli_fetch_assoc($result) ){
printf("%s (%s)
", $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
", 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:
");

/* Fetch the results of the query */
while( $row = $result->fetch_assoc() ){
printf("%s (%s)
", $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
", 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.
", $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.
", $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
", 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
", $col1, $col2);
}

/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();

?>
    1383-07-05 ساعت 09:19:26
    ﻿
    « | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
    لينك هاي روزانه

    BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
    مطالب اخير
    ﻿
    Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
    آرشيو ماهيانه
    ﻿شهريور1384(1)
    مرداد1384(2)
    تير1384(2)
    خرداد1384(2)
    ارديبهشت1384(4)
    اسفند1383(2)
    بهمن1383(1)
    آذر1383(2)
    آبان1383(4)
    مهر1383(8)
    تير1383(4)
    خرداد1383(1)
    ارديبهشت1383(9)
    فروردين1383(5)
    آرشيو موضوعي
    ﻿اينترنت [2]
    كدهاي كاربردي [5]
    PHP [7]
    MySQL [5]
    برنامه هاي كمكي [7]
    برنامه هاي بازمتن [11]
    عمومي [6]
    روش هاي طراحي [4]
    لينك هاي ثابت
    [ phpmystery ]
    FarsTec
    PersianLinux
    Mohsen's Weblog
    MajidOnline
    techno-graph
    IranASP.NET
    P30World
    Virtualife
    w3schoolsir
    NetKadeh
    techopedia
    Meganit
    ITIran
    Fantazio
    Gonahkar
    IProDev
    IRANETSOL
    IFlashDes
    Oxygenws
    jooti's Blog
    Behrooznp
    WinBeta
    RADMAN
    پژواک
    AlvanWeb
    .:: OutLivE ::.
    IranPHP
    IranAMP
    Sheida
    Ali Masoudi
    SoltoonOnline
    Ashoob
    چشمان باز
    ParsMedia
    Fexon
    جستجو
    ﻿ search

    سايت هاي php
    PHP.Net
    PHP-Editors
    PHPKitchen
    PHPBuilder
    PHPArchitect
    PHPMagazine
    PHPDevNetwork
    DevShed
    SitePoint
    DotGeek
    Planet-PHP
    PHPResorceIndex
    تماس با ما
    khalili.a [at] gmail [dot] com
    آمار بازديدها

    26 | امروز:
89 | ديروز:
77150 | كل:
    مراجعه كنندگان
    free-composable-ringtones-for-alcatel.nifigase.info
    free-composable-ringtones-for-alcatel.nifigase.info
    free-composable-ringtones-for-alcatel.nifigase.info
    who-sells-samsung-cell-phones.nifigase.info
    who-sells-samsung-cell-phones.nifigase.info

    Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 ساعت 06:54:21
آشنايي با Prado Framework

PRADO یک چارچوب(framework) برای ساخت برنامه های کاربردی تحت وب در PHP 5 می باشد. نحوه کار Prado برمبنای رویدادها(event-driven) و مولفه های آماده(component-based) می باشد.ساخت یک Web Appllication توسط Prado شامل مراحل زیر است:

  • نمونه سازی از مولفه های از قبل ساخته شده(instantiating prebuilt component types)
  • پیکربندی آنها توسط تنظیم ویژگیهای آنها(setting their properties)
  • پاسخ به رویدادهای مربوط به آنها با نوشتن توابع اداره کننده رویداد(handler functions)
  • قرار دادن مولفه ها در صفحات مورد نظر

روند طراحی در PRADO بسیار شبیه ابزارهای توسعه سریع(RAD toolkits) مثل Delphi و Visual Basic می باشد. برای درک نحوه کار Prado Framework ،فرض کنید که می خواهیم یک صفحه ورود کاربران(login page) بسازیم.مراحل زیر را دنبال می کنیم:

  1. از دو مولفه TTextBox و یک مولفه TButton برای دریافت ورودی نام کاربر،رمز عبور و دکمه submit استفاده می کنیم.
  2. خصوصیت TextMode مربوط به مولفه رمز عبور را با Password تنظیم می کنیم.
  3. یک تابع login برای رویداد OnClick مولفه دکمه می نویسیم.
  4. این مولفه های آماده را در یک صفحه با قالب مشخص قرار می دهیم.

شیوه کار Prado ، تفاوت های بسیاری با شیوه برنامه نویسی سنتی در php دارد. در شیوه معمول،برنامه سازان، ابتدا دستورات لازم برای ساخت فرم وب را با HTML کدنویسی می کنند و سپس با استفاده از روش ارسال به صورت POST یا GET اطلاعات مربوطه را پردازش می کنند. اما شیوه کاری Prado بر اساس مدل برنامه سازی در ASP.NET می باشد و بر مبنای استفاده از مولفه های آماده برای جلوگیری از تکرار کدنویسی است. مزایای استفاده از Prado عبارتند از:

  • قابلیت استفاده مجدد از مولفه های از پیش نوشته شده(reusability)
  • سادگی کار ساخت برنامه(ease of use)
  • بازدهی بالا(performance)
  • استفاده از ویژگی های شی گرایی در PHP5 مثل مدیریت خطاها(error handling )
  • مناسب برای پروژه های تیمی(team integration)

Prado بر روی سیستم های عامل Windows XPو Redhat Linux با موفقیت آزمایش شده است. Prado 1.5 با حجم ۱.۰۳ مگابایت از اینجا قابل دریافت است. برای آشنایی با نحوه کار Prado به اینجا مراجعه کنید.این چارچوب برای شرکت در Zend PHP5 Contest نوشته شده است. به هر حال هرکس سلیقه ای خاص خود دارد ومختار است که در چارچوب دلخواه خود برنامه بنویسد!
1383-07-27 ساعت 21:24:24
با FuseBox ، متفاوت برنامه بنويسيد!

FuseBox یک چارچوب(framework) استاندارد برای طراحی برنامه های کاربردی تحت وب می باشد.

یکی از مسائل مهم در طراحی یک برنامه کاربردی مبتنی بر وب ، آینده نگری می باشد. برنامه ای که می نویسید باید قابلیت ارتقا و افزودن امکانات جدید با حداقل تغییر در سورس کد برنامه را داشته باشد. برای آسودگی در آینده باید از همین امروز شروع کرد! FuseBox یک روش(Methodology) برای ساخت برنامه های تحت وب می باشد. این روش همانطور که از نامش پیداست، بر مبنای جعبه فیوز شبیه سازی شده است! در یک جعبه فیوز، اگر یک فیوز بسوزد و یا از کار بیفتد، خللی در کاربقیه فیوزها ایجاد نمی کند. هر فیوز کاری تعریف شده و مختص خود دارد و فیوز A برای انجام وظیفه خود نیازی به کمک فیوزهای B ,C ,D ندارد.

در حال حاضر بیش از 23688 نفر در سراسر دنیا بر مبنای روش FuseBox برنامه سازی می کنند. نسخه های مختلفی از FuseBox برای برنامه نویسی با PHP ,ASP,J2EE , ColdFusion وجود دارد.

نحوه كار با FuseBox : برای ساخت یک برنامه کاربردی ،طراح ، برنامه خود را به مجموعه ای از عملیات (Fuseactions ) تقسیم می کند سپس صفحات و اسکریپت ها(Fuses) را طراحی کرده و آنها را به همراه هم ،در یک دایرکتوری(Circuit) قرار می دهد. Fuse ها انواع مختلفی دارند:

  • Display Fuses : این فیوزها که با پیشوند dsp آغاز می شوند برای نمایش اطلاعات به کاربر استفاده می شوند.
  • Select Query Fuses : با پیشوند qry شروع می شوند و دستورات پرس و جوی انتخاب را شامل می شوند
  • Action Query Fuses : با پیشوند act آغاز می شوند و دستورات پرس و جوی UPDATE ، INSERT و DELETE را شامل می شوند.
  • Location Fuses : این فیوزها با پیشوند url آغاز می شوند و برای فرستادن برنامه به یک آدرس جدید، مورد استفاده قرار می گیرند.

این مطلب فقط برای آشنایی با روشFuseBox بود. برای دریافت خود برنامه و مقالات مرتبط با آن سری به وب سایت رسمی FuseBox بزنید:

http://fusebox.org
1383-04-07 ساعت 22:45:25
PDML: زبانی برای ساخت اسناد PDF

PDML مخفف Portable Document Markup Language می باشد و یک زبان غیر رسمی(Informal) نشانه گذاری می باشد که ۱۰۰٪ توسط PHP نوشته شده است.این زبان به افراد آشنا به HTML اجازه می دهد که به سادگی اسناد پیچیده PDF درست کنند. همچنین افراد آشنا با PHP می توانند از آن به عنوان روشی برای تعریف قالب هایی(templates) برای اسناد PDF پویا(dynamic PDF documents) استفاده کنند.این زبان جالب، تحت مجوز GPL عرضه شده است و بر پایه یک کلاس PHP معروف به نام FPDF بنا شده است.FPDF کلاسی در PHP می باشد که به شما این امکان را می دهد که با به کارگیری مستقیم PHP، اسنادPDF بسازید.(بدین معنی که لازم نیست از کتابخانه PDFlib استفاده کنید.). مجوز PDFlib بدین گونه است که اگر بخواهید از PDFlib ،استفاده تجاری کنید،باید پول بپردازید! حرف F در ابتدای FPDF معنی FREE بودن آن را می دهد.

PDML هنوز در ابتدای راه است و نسخه نهایی آن عرضه نشده است. نسخه آزمایشی 0.9 آن را می توانید از اینجا دریافت کنید. در این نسخه ، سعی شده است که بیشتر امکانات کلاس FPDF فراهم شود. برای مشاهده چند نمونه برنامه ساده و اولیه سری به اینجا بزنید.
1383-02-19 ساعت 22:32:25
استفاده از کتابخانه کلاس ADOdb-بخش دوم

کار با توابع کتابخانه ای ADOdb

برای دریافت نتایج حاصل از عمل SELECT بر روی پایگاه داده،چند روش مختلف وجود دارد،یکی از این روش ها به صورت زیر است:

$sql = "SELECT surname, age FROM employees";
$rs = &$db->Execute($sql);
if (!$rs) {
print $db->ErrorMsg();
}
else {
while (!$rs->EOF) {
print $rs->fields[0].' '.$rs->fields[1].'
';
// fields[0] is surname, fields[1] is age
$rs->MoveNext(); // Moves to the next row
} // end while
} // end else

در مثال بالا rs->fields$ آرایه ای است که شامل نتایج query می باشد.شاخص(index) آرایه به صورت پیش فرض،عددی(numeric) است،اما اگر می خواهید از یک آرایه associative استفاده کنید(آرایه ای که می توان در آن از شاخص های رشته ای استفاده کردassociative نامیده می شود) باید قبل از اجرای query این حالت را به صورت زیر مشخص کنید:

$sql = "SELECT surname, age FROM employees";
$db->SetFetchMode(ADODB_FETCH_ASSOC);
$rs = &$db->Execute($sql);
if (!$rs) {
print $db->ErrorMsg();
}
else {
while (!$rs->EOF) {
print $rs->fields['surname']." ".$rs->fields['age']."
";
$rs->MoveNext(); // Moves to the next row
} // end while
} // end else

راه متداولی که برای دریافت نتایج یک query وجود دارد،دریافت هر سطر به صورت یک object می باشد.ADOdb تابعی به نام FetchNextObject دارد که به صورت خودکار نتایج سطر بعدی را می دهد:

$sql = "SELECT surname, age FROM employees";
$db->SetFetchMode(ADODB_FETCH_ASSOC);
$rs = &$db->Execute($sql);
if (!$rs) {
print $db->ErrorMsg();
}

// loop through results
while ($row = $rs->FetchNextObject()) {
// The field names need to be uppercase
print $row->SURNAME." ".$row->AGE."
";
}

عمل درج(INSERT) بسیار سریع و ساده است:

$sql = "INSERT INTO employees (surname, age) values ('Clegg','43')";
if (!($db->Execute($sql))) {
print 'Error inserting: '.$db->ErrorMsg().'
';
}

مزیت اصلی ADOdb در اینجا این است که اجازه می دهد که با استفاده از یکsyntax یکسان record ها را در پایگاههای داده مختلف درج کنید.(در حالت عادی این کار امکان پذیر نیست!) دو حالت استثنایی در اینجا وجود دارد که باید به آنها توجه کنید:

ا)تمام کاراکترهای quotes باید escape شوند(یک backslash قبل از آنها قرار گیرد)در غیر این صورت با خطای syntax مواجه خواهید شد.بعضی از پایگاههای داده برای درج رشته ها از (') و بعضی دیگر از('') استفاده می کنند،به خاطر این مساله به جای استفاده از تابع ()addslashes در php بهتر است که از تابع کتابخانه ای()qstr در ADOdb استفاده کنید.این تابع یک رشته را دریافت می کند و آن را بر اساس پایگاه داده مناسب فرمت بندی می کند.

۲) پایگاههای داده مختلف از فرمت های متفاوتی برای نوع داده date استفاده می کنند.ADOdb تابعی به نام ()DBDate دارد که یک date را به صورت Unix timestamp و یاISO(Y-m-d) دریافت می کند وآن را تبدیل به فرمت مناسب برای پایگاه داده مورد استفاده شما می کند.در زیر مثالی از به کارگیری این دوتابع آورده شده است:

$employee_surname = $db->qstr("d'Angelo");
$arrival_time = $db->DBDate(time());
// The above two functions also add the enclosing //quotes, so, $arrival_time, not '$arrival_time'
$sql = "INSERT INTO employee_arrival (arrival_time,surname) values ($arrival_time,$employee_surname)";
if (!($db->Execute($sql))) {
print 'Error inserting: '.$db->ErrorMsg().'
';
}

مطالب گفته شده، مطالبی مقدماتی برای آشنایی با روش کار ADOdb بود. از اینجا به بعد همه چیز به شما بستگی دارد! پیشنهاد می کنم که سری به وب سایت PHPEveryWhere بزنید و documentation های کامل این برنامه را مطالعه کنید.(تجربه سالم هیچ ضرری ندارد!)
1383-02-06 ساعت 22:36:25
1 2 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

28 | امروز:
89 | ديروز:
77152 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
exponent CMS

"مدیریت محتوا باید ساده باشد. " این شعار طراحان سیستم مدیریت محتوای exponent می باشد.این CMS توسط یک شرکت تجاری به نام S-Media و با استفاده از PHP و MySQL تحت مجوز GPLطراحی شده است.این CMS هوز در مرحله تکامل قرار دارد و آخرین نسخه عرضه شده آن 0.95 می باشد که از اینجا قابل دریافت است. اولین و برجسته ترین مشخصه exponent واسط گرافیکی بخش مدیریت آن است که آن را از دیگر برنامه های رایج مثل PHP-Nuke، XOOPS و ... متمایز می سازد.در exponent مدیریت و به روزرسانی محتوا به صورت WYSIWYG است ،یعنی شما به همان صورتی که محتوا را مشاهده می کنید می توانید آن را ویرایش کنید. از دیگر مشخصه های exponent نصب آسان آن است.این CMS از Smarty template engine برای قالب بندی صفحات استفاده می کند که تغییر قالب و ظاهر آن را بسیار ساده کرده است.( قالب های پیش فرض سیستم بر مبنای HTML 4 و table layout است.) از لحاظ کد برنامه، این سیستم به خوبی کد نویسی شده است و کدهای پروژه های خارجی مثل HTMLArea و Smarty کاملا مجزا از کد اصلی برنامه است و می توان کد آن را به راحتی تغییر داد. همچنین کدهای برنامه به خوبی مستند سازی شده است و یافتن و تغییر ماژول ها و زیر سیستم های آن(مثل SMTP functionality, session handling, user account management) ساده است. اشکالات: بااینکه این سیستم واسط گرافیکی خوبی دارد ولی در ابتدا ممکن است کمی پیچیده و گنگ به نظر برسد. بعضی از ماژول های سیستم مثل Calendar هنوز توانایی عملیاتی بالایی ندارند و ناقص به نظر می رسند.

1384-02-25 ساعت 22:17:43
Coppermine :معدني براي تصاوير

‍‍Coppermine يك برنامه قدرتمند براي مديريت تصاوير شما بر روي وب است.اين آلبوم تصاوير قدرتمند توسط PHP و با به کارگیری کتابخانه های GD و ImageMagick و همچنین پایگاه داده قدرتمند MySQL نوشته شده است .این برنامه بازمتن، ویژگی ها و امکانات زیادی دارد که آن را از سایر برنامه های مشابه متمایز می سازد.بعضی ها Coppermine را از لحاظ ویژگی ها و پیشرفتی که داشته ،مشابه PHPbb اما در رده برنامه های آلبوم تصاویر می دانند. قالب ظاهری این برنامه(Theme) به راحتی قابل تغییر است و Theme های آماده زیادی برای این برنامه به صورت رایگان وجود دارد. چند نمونه از امکانات این برنامه عبارتند از: داشتن یک سیستم عضویت قدرتمند- امکان نظردهی و رتبه دادن به تصاویر-امکانات طبقه بندی و گروه بندی تصاویر و کاربران- پشتیبانی از زبانهای مختلف-نصب ساده

یکی از برجسته ترین امکانات Coppermine پیوسته شدن(Integration) به برنامه های مدیریت محتوا و انجمن است.برای مثال این برنامه را می توان به همراه phpBB, YaBB SE, SMF, Invisionboard, vbulletin و همچنین CPG-Nuke به کار برد. نسخه نمایشی این برنامه در اینجا قابل مشاهده است. مستندات برنامه را هم می توانید در اینجا ببینید. جدیدترین نسخه برنامه Coppermine Photo Gallery از اینجا قابل دریافت است.
1383-09-13 ساعت 12:36:20
چگونه CMS مورد نظر خود را انتخاب كنيم؟

با توجه به رشد روزافزون برنامه هاي مديريت محتوا(CMS) انتخاب بهترین CMS بر اساس نیازهای کاربران کمی مشکل شده است.مطلب زیر، برگرفته از سایت OpenSourceCMS است و ۵ مرحله را برای انتخاب CMS مورد نظر بیان می کند:

۱. قبل از هر چیز باید مشخص کنید که قصد ایجاد چه نوع سایتی را دارید؟ آیا سایت شما Portal است و براساس روابط متقابل کاربر و مدیران سایت است؟ آیا سایت شما تنها یک Weblog است و شامل نوشته های روزمره می شود؟ آیا یک سایت آماری با هدف اطلاع رسانی می خواهید؟ آیا سایت شما یک محیط برای انجام یک پروژه تیمی است؟

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

۲. گام بعدی این است که مشخص کنید چه ویژگی ها و امکاناتی مورد نیاز شما است؟ آیا قصد نمایش اطلاعات به صورت پویا(Dynamic) را دارید ویا ایستا(Static)؟ آیا نیاز به یک تقویم وقایع و رویدادها دارید؟آیا نیاز به یک بخش Upload/Download دارید؟ آیا یک آلبوم تصاویر هم می خواهید؟ آیا به یک سیستم نظرسنجی و برآورد نیاز دارید؟ آیا نیاز به یک تابع ترجمه دارید؟

موارد بالا Modules یا Plug-ins نامیده می شوند و عموما به صورت امکانات افزودنی(Add-ons) به هسته سیستم هستند.(بعضی مواقع این امکانات در سیستم مبنا فراهم شده اند) بیشتر سیستم های عرضه شده از Module های متعددی پشتیبانی می کنند اما ممکن است این امکانات جاری در نسخه های بعدی سیستم پشتیبانی نشوند و سازگار با تغییرات نباشند(Incompatible)! تنها پشتیبانی از Module مورد نظر شما کافی نیست بلکه باید توجه کنید که چطور امکانات مورد نظر شما کار می کنند؟آیا خواسته های شما را برآورده می کنند؟ گروههای مختلف یک ویژگی را از راههای مختلف پیاده سازی می کنند! نکته کلیدی در اینجا آزمایش است زیرا بهترین راه حل برای آگاهی از قابلیت های یک سیستم است.

۳.حالا که سیستم مبنا و Module های مورد نیاز خود را مشخص کردید،باید به نحوه نمایش سایت خود دقت کنید(Presentation). در حال حاضر بیشتر CMS ها امکان استفاده از CSS و Template را فراهم می آورند که این امکان را به شما می دهند که به سرعت ظاهر سایت خود را تغییر دهید.(Site Skin) محتویات مشابه با ظواهر مختلف می توانند یک منظره کاملا دراماتیک را ترسیم کنند! این منظره می تواند خیلی جذاب باشد ویا برعکس. همه چیز به تصور شما بستگی دارد! خبر خوب این است که اگر شما فردی خلاق یا هنرمند نیستید،نباید غصه بخورید زیرا منابع متعددی در اطراف شما وجود دارد که می تواند به شما کمک کنند! این منابع به صورت Template هایی هستند که توسط افرادی خلاق طراحی شده اند و در دسترس عموم قرار داده شده اند. شما می توانید این قالب ها را Download کرده به سایت خود اضافه کنید و با این کار رنگ و بوی تازه ای به سایت خود بدهید!

۴. حالا که لایه نمایش سایت خود را تعریف کردید باید روی محتویات سایت خود تمرکز کنید.محتوا خیلی خیلی مهم است! بدون محتوا، هر چقدر هم که سایت زیبایی داشته باشید، فایده ای ندارد! سایت شما بی فایده است، هیچ کاربری حاضر نمی شود برای بار دوم به سایت شما سر بزند و کم کم سایت شما محو می شود! اطلاعات می تواند به فرم های مختلفی ارائه شود. ممکن است مطالب کاربردی باشد یا مطالب طنز یا مطالب علمی و یا حتی چگونگی ساخت یک تله موش بهتر!

محتوای خوب باعث جذب مخاطب می شود(شبیه یک شکلات که به بچه های کوچک می دهید!) اگر یک سایت خبری دارید، داشتن امکان تبادل اطلاعات با منابع دیگر از طریق RSS مهم است.بسته به نوع سایت شما امکانات محتوایی مختلفی مطرح می شود.

۵. حالا که تمام مراحل بالا را انجام داده اید، فقط یک قدم می ماند و آن نگهداری(maintenance) و تجدید(renewal) سایت است. با گذشت زمان چه اتفاقی بر روی محتوای قدیمی می افتد؟ آیا آنها آرشیو می شوند و یا در دسترس می مانند؟ آیا این امکان وجود دارد که در صورت خرابی Server تمام سیستم بر روی یک محیط مجزا بازسازی مجدد(Restore) شوند؟ آیا امکان گرفتن نسخه پشتیبان (Backup) در سیستم وجو دارد یا این کار باید به صورت دستی صورت بگیرد؟

هر CMS ای با روش خود این مساله را حل می کند.برای اطلاع از این امکانات در CMS های مختلف ،بهتر است که با مدیران سایت های دیگر که تجربه بیشتری دارند مشورت کنید . باید از امروز به فکر آینده باشید!
1383-08-01 ساعت 23:57:42
چگونه 1000 مگابايت GMail را پر كنيم؟!

اگه به شما یک گیگابایت فضای رایگان روی اینترنت داده بشه،چیکار می کنید؟ قطعا، اولین چیزی که به ذهنتون میرسه اینه که چطوری پرش کنید و نهایت استفاده رو از اون ببرید!

با اومدن پدیده ای به نام GMail ، برنامه نویسان وب به سرعت دست به کار شدند و به فکر استفاده از این فضای رایگان افتادند.برای نمونه می شه از GMail FS برای لینوکس و GMail Drive shell extension برای ویندوز نام برد. در این قسمت قصد دارم برنامه ای رو به اسم Goollery معرفی کنم که با PHP نوشته شده و باعث میشه که به نیمه خالی لیوان GMail توجه بیشتری کنید!

Goollery is a GMail based photo gallery. You can upload pictures from a website. The pictures will automatically be stored in your gmail accout.

Goolley یک برنامه آلبوم تصاویر است که از فضای رایگان GMail برای ذخیره تصاویر خود استفاده می کند.برای استفاده از این برنامه به امکانات زیر نیاز دارید:

  • GMail account
  • PHP
  • *libmailer (gmail-lite project)
  • ImageMagick

*GMailer یا libgmailer یک کلاس PHP می باشد که به شما این امکان را می دهد تا از طریق اسکریپت های PHP به GMail دسترسی داشته باشید.برای کسب اطلاعات بیشتر در مورد GMailer اینجا را کلیک کنید.

نسخه آزمایشی Goolley در اینجا قابل مشاهده است. یکی از اشکالات این برنامه سرعت بسیار پایین آن است که طبیعی است! این برنامه هنوز در مرحله آزمایش است و به گفته طراحان آن:This is just a proof on concept!
این برنامه از اینجا قابل دریافت است.
1383-07-19 ساعت 21:57:24
كاملترين مجموعه نصب PHP روي Windows!?

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

WinLAMP: WinLAMP Is Not LAMP یکی از کاملترین بسته های ارائه شده برای نصب PHP می باشد. این بسته نرم افزاری شامل ابزارهای اضافی مختلفی برای کار با MySQL می باشد.از جمله این ابزارها می توان به DBManager ، MySQL -Front و SQLyog اشاره کرد.

(WinLAMP? Windows+Apache+MySQL+PHP is not Linux+Apache+MySQL+PHP: WinLAMP)

برنامه نصب کننده winlamp حجمی حدود ۶۰ مگابایت دارد ولی شامل بیش از ۱۴۴ مگابایت برنامه های به درد بخور است.این برنامه از اینجا قابل دریافت است.

این برنامه شامل جدیدترین راهنمای (manual) استفاده PHP-MySQL-Apache نیز می باشد که مورد نیاز هر برنامه ساز PHP می باشد.اگر امکان دریافت این برنامه را دارید حتما امتحانش کنید و آن را با برنامه های دیگر مقایسه کنید!
1383-07-12 ساعت 07:50:30
1 2 3 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

29 | امروز:
89 | ديروز:
77153 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
Progress Always Comes Late

---Collection of old articles---

Living here day by day, you think it’s the center of the world.You believe nothing will ever change.

Then you leave: a year, two years.When you come back, everything’s changed. The thread’s broken.What you came to find isn’t there. What was yours is gone.
You have to go away for a long time… many years…
before you can come back and find your people. The land where you were born. But now, no.It’s not possible.

1384-06-08 ساعت 12:42:06
آشنایی با AJAX در نمایشگاه الکامپ!

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

+ احسان مظلومی فعال و سایر دوستان،امسال هم با غرفه دنیای وبلاگ در نمایشگاه الکامپ ۲۰۰۵ پذیرای دوستان وبلاگ نویس هستند.اسپانسر این غرفه هم روزنامه آسیا است.قراره توي اين چند روز اونجا هم سمينارهاي مختلف برگزار بشه ، هم اعضاي سايت هاي مختلف همايش داشته باشن. گفتن که اگه كسي ميخواد سميناري چيزي بده ، امكاناتش هست ( پروجكشن و صندلي و كامپيوتر و احتمالا مخاطب).قرار شده که من هم یک ارائه در مورد AJAX داشته باشم! البته زمان دقیقش هنوز معلوم نیست ولی به احتمال زیاد روز جمعه یا یکشنبه ساعت ۱۴. اگر فرصت کردید و راهتون به اونطرفا افتاد حتما سری به غرفه دنیای وبلاگ بزنید!

+ یکشنبه ۵ تیرماه روز تولدمه.( جا داره که به خودم تبریک بگم!) یک سال هم پیر تر شدیم،یکی جلوی زمانو بگیره،چقدر سریع میگذره! جمعه این هفته یعنی ۳ تیرماه دور دوم انتخابات ریاست جمهوریه که انقدر حرف و حدیث در موردش مفصله که بهتره چیزی نگفت و فقط تماشا کرد! جمعه ۱۰ تیرماه هم کنکور سراسری ریاضی برگزار میشه! یادش بخیر! برای تمام داوطلبان محترم آرزوی موفقیت دارم.

+ همیشه دوست دارم طعم راه حل های مختلف را بچشم و هر کدام که به مزاجم سازگار آمد انتخاب کنم! یکی دو روزه دارم با این Ruby on Rails ور می رم. گفته میشه که یک راه فوق العاده سریع برای ساخت برنامه های کاربردی وب ارائه می کنه که به ادعای خودشون تا ۱۰ برابر روند ساخت برنامه رو کاهش می ده.این فریم ورک از مدل MVC استفاده می کنه و بر پایه زبان شی گرای Ruby هستش.(به نظرم تا وقتی که PHP پیشتاز هستش و همه جا پشتیبانی میشه این فریم ورک جایی برای پیشرفت نداره!) برای آشنایی بیشتر به مقاله Rolling with Ruby on Rails مراجعه کنید.

پ.ن : فایل Power Point ارائه AJAX
1384-04-02 ساعت 07:59:02
The answer to life

+ ماه خرداد هم شروع شد، ماهی که اوج فعالیت های من به حساب میاد.کلی کتاب و جزوه دست نخورده انتظار منو می کشند! برنامه امتحاناتم هم واقعا عالیه: سه شنبه: ریزپردازنده/ چهارشنبه: مهندسی نرم افزار/ پنچشنبه: کامپایلر و سیستم عامل / و ...

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

+ استیو بالمر،مدیر عامل مایکروسافت : گوگل در پنج سال آینده از بین خواهد رفت! ( با وجود msn و hotmail حتما همینطور می شه !)

+ امروز با این کتابخانه PHP برای ساخت Sparkline ها آشنا شدم.به کمک تصاویر Sparkline ، میشه اطلاعات زیادی رو توی یه فضای کم نشون داد.مثلا =>

"sparklines are data-intense wordlike graphics, that have the intensity of visual distinctions comparable to words and letters."

+ این سری مقالات "Building a Blog with Dreamweaver, PHP, and MySQL" روکه Marius Zaharia نوشته، از دست ندید. یک تمرین عملی خیلی خوب برای یادگرفتن پی اچ پی و مای سیکوئل و دریم ویوره!

+ تو مقدمه کتاب PHP 5 power programming جمله زیر نوشته شده بود. کسی می دونه منظور از ۴۲ چیه یا کیه؟!

"To my parents, who care for me even when I’m not around;and to 42, the answer to life,the universe of everything."

+ هی کلاغ ! قارقار نکن!(با شما نبودم.خودش می دونه!) در يک روز سرد سرد زمستونی که همه جا رو برف فرا گرفته بود کلاغی روی شاخه درختی نشسته بود که در پای درخت روباه زخمی بيچاره ضعيفی افتاده بود ... کلاغ منتظر بود که روباه آخرين نفس هاش هم بند بياد و توی اون سرما که چيزی واسه خوردن پيدا نميشد شکمی رو از عزا در بياره ... روباه وامونده هم اين رو خوب می دونست ... اما چی کار می تونست بکنه؟ کلاغه بيرحمانه انتظار مرگ روباه رو برای بقای خودش می کشيد ... يکهو يه باد تند کلاغ رو جلوی روباه انداخت و روباه هم بی معطلی اون رو يه لقمه چپش کرد.(قالب پنیر چی شد؟!)

+ ما خوب یادمان هست که وقتی با تابستان گرممان خداحافظی می کردیم و اولین صفحه اولین کتابمان را گشودیم نوشته بود :"آب" در حالیکه ما تشنگی را تجربه میکردیم !ما هنوز امین و اکرم را به یاد داریم :دختر و پسری استاندارد و رسمی و رام و حرف گوش کن با آن لباسهای بی رنگ و بد قواره !و خوب یادمان هست که آنها چقدر با همه ما فرق داشتند!اما حالا هردوتایشان بزرگ شده اند و دیگر آن لباسها را نمی پوشند !آنها یاد گرفته اند شلوار جین و تی شرت بپوشند شبها با رفقایشان می روند پیتزا می خورند !و دیگر به آبگوشت غذای لذیذ نمی گویند!...(دست نوشته های یک مبارز کوچک!)

+ یادمان باشد اگر خاطرمان تنها ماند طلب عشق زهر بی سروپایی نکنیم

1384-03-01 ساعت 19:16:28
?Who moved my cheese

+ یک شب تا صبح روی یک پروژه درسی کار می کنی تا بتونی برای فردا صبح آماده اش کنی. صبح زود، خسته و با چشمانی بسته راه می افتی به سمت دانشگاه.قراره ساعت ۷:۳۰ صبح کلاس تشکیل بشه و پروژه رو تحویل بدی.ناگهان مشاهده می کنی که استاد معظم کلاس رو پیچونده و این هفته قصد اومدن به دانشگاهو نداره! حسابی حالت گرفته می شه .برای این که کم نیاری کلاس بعدی رو هم خودت می پیچونی و ...!

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

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

+ ?Who moved my cheese: تعریف این کتابو خیلی شنیده بودم.امروز بالاخره از نمایشگاه خریدمش و خوندمش. کتاب جمع و جور و جالبیه! توصیه میکنم اگه نخوندینش حتما ۱ ساعت وقت بزارید و بخونیدش. این کتاب، در واقع یک داستان داخل یک داستان دیگه است! داستان اصلی که توی بحث بین چند تا دوست قديمي مطرح می شه در مورد ۴ تا کاراکتر هستش :دو تا موش و دو تا آدم کوچولو که دریک maze درجستجوی پنیر مورد علاقه شان هستند. بقیه داستانو نمی گم! ولی اگه دنبال تغییر و تحول در زندگی هستید حتما بخونیدش، شاید اثر کرد!شاید!

+ به پیشنهاد آقا محسن ، تصمیم گرفتم که پروژه هوش مصنوعی رو Semantic Web انتخاب کنم. یکی دوهفته دیگه باید به صورت کتبی و شفاهی ارائه اش کنم ولی هنوز هیچ کاری نکردم.تازه امروز کتاب درس هوش مصنوعی رو خریدم تا ببینم اصلا درسش چی هستش!

+ قراره که ۲۵-۲۷ اردیبهشت کنسرت گروه آریان تو زمین تنیس مجموعه ورزشی انقلاب برگزار بشه.اگه بلیط گیر آوردید به منم بگید تا با هم بریم! آلبوم جدید شادمهر عقیلی هم با عنوان تلافی به نظر می رسه به طور غیر رسمی منتشر شده!

+ از کارای این گروه حرفه ای طراحی و برنامه نویسی وب خیلی خوشم اومد.(فن آوری اطلاعات و ارتباطات آرون آراد)

+ با این کتاب PHP 5 power programming دارم زندگی می کنم. عجب چیزیه! فکر نکنم تا چند وقت دیگه مقاله جدید بنویسم. باید یک سری احیاء علم انجام بدم!

+ این Google Web Acellerator هم که واقعا یک حرکت ناشیانه از سوی Google بود. اصلا انتظار نداشتیم! اینطور که توی GWA feedback group خوندم به نظر می رسه که با برنامه های انجمن مثل phpbb مشکل داره.( Slashdot article about people having problems with it)

+ پس از تحقيقات فراوان. پي اچ پي ران توسط پليس بين الملل كشف شد!( احسان جان، به خدا من بی گناهم!اومدم غرفتونم.نبودی!)

1384-02-21 ساعت 23:43:50
! Cast away

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

+ این ترم دانشگاه خیلی خواب آوره ! نمی دونم چرا؟!شاید به خاطر بهاره! شاید!

+ این سیستم عامل هم عجب موجود جالبیه! خیلی دلم می خواست با یکی از این Mac OS X ها کار کنم. چقدر قشنگه و چه امکانات قشنگی داره!

+ تا حالا کلمه حماقت مصنوعی رو شنیده بودید؟! این ترم توی کلاس هوش مصنوعی کلمات عجیب و غریبی می شنوم! استاد درس مهندسی نرم افزار ۱(آقای مهندس واحد) هم واقعا عالیه! هر وقت صحبت از برنامه های Web Based می کنه فقط ازPHP وMySQL مثال می زنه!

+ تازه یاد گرفتم که چه جوری میشه یه فرآیند رو معلق کردش! خیلی کاربردیه این قضیه: معلق منتظر

+ این هفته توی یکی از جلسات نیست انگاری دانشگاه شرکت کردم ، نمایش فیلم طعم گیلاس آقای عباس کیارستمی بود. خیلی فیلم اعصاب خورد کنی بود ! یه آدم دنبال کسی می گرده که ۲۰ تا بیل خاک روش بریزه.این یعنی چی؟!!

+ به نظر می رسه که سایت IranPHP کمی فعالتر از سابق شده. جای امیدواریه! نمی دونم چرا هنوز PHP 5 جا نیفتاده بین برنامه نویس ها!؟

+ این روزها Google شده نقل محافل کامپیوتری.همه جا صحبت از پروژه های آزمایشی Google می شه و بیشترین مطلب وبلاگ های فارسی هم شده Google. باید به مسئولین Google گفت که به کجا چنین شتابان؟!

+ Life is a tragedy when seen in close-up, but a comedy in long-shot.

1384-02-05 ساعت 18:39:53
1 2 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

30 | امروز:
89 | ديروز:
77154 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
آشنايي با روش Ajax و به كارگيري آن

درقسمت های قبلی(مقدمه و۱ و۲) به طور پراکنده در مورد روش AJAX بحث شد. در مقاله زیر به جمع بندی و تکمیل قسمت های قبلی پرداختم:

>>آشنايي با روش Ajax و به كارگيري آن<<
1384-03-04 ساعت 22:44:44
آشنایی با روش Ajax -قسمت دوم

ابزارهای مختلفی برای به کارگیری روش Ajax عرضه شده اند.برای نمونه می توان از SAJAX (برای PHP و ASP ) و JPSPAN (برای PHP) و AJAX .Net (برای NET.) نام برد. در این قسمت، با نوشتن یک برنامه کاربردی به معرفی SAJAX می پردازیم:

هدف: برنامه ای برای نمایش رشته های تصادفی( رشته های تصادفی توسط تابعی در سمت Server ساخته می شوند)

ابزار لازم: SAJAX Toolkit (این برنامه را می توانید از اینجا دریافت کنید)

دستور العمل: ابتدا باید فکری برای ذخیره رشته ها کنیم. برای سادگی کار و برای اینکه درگیر database نشویم از آرایه ای از Session ها برای ذخیره و بازیابی رشته ها استفاده می کنیم.  حال به نوشتن توابع مربوط به تولید رشته تصادفی و بازیابی آن در سمت Server می پردازیم:

<?php

session_start();

if (!isset($_SESSION['strings'])) {
$_SESSION['strings'] = array('ali1k','phprun','Hello World');
}

function addString($string) {
$_SESSION['strings'][] = $string;
return true;
}

function randomString() {
$index = rand(0,count($_SESSION['strings'])-1);
return $_SESSION['strings'][$index];
}

function stringCount() {
return count($_SESSION['strings']);
}

?>

در مرحله بعدی کار باید فایل Ajax.php را به برنامه خود ضمیمه کنیم و سپس توابعی را که قرار است از PHP به Javascript صادر کنیم،ثبت کنیم:

<?php

require("Sajax.php");

sajax_init();
//$sajax_debug_mode = 1;
sajax_export("addString");
sajax_export("randomString");
sajax_export("stringCount");

sajax_handle_client_request();

?>

حالا به بخش HTML برنامه می رسیم. توجه داشته باشید که بر خلاف ابزار JPSPAN که توابع PHP را به Javascript نگاشت می کند و بخش Client-Side و Server-Side در دوفایل مجزا قرار می گیرند، درSAJAX هر دو بخش را در یک فایل قرار می دهیم:

<html>
<head>
    <title>SAJAX Hello World</title>
    <script>
    <?
    sajax_show_javascript();
    ?>

    function addString_cb() {
        x_stringCount(stringCount_cb);
    }

    function do_addString() {
        x_addString(document.getElementById('string').value,addString_cb);
        document.getElementById('string').value = '';
    }

    function addRandom_cb(result) {
        document.getElementById('canvas').innerHTML += '<p>'+result+'</p>';
    }

    function stringCount_cb(result) {
        document.getElementById('count').innerHTML = result;
    }

    </script>

</head>
<body onLoad="x_stringCount(stringCount_cb)">

    <input type="button" name="check" value="Show Random String" onclick="x_randomString(addRandom_cb); return false;">
    <div>Number of Random Strings: <span id="count"></span></div>
    <div id="canvas" style="border: solid 1px black; margin: 1em; padding: 1em;"></div>

    <div>
    Add new String:
    <input type="text" name="string" id="string" size="20">
    <input type="button" name="check" value="Add new String" onclick="do_addString(); return false;">
    </div>
</body>
</html>

از آنجایی که SAJAX از توابع Callback برای برگرداندن مقادیر استفاده می کند، به دو تابع جاوااسکریپت نیاز داریم. مثلا در اینجا تابع do_addString که عمل اضافه کردن رشته را انجام می دهد برای دریافت مقدار پارامترهایش از تابع addString_cb استفاده می کند(این تابع نیز مقادیر پارامترهایش را توسط تابع stringCount_cb دریافت می کند) ! همانطور که مشاهده می کنید برای استفاده از توابع PHP که قبلا ثبت کردیم از پیشوند _x استفاده می کنیم.

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

+ منبع مطلب:

http://blog.joshuaeichorn.com/
1384-02-07 ساعت 19:05:37
آشنایی با روش Ajax -قسمت اول

در پست قبلی در مورد روش جدید Ajax برای ساخت برنامه های تحت وب بحث شد و ایده کلی این روش بیان شد.در این مقاله به معرفی شیء XMLHttpRequest که نقشی اساسی در این روش دارد، می پردازیم :

XMLHttpRequest یکی از اشیای محلی(Native Object) جاوااسکریپت است که اجازه درخواست های HTTP را از یک صفحه لود شده به کاربران می دهد.این شیء به کاربران اجازه می دهد که یک سری ریزدرخواست(Microrequests) در پاسخ به رویدادهای کاربر، بدون لود شدن مجدد صفحات ارسال کنند و این امر باعث می شود که یک برنامه تحت وب ، ماهیتی مثل desktop applications پیدا کند. توجه داشته باشید که XMLHttpRequest تنها روش ارتباط با server بدون لود شدن مجدد صفحات نیست بلاکه روش های دیگری مثل Remote Scripting نیز وجود دارند که از بحث ما خارج است! در این مقاله با یک مثال عملی ساده، چگونگی استفاده از این شیء را توضیح می دهیم:

فرض کنید که می خواهیم برنامه ای برای ضرب دو عدد بنویسیم. قرار است که ضرب دو عدد در سمت Server و توسط php انجام شود.(ممکنه که این مثال کمی احمقانه به نظر برسه چون خیلی راحت با جاوااسکریپت میشه این کارو انجام داد! ولی هدف ما توی این مقاله استفاده از یک زبان برنامه نویسی سمت server بدون لود شدن مجدد صفحات است و هدف ما به هیچوجه، انجام عمل ضرب نیست!)

اولین مرحله از کار،ساخت یک شیء XMLHttpRequest توسط جاوااسکریپت است.از آنجا که مرورگرهای وب مختلف، با این شیء به روش های مختلف برخورد می کنند برای ساخت این شیء به صورت مستقل از مرورگر، از precompile directives استفاده می کنیم.(این دستورات با /*@cc_on شروع شده و به @end @*/ ختم می شوند.) در اینجا از دستورات try-catch برای کنترل ساخت این شیء استفاده شده است.در هنگام لود صفحه اصلی، یک نمونه از این شیء درست می شود:

<script language="javascript"  type="text/javascript">
function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}
var http = getHTTPObject(); // We create the HTTP Object
</script>

در مرحله بعدی، فرمی ساده با سه فیلد با نامه های مشخصه a,b,c درست می کنیم. رویداد onblur مربوط به فیلد b را با تابع echoResult اداره می کنیم. قصد داریم وقتی کاربر با فشار دادن کلید tab ،تمرکز را از این فیلد گرفت، نتیجه ضرب a در b را در فیلد c نشان دهیم:

<form name="form1" method="post" action="">
  <table width="392" border="0" align="center" cellpadding="0" cellspacing="0">
    <tr>
      <td width="24"><input name="a" type="text" id="a" size="4" maxlength="4"></td>
      <td width="21"><div align="center">*</div></td>
      <td width="36"><div align="center">
          <input name="b" type="text" id="b" size="4" maxlength="4" onblur="echoResult();">
        </div></td>
      <td width="25"><div align="center">=</div></td>
      <td width="286"><input name="c" type="text" id="c" size="8" maxlength="8"></td>
    </tr>
  </table>
</form>

در این مرحله به نوشتن تابع echoResult و handleHttpResponse می پردازیم.تابع echoResult مقادیر فیلدهای a و b را دریافت کرده از طریق شیء XMLHttpRequest این مقادیر را به صورت پارامتر به صفحه سمت server که در اینجا handleMultiply.php می باشد، ارسال می کند. خاصیت onreadystatechange مربوط به شیء XMLHttpRequest را برابر تابع handleHttpResponse قرار داده ایم.این تابع پاسخ دریافتی از سمت Server را در فیلد مربوطه یعنی c می نویسد و سپس ارتباط با server قطع می شود:

<script language="javascript"  type="text/javascript">
var url = "handleMultiply.php?"; // The server-side script
function handleHttpResponse() {
  if (http.readyState == 4) {
    result = http.responseText;
    document.getElementById('c').value = result;
  }
}
function echoResult() {
  var a = document.getElementById("a").value;
  var b = document.getElementById("b").value;
  http.open("GET", url + "a=" + a + "&b=" + b, true);
  http.onreadystatechange = handleHttpResponse;
  http.send(null);
}
</script>

در مرحله آخر یک صفحه php با نام handleMultiply.php درست می کنیم که پارامترهای a و b را به روش GET دریافت کرده و حاصلضرب آنها را بر می گرداند.

<?php
    $a=$_GET['a'];
    $b=$_GET['b'];
    $c=$a * $b ;
    echo $c;
?>

این تمام کاری بود که باید انجام می دادیم.حالا می توانیم برنامه خود را تست کنیم و یک گام به سمت روش Ajax برداریم.نتیجه اجرای این مثال را می توانید در اینجا مشاهده کنید. کد کامل صفحه Multiply.htm نیز در زیر آورده شده است:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Multiply a*b without refreshing!</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="javascript"  type="text/javascript">
var url = "handleMultiply.php?"; // The server-side script
function handleHttpResponse() {
  if (http.readyState == 4) {
    result = http.responseText;
    document.getElementById('c').value = result;
  }
}
function echoResult() {
  var a = document.getElementById("a").value;
  var b = document.getElementById("b").value;
  http.open("GET", url + "a=" + a + "&b=" + b, true);
  http.onreadystatechange = handleHttpResponse;
  http.send(null);
}
function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}
var http = getHTTPObject(); // We create the HTTP Object
</script>
</head>
<body>
<form name="form1" method="post" action="">
  <table width="392" border="0" align="center" cellpadding="0" cellspacing="0">
    <tr>
      <td width="24"><input name="a" type="text" id="a" size="4" maxlength="4"></td>
      <td width="21"><div align="center">*</div></td>
      <td width="36"><div align="center">
          <input name="b" type="text" id="b" size="4" maxlength="4" onblur="echoResult();">
        </div></td>
      <td width="25"><div align="center">=</div></td>
      <td width="286"><input name="c" type="text" id="c" size="8" maxlength="8"></td>
    </tr>
  </table>
</form>
</body>
</html>
1383-12-23 ساعت 19:25:41
Ajax :روشي نوين در طراحي برنامه هاي كاربردي تحت وب

امروزه، معمولا وقتی صحبت از طراحی برنامه های تعاملی(interaction design ) می شود،بیشتر توجه ها معطوف به وب است. برنامه های کاربردی تحت وب به سرعت در حال رشد و توسعه هستند و کاربران دوست دارند که با همان راحتی و سرعتی که با Desktop application ها کار می کنند با Web application ها هم کار کنند. طراحان برنامه های کاربردی وب هم برای از بین بردن این شکاف ، روش های طراحی گوناگونی را پیشنهاد کرده اند.

نگاهی به Google Suggest و Google Maps بیندازید . وقتی روی قسمتی از نقشه zoom می کنید و یا بالا و پایین می روید همه چیز تقریبا به طور همزمان و بدون Load شدن مجدد صفحات انجام می شود. Google Suggest و Google Maps دو نمونه از روش طراحی جدید به نام Ajax هستند. Ajax مخفف Asynchronous JavaScript + XML می باشد.

Ajax شامل مجموعه ای از تکنولوژی های مختف است که گرد هم آمده اند تا یک روش قدرتمند و جدید را برای طراحی برنامه های کاربردی وب ایجاد کنند:

  • standards-based presentation using XHTML and CSS;
  • dynamic display and interaction using the Document Object Model;
  • data interchange and manipulation using XML and XSLT;
  • asynchronous data retrieval using XMLHttpRequest;
  • and JavaScript binding everything together.

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

وقتی که سرور مشغول پردازش درخواست ها است، کاربر چه می کند؟ مسلم است که انتظار می کشد! و این انتظار در هر مرحله از انجام کار بیشتر و بیشتر می شود! زمانی که یک فرم وب را در برنام کاربردی خود قرار می دهید کاربر باید تا زمان دریافت نتایج صبر کند.اصلا چه لزومی دارد که کاربر ببیند برنامه او به سمت سرور می رود؟! Ajax به این پرسش ها پاسخ می دهد:

یک برنامه کاربردی Ajax ، طبیعت start-stop-start-stop برنامه های کاربردی وب را با معرفی یک واسط به نام Ajax engine بین کاربر و سرور، از بین می برد. ممکن است به نظر برسد که افزودن یک لایه جدید به برنامه کاربردی، عکس العمل آن را کند کند اما نتیجه حاصله کاملا برعکس است! به جای load کردن یک صفحه وب در آغاز یک session ، مرورگر کاربر، Ajax engine را که توسط JavaScript نوشته شده است load می کند. این engine مسئولیت render کردن واسطی که کاربر می بیند و همچنین ارتباط با سرور از سمت کاربر را بر عهده دارد.این engine سبب می شود که تعامل کاربر با برنامه کاربردی، نا همگام(asynchronously) با ارتباط کاربر با سرور انجام شود. بنابر این ،کاربر هرگز یک صفحه مرورگر خالی یا یک آیکون ساعت شنی برای انتظار نمی بیند و منتظر سرور نمی نشیند!

Google نقش مهمی را در طراحی و به کارگیری این شیوه جدید داشته است. Orkut, Gmail و آخرین نسخه آزمایشی Google Groups, Google Suggest و Google Maps به شیوه Ajax طراحی شده اند.(برای کسب اطلاعات بیشتر می توانید به تحلیل Gmail, Google Suggest و Google Maps مراجعه کنید.) بیشتر ویژگی های جالب که در Flickr مشاهده می کنید بر اساس همین شیوه است. متور جستجوی Amazon’s A9.com هم بر اساس این روش طراحی شده است.

این پروژه های موفق نشان می دهند که Ajax یک روش تئوری نیست بلکه کاملا کاربردی است!

منبع مطلب: http://www.adaptivepath.com/publications/essays/archives/000385.php
1383-12-03 ساعت 07:33:07
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

33 | امروز:
89 | ديروز:
77157 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
آشنايي با روش Ajax و به كارگيري آن

درقسمت های قبلی(مقدمه و۱ و۲) به طور پراکنده در مورد روش AJAX بحث شد. در مقاله زیر به جمع بندی و تکمیل قسمت های قبلی پرداختم:

>>آشنايي با روش Ajax و به كارگيري آن<<
1384-03-04 ساعت 22:44:44
The answer to life

+ ماه خرداد هم شروع شد، ماهی که اوج فعالیت های من به حساب میاد.کلی کتاب و جزوه دست نخورده انتظار منو می کشند! برنامه امتحاناتم هم واقعا عالیه: سه شنبه: ریزپردازنده/ چهارشنبه: مهندسی نرم افزار/ پنچشنبه: کامپایلر و سیستم عامل / و ...

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

+ استیو بالمر،مدیر عامل مایکروسافت : گوگل در پنج سال آینده از بین خواهد رفت! ( با وجود msn و hotmail حتما همینطور می شه !)

+ امروز با این کتابخانه PHP برای ساخت Sparkline ها آشنا شدم.به کمک تصاویر Sparkline ، میشه اطلاعات زیادی رو توی یه فضای کم نشون داد.مثلا =>

"sparklines are data-intense wordlike graphics, that have the intensity of visual distinctions comparable to words and letters."

+ این سری مقالات "Building a Blog with Dreamweaver, PHP, and MySQL" روکه Marius Zaharia نوشته، از دست ندید. یک تمرین عملی خیلی خوب برای یادگرفتن پی اچ پی و مای سیکوئل و دریم ویوره!

+ تو مقدمه کتاب PHP 5 power programming جمله زیر نوشته شده بود. کسی می دونه منظور از ۴۲ چیه یا کیه؟!

"To my parents, who care for me even when I’m not around;and to 42, the answer to life,the universe of everything."

+ هی کلاغ ! قارقار نکن!(با شما نبودم.خودش می دونه!) در يک روز سرد سرد زمستونی که همه جا رو برف فرا گرفته بود کلاغی روی شاخه درختی نشسته بود که در پای درخت روباه زخمی بيچاره ضعيفی افتاده بود ... کلاغ منتظر بود که روباه آخرين نفس هاش هم بند بياد و توی اون سرما که چيزی واسه خوردن پيدا نميشد شکمی رو از عزا در بياره ... روباه وامونده هم اين رو خوب می دونست ... اما چی کار می تونست بکنه؟ کلاغه بيرحمانه انتظار مرگ روباه رو برای بقای خودش می کشيد ... يکهو يه باد تند کلاغ رو جلوی روباه انداخت و روباه هم بی معطلی اون رو يه لقمه چپش کرد.(قالب پنیر چی شد؟!)

+ ما خوب یادمان هست که وقتی با تابستان گرممان خداحافظی می کردیم و اولین صفحه اولین کتابمان را گشودیم نوشته بود :"آب" در حالیکه ما تشنگی را تجربه میکردیم !ما هنوز امین و اکرم را به یاد داریم :دختر و پسری استاندارد و رسمی و رام و حرف گوش کن با آن لباسهای بی رنگ و بد قواره !و خوب یادمان هست که آنها چقدر با همه ما فرق داشتند!اما حالا هردوتایشان بزرگ شده اند و دیگر آن لباسها را نمی پوشند !آنها یاد گرفته اند شلوار جین و تی شرت بپوشند شبها با رفقایشان می روند پیتزا می خورند !و دیگر به آبگوشت غذای لذیذ نمی گویند!...(دست نوشته های یک مبارز کوچک!)

+ یادمان باشد اگر خاطرمان تنها ماند طلب عشق زهر بی سروپایی نکنیم

1384-03-01 ساعت 19:16:28
exponent CMS

"مدیریت محتوا باید ساده باشد. " این شعار طراحان سیستم مدیریت محتوای exponent می باشد.این CMS توسط یک شرکت تجاری به نام S-Media و با استفاده از PHP و MySQL تحت مجوز GPLطراحی شده است.این CMS هوز در مرحله تکامل قرار دارد و آخرین نسخه عرضه شده آن 0.95 می باشد که از اینجا قابل دریافت است. اولین و برجسته ترین مشخصه exponent واسط گرافیکی بخش مدیریت آن است که آن را از دیگر برنامه های رایج مثل PHP-Nuke، XOOPS و ... متمایز می سازد.در exponent مدیریت و به روزرسانی محتوا به صورت WYSIWYG است ،یعنی شما به همان صورتی که محتوا را مشاهده می کنید می توانید آن را ویرایش کنید. از دیگر مشخصه های exponent نصب آسان آن است.این CMS از Smarty template engine برای قالب بندی صفحات استفاده می کند که تغییر قالب و ظاهر آن را بسیار ساده کرده است.( قالب های پیش فرض سیستم بر مبنای HTML 4 و table layout است.) از لحاظ کد برنامه، این سیستم به خوبی کد نویسی شده است و کدهای پروژه های خارجی مثل HTMLArea و Smarty کاملا مجزا از کد اصلی برنامه است و می توان کد آن را به راحتی تغییر داد. همچنین کدهای برنامه به خوبی مستند سازی شده است و یافتن و تغییر ماژول ها و زیر سیستم های آن(مثل SMTP functionality, session handling, user account management) ساده است. اشکالات: بااینکه این سیستم واسط گرافیکی خوبی دارد ولی در ابتدا ممکن است کمی پیچیده و گنگ به نظر برسد. بعضی از ماژول های سیستم مثل Calendar هنوز توانایی عملیاتی بالایی ندارند و ناقص به نظر می رسند.

1384-02-25 ساعت 22:17:43
?Who moved my cheese

+ یک شب تا صبح روی یک پروژه درسی کار می کنی تا بتونی برای فردا صبح آماده اش کنی. صبح زود، خسته و با چشمانی بسته راه می افتی به سمت دانشگاه.قراره ساعت ۷:۳۰ صبح کلاس تشکیل بشه و پروژه رو تحویل بدی.ناگهان مشاهده می کنی که استاد معظم کلاس رو پیچونده و این هفته قصد اومدن به دانشگاهو نداره! حسابی حالت گرفته می شه .برای این که کم نیاری کلاس بعدی رو هم خودت می پیچونی و ...!

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

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

+ ?Who moved my cheese: تعریف این کتابو خیلی شنیده بودم.امروز بالاخره از نمایشگاه خریدمش و خوندمش. کتاب جمع و جور و جالبیه! توصیه میکنم اگه نخوندینش حتما ۱ ساعت وقت بزارید و بخونیدش. این کتاب، در واقع یک داستان داخل یک داستان دیگه است! داستان اصلی که توی بحث بین چند تا دوست قديمي مطرح می شه در مورد ۴ تا کاراکتر هستش :دو تا موش و دو تا آدم کوچولو که دریک maze درجستجوی پنیر مورد علاقه شان هستند. بقیه داستانو نمی گم! ولی اگه دنبال تغییر و تحول در زندگی هستید حتما بخونیدش، شاید اثر کرد!شاید!

+ به پیشنهاد آقا محسن ، تصمیم گرفتم که پروژه هوش مصنوعی رو Semantic Web انتخاب کنم. یکی دوهفته دیگه باید به صورت کتبی و شفاهی ارائه اش کنم ولی هنوز هیچ کاری نکردم.تازه امروز کتاب درس هوش مصنوعی رو خریدم تا ببینم اصلا درسش چی هستش!

+ قراره که ۲۵-۲۷ اردیبهشت کنسرت گروه آریان تو زمین تنیس مجموعه ورزشی انقلاب برگزار بشه.اگه بلیط گیر آوردید به منم بگید تا با هم بریم! آلبوم جدید شادمهر عقیلی هم با عنوان تلافی به نظر می رسه به طور غیر رسمی منتشر شده!

+ از کارای این گروه حرفه ای طراحی و برنامه نویسی وب خیلی خوشم اومد.(فن آوری اطلاعات و ارتباطات آرون آراد)

+ با این کتاب PHP 5 power programming دارم زندگی می کنم. عجب چیزیه! فکر نکنم تا چند وقت دیگه مقاله جدید بنویسم. باید یک سری احیاء علم انجام بدم!

+ این Google Web Acellerator هم که واقعا یک حرکت ناشیانه از سوی Google بود. اصلا انتظار نداشتیم! اینطور که توی GWA feedback group خوندم به نظر می رسه که با برنامه های انجمن مثل phpbb مشکل داره.( Slashdot article about people having problems with it)

+ پس از تحقيقات فراوان. پي اچ پي ران توسط پليس بين الملل كشف شد!( احسان جان، به خدا من بی گناهم!اومدم غرفتونم.نبودی!)

1384-02-21 ساعت 23:43:50
آشنایی با روش Ajax -قسمت دوم

ابزارهای مختلفی برای به کارگیری روش Ajax عرضه شده اند.برای نمونه می توان از SAJAX (برای PHP و ASP ) و JPSPAN (برای PHP) و AJAX .Net (برای NET.) نام برد. در این قسمت، با نوشتن یک برنامه کاربردی به معرفی SAJAX می پردازیم:

هدف: برنامه ای برای نمایش رشته های تصادفی( رشته های تصادفی توسط تابعی در سمت Server ساخته می شوند)

ابزار لازم: SAJAX Toolkit (این برنامه را می توانید از اینجا دریافت کنید)

دستور العمل: ابتدا باید فکری برای ذخیره رشته ها کنیم. برای سادگی کار و برای اینکه درگیر database نشویم از آرایه ای از Session ها برای ذخیره و بازیابی رشته ها استفاده می کنیم.  حال به نوشتن توابع مربوط به تولید رشته تصادفی و بازیابی آن در سمت Server می پردازیم:

<?php

session_start();

if (!isset($_SESSION['strings'])) {
$_SESSION['strings'] = array('ali1k','phprun','Hello World');
}

function addString($string) {
$_SESSION['strings'][] = $string;
return true;
}

function randomString() {
$index = rand(0,count($_SESSION['strings'])-1);
return $_SESSION['strings'][$index];
}

function stringCount() {
return count($_SESSION['strings']);
}

?>

در مرحله بعدی کار باید فایل Ajax.php را به برنامه خود ضمیمه کنیم و سپس توابعی را که قرار است از PHP به Javascript صادر کنیم،ثبت کنیم:

<?php

require("Sajax.php");

sajax_init();
//$sajax_debug_mode = 1;
sajax_export("addString");
sajax_export("randomString");
sajax_export("stringCount");

sajax_handle_client_request();

?>

حالا به بخش HTML برنامه می رسیم. توجه داشته باشید که بر خلاف ابزار JPSPAN که توابع PHP را به Javascript نگاشت می کند و بخش Client-Side و Server-Side در دوفایل مجزا قرار می گیرند، درSAJAX هر دو بخش را در یک فایل قرار می دهیم:

<html>
<head>
    <title>SAJAX Hello World</title>
    <script>
    <?
    sajax_show_javascript();
    ?>

    function addString_cb() {
        x_stringCount(stringCount_cb);
    }

    function do_addString() {
        x_addString(document.getElementById('string').value,addString_cb);
        document.getElementById('string').value = '';
    }

    function addRandom_cb(result) {
        document.getElementById('canvas').innerHTML += '<p>'+result+'</p>';
    }

    function stringCount_cb(result) {
        document.getElementById('count').innerHTML = result;
    }

    </script>

</head>
<body onLoad="x_stringCount(stringCount_cb)">

    <input type="button" name="check" value="Show Random String" onclick="x_randomString(addRandom_cb); return false;">
    <div>Number of Random Strings: <span id="count"></span></div>
    <div id="canvas" style="border: solid 1px black; margin: 1em; padding: 1em;"></div>

    <div>
    Add new String:
    <input type="text" name="string" id="string" size="20">
    <input type="button" name="check" value="Add new String" onclick="do_addString(); return false;">
    </div>
</body>
</html>

از آنجایی که SAJAX از توابع Callback برای برگرداندن مقادیر استفاده می کند، به دو تابع جاوااسکریپت نیاز داریم. مثلا در اینجا تابع do_addString که عمل اضافه کردن رشته را انجام می دهد برای دریافت مقدار پارامترهایش از تابع addString_cb استفاده می کند(این تابع نیز مقادیر پارامترهایش را توسط تابع stringCount_cb دریافت می کند) ! همانطور که مشاهده می کنید برای استفاده از توابع PHP که قبلا ثبت کردیم از پیشوند _x استفاده می کنیم.

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

+ منبع مطلب:

http://blog.joshuaeichorn.com/
1384-02-07 ساعت 19:05:37
<< 1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

41 | امروز:
89 | ديروز:
77165 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
PHP يا ASP.NET ؟

PHP بهتر است یا ASP.NET ؟! این قصه سر دراز دارد! به بیشتر انجمن های روی وب که سر میزنی تاپیکی با این عنوان می بینی. دوستداران جناب بیل گیتس در یک طرف و دشمنان او که مرتب به دنبال حفره های جدید امنیتی در ویندوز هستند،در طرف دیگر میدان قرار دارند. این جدال ،در واقع، رویارویی ذهن های بسته در برابر ذهن های باز و رو به آینده می باشد. به قول یکی از دوستان، مغز مثل یک چتر نجاته که وقتی باز بشه تازه شروع به کار می کنه!

وب سایت Oracle در مقاله ای حمایت خود از PHP را نشان می دهد و مقایسه ای یک طرفه بین PHP و ASP.NET انجام می دهد:

 | PHP 4 | PHP 5 | ASP.NET
Software price | free | free | free
Platform price | free | free | $$
Speed | strong | strong | weak
Efficiency | strong | strong | weak
Security | strong | strong | strong
Platform | strong | strong | weak (IIS only)
Platform | any | any | win32 (IIS only)
Source available | yes | yes | no
Exceptions | no | yes | yes
OOP | weak | strong | strong

از طرف دیگر مایکروسافت مقاله ای برای مهاجرت از PHP به ASP.NET می نویسد و در انجمن های خود سعی می کند PHP کارها را هم وارد چارچوب خود کند.علاقمندان مایکروسافت PHP را زبانی محدود و بسته در برابر کران های نامحدود ASP.NET می دانند.آنها PHP را زبانی Java-Like می دانند که از شرکت Sun (دوست سابق و دشمن امروز مایکروسافت)آب می خورد و آن را برای پروژه های در مقیاس بزرگ(Large-Scale) اصلا مناسب نمی بینند.

حالا به نظر شما PHP بهتر است یا ASP.NET ؟ اگر هدف شما برنامه نویسی تحت وب است، PHP زبان مناسب شما است. PHP ساده است، انعطاف پذیری بالایی دارد و مرتب در حال رشد است. اگر هدف شما برنامه نویسی تجاری تحت وب است به نظر من ASP.NET مناسب تر است زیرا از اندیشه یک شرکت کاملا تجاری برخواسته است! حال شما مختارید که یکی را انتخاب کنید یا هر دو(البته ، دو پادشاه در اقلیمی نگنجند).

PHP comes from Developers, not Marketers.

If PHP was a person, it would have started out as a high school nerd that none of the popular kids noticed. No bright clothes or rich parents. Probably would have worked at the local burger joint to save up for college.

When we grow up, we recognize that the nerds knows the answers that get the jobs done faster.

After spending years writing dumb jock apps with ASP, I learned that there are simply better ways to do things.

Rather than falling for the massive marketing hype of Microsoft, I look to the nerd to see what he's doing, and he's doing everything with PHP.

I no longer care what "superior" qualities Microsoft claims to have over whatever it is they are afraid of.

Because PHP is built by developers for developers, rather than by marketers for BDMs, I know I'm generally going to get the best solution to solve my problem with minimal overhead (redundant BS code).

There are modules for just about anything I could ever imagine. And oh yeah! That little thing called SOAP Microsoft claims makes .NET so superior to all other things. PHP supports that too. At the end of the day, PHP allows me to do far more than I could ever do with bonehead tools.

Posted by Peter Drinnan on May 10th, 2003 at 03:06:17 GMT

1383-09-01 ساعت 20:50:56
كار با Data Object ها در php5-قسمت3

در قسمت ۱و۲ به معرفی یک DataObject پرداختیم.کلاسی به نام DO_User تعریف کرده و متدهای حذف،اضافه و بروزرسانی مرتبط با آن را برای یک سطر از رکوردها نوشتیم. در این قسمت به بررسی پرس و جوهایی(Query)می پردازیم که بیش از یک سطر را برمی گردانند.

ساده ترین روش برای حل این مساله،ساخت آرایه ای از DataObject ها است که شامل تمام رکوردهای دریافتی باشد.این راه حل ممکن است در نگاه اول منطقی به نظر برسد اما اگرquery شما ۱۰۰۰۰ سطر و یا بیشتر را برگرداند چه اتفاقی می افتد؟ یک ارایه بسیار بزرگ از اشیاء احتیاج به حجم زیادی از حافظه دارد و بار زیادی را به host شما تحمیل می کند و ممکن است منجر به از کارافتادن(Shut Down) سایت شما شود.پس بهتر است به فکر یک راه حل دیگر برای دریافت چند سطر ازداده ها باشیم:

راه بهتر این است که یک کلاس جدید برای این کار تعریف کنیم.این کلاس را Re a dOnlyResultSet می نامیم زیرا مجموعه نتایج،فقط قابل خواندن است.این نوع نامگذاری معمولا در الگوهای طراحیJ2EE برای ثبات و یکدست بودن(Consistency) ، مورد استفاده قرار می گیرد.قبل از اینکه این کلاس را بنویسیم،یک متد جدید به نام()find به کلاس DO_User اضافه می کنیم که مجموعه نتایج را برگرداند:

public function find()
{
  $sql = "SELECT * FROM User";

  // This array will hold the where clause
  $where = array();

  // Using PHP 5's handy new reflection API
  $class = new ReflectionClass('DO_User');

  // Get all of DO_User's variable (or property) names
  $properties = $class->getProperties();

  // Loop through the properties
  for ($i = 0; $i < count($properties); $i++) {
    $name = $properties[$i]->getName();
    if ($this->$name != '') {
      // Add this to the where clause
      $where[] = "`" . $name . "`='"
      . mysql_escape_string($this->$name) . "'";
    }
  }

  // If we have a where clause, build it
  if (count($where) > 0){
    $sql .= " WHERE " . implode(' AND ', $where);
  }

  $rs = mysql_query($sql);
  include_once('class-ReadOnlyResultSet.php');
  return new ReadOnlyResultSet($rs);
}

PHP 5 به صورت توکار(built-in) از Reflection API پشتیبانی می کند که توسط آن می توان در مورد یک کلاس و یا شیء خاص اطلاعات گرفت.معمولا به این کار، مهندسی معکوس(Reverse Engineering) می گویند. ما در اینجا از Reflection API برای دریافت متغیرهای عضو یا Properties یک DataObject استفاده می کنیم.اگر فرصت داشتید حتما نگاهی به این API جدید بیندازید تا به قدرت آن پی ببرید!

توجه کنید که قبل از فراخوانی find باید داده هایی را که می خواهیم روی آنها جستجو انجام داهیم،در متغیرهای عضو کلاس قرار دهیم.متد find یک query بر اساس متغیرهای set شده درست می کند و نتیجه آن را به صورت یک شیء ReadOnlyResultSet برمی گرداند. در ادامه کد مربوط به کلاس ReadOnlyResultSet را می نویسیم:

class ReadOnlyResultSet {
    // This member variable will hold the native result set
  private $rs;

    // Assign the native result set to an instance variable
  function __construct($rs)
  {
    $this->rs = $rs;
  }

    // Receives an instance of the DataObject we're working on
  function getNext($dataobject)
  {
    $row    = mysql_fetch_array($this->rs);

    // Use reflection to fetch the DO's field names
    $class    = new ReflectionObject($dataobject);
    $properties = $class->getProperties();

    // Loop through the properties to set them from the current row
    for ($i = 0; $i < count($properties); $i++) {
      $prop_name        = $properties[$i]->getName();
      $dataobject->$prop_name = $row[$prop_name];
    }

    return $dataobject;
  }

  // Move the pointer back to the beginning of the result set
  function reset()
  {
    mysql_data_seek($this->rs, 0);
  }

  // Return the number of rows in the result set
  function rowCount()
  {
    return mysql_num_rows($this->rs);
  }
}

کلاس ReadOnlyResultSet یک پوشش(Wrapper) برای مجموعه نتایج می باشد که یک نمونه DataObject برمی گرداند.بهتر است برای همه پروژه هایی که می نویسیم از یک ReadOnlyResultSet عمومی استفاده کنیم و دیگر آن را تغییر ندهیم.

*نکته: php 5 با اشیاء به صورت ارجاع مستقیم(refrence) کار می کند(مثل JAVA) و نیازی به استفاده از & نیست.

کلاس ReadOnlyResultSet علاوه بر متد سازنده کلاس(Constructor)، سه متد دارد. متد ()reset اشاره گر نتایج را به اول آن برمی گرداند.متد ()rowCount تعداد سطرها را بر می گرداند.متد ()getNext پیچیده ترین متد این کلاس است که نیاز به کمی توضیح دارد:

از آنجا که این کلاس باید برای همه DataObject ها کار کند،باید راهی پیدا کنیم که به این متد بگوییم که با کدام DataObject کار کند. به همین علت باید DataObject مورد نظر را به عنوان پارامتر با این تابع بدهیم. خط اول این متد،سطر بعدی از مجموعه نتایج را واکشی می کند،سپس با استفاده از یک حلقه تکرار و استفاده از Reflection API خواص(properties) مربوط به اشیاء را پر می کنیم. به استفاده از ReflectionObject به جای ReflectionClass دقت کنید.ما در اینجا سعی داریم که مهندسی معکوس را برای یک شیء به کار ببریم نه یک کلاس!

حالا وقت آن رسیده که در عمل کلاس ReadOnlyResultSet را تست کنیم.مثال زیر تمام رکوردهایی را که FirstName آنها ali است جستجو می کند:

<?php
include_once('class-DO_User.php');
$user      = new DO_User();

// We'll use a literal string here,
// but this could come from anywhere,
// such as $_POST or $_GET
$user->firstName = 'ali';

// Call find(), which returns an instance of ReadOnlyResultSet
$rs        = $user->find();
?>

<html>
  <head>
    <title>Found Users</title>
  </head>
  <body>
    <p>Here the found users:</p>
    <table border="1">
      <tr>
        <td>User ID</td>
        <td>First Name</td>
        <td>Last Name</td>
        <td>Email</td>
      </tr>
<?php
// Loop through the result set
for ($i=0; $i < $rs-rowCount(); $i++) {

  // Pass on a new instance of DO_User, receiving it back filled in
  $userRow = $rs->getNext(new DO_User());
   // Display the current row in an HTML table
?>
      <tr>
        <td><?=$userRow->userId?></td>
        <td><?=$userRow->firstName?></td>
        <td><?=$userRow->lastName?></td>
        <td><?=$userRow->email?></td>
      </tr>
<?php
}
?>
    </table>
  </body>
</html>

دقت کنید که وقتی rs->getNext$ را فراخوانی می کنیم،یک نمونه جدید از DO_User می سازیم.از این جااست که کلاس ما می فهمد با کدام نوع از اشیاء داده ای سر و کار دارد.

منابع:

  • Source code: [ReadOnlyResultSet] [DO_User]
  • PHP 5: [Zend's PHP5 InfoCenter] [Reflection API]
  • Design Patterns: [Data Access Object] [Data Transfer Object]
  • http://www.onlamp.com/
    • 1383-08-19 ساعت 22:55:10
    كار با Data Object ها در php5-قسمت2

    همانطور که در قسمت اول بحث شد، لایه دسترسی به داده ها و لایه انتزاع پایگاه داده دو چیز متفاوتند.شما می توانید یکی از این دو لایه و یا حتی هر دو را برای بدست آوردن انعطاف (flexibility) بیشتر به کار ببرید.کار لایه انتزاع پایگاه داده، مخفی کردن RDBMS ای است که در پس زمینه در حال اجرا است.اگر شما در نوشتن دستورات SQL خود، تبحر داشته باشید،به راحتی می توانید از یک database server به دیگری کوچ کنید،بدون آنکه تغییری در فراخوانی های توابع یا SQL بدهید.Pear::DB این کار را به خوبی انجام می دهد.

    لایه دسترسی به داده ها(Data Access Layer) روشی است برای مشخص کردن جداول خود، تا بتوانید بدون استفاده از SQL در Business layer برنامه خود(جایی که کد تمام توابع برنامه قرار می گیرد) با داده های جداول، تعامل داشته باشید. Data Object ها ،گزینه خوبی برای لایه دسترسی به داده ها هستند زیرا از آنجا که رابطه مستقیم با جداول دارند،می توانید بدون تغییر در آنها،چندین بار از آنها در طول برنامه خود استفاده کنید.

    در قسمت ۱ ،کلاسی با نام DO_User ساختیم ویک متد ساده برای دریافت رکورد بر اساس فیلد userId نوشتیم.در این قسمت به توسعه کلاس DO_User می پردایم:

    افزودن یک رکورد جدید(INSERT)

    در اینجا یک متد جدید به نام insert را به کلاس خود اضافه می کنیم.این متد،یک رکورد جدید به جدول ما اضافه می کند:

    public function insert()
    {
          $sql = "INSERT INTO User SET
      firstName='"     . mysql_escape_string($this->firstName) . "',
      lastName='"      . mysql_escape_string($this->lastName)  . "',
      email='"       . mysql_escape_string($this->email)   . "'";

          mysql_query($sql);
          $this->userId = mysql_insert_id();
    }

    ممکن است سوال کنید که اطلاعات برای درج شدن از کجا گرفته می شوند،زیرا تابع insert هیچ پارامتری ندارد! جواب این است که قبل از فراخوانی این تابع باید متغیرهای عضو کلاس مقداردهی شده باشند به جز متغیر userId که بعد از افزودن رکورد جدید توسط تابع mysql_insert_id به آن مقدار می دهیم. مثال زیر نحوه به کارگیری این متد را نشان می دهد:

    <?php
    include_once('class-DO_User.php');

    $user      = new DO_User();
    $user->firstName = 'Jane';
    $user->lastName  = 'Doe';
    $user->email   = 'jane.doe@example.com';

    $user->insert();
    ?>
    <html>
      <head>
        <title>INSERT Example</title>
      </head>
      <body>
        <p>The user was added to the User table.
        The userId is: <?=$user->userId?></p>
      </body>
    </html>

    در مثال بالا ابتدا یک شیء از نوع DataObject را نمونه سازی می کنیم.سپس متغیرهای لازم را مقداردهی کرده و تابع insert را فراخوانی می کنیم. ما می توانیم با به کارگیری توام دو متد get و insert یک رکورد را کپی کنیم. می توانیم ابتدا یک تغییر جزئی در مقادیر بدهیم(مثلا آدرس ایمیل را عوض کنیم) و سپس رکورد را کپی کنیم:

    <?php
    include_once('class-DO_User.php'    );
    $user = new DO_User    ();

    // Again just using a literal int for now.
    $user->get(5    );

    // Change the email address in the DataObject
    // NOTE: This doesn't affect the DB at all,
    // just the value in the DataObject
    $user->email = 'jdoe@example.com'    ;

    // Next, we call insert() to create a NEW record in the User table
    $user->insert    ();

    ?>
    <html>
      <head>
        <title>Copy Row INSERT Example</title>
      </head>
      <body>
        <p>The user was copied to the User table.
        The userId is: <?=$user->userId?></p>
      </body>
    </html>

    مثال بالا نشان می دهد که با به کارگیری DataObject چقدر کار تعامل با پایگاه داده،آسان می شود.

    بروز رسانی رکوردها(UPDATE)

    بازیابی یک رکورد،تغییر بعضی مقادیر و افزودن آن به صورت یک رکورد جدید کار ارزشمندی است اما در اکثر مواقع، شما نیاز به UPDATE کردن یک رکورد دارید.در این جا متدی به نام update به کلاس خود اضافه می کنیم:

    public function update()
    {
          $sql =     "UPDATE User SET
      firstName='"     . mysql_escape_string($this->firstName) .     "',
      lastName='"      . mysql_escape_string($this->lastName)  .     "',
      email='"       . mysql_escape_string($this->email)   .     "'
      WHERE
      userId="       . mysql_escape_string($this->userId    );

          mysql_query($sql    );
    }

    این متد بسیار شبیه متد insert است.به مثال زیر توجه کنید:

    <?php
    include_once('class-DO_User.php');
    $user = new DO_User();

    // Again just using a literal int to get a row.
    $user->get(5);

    // Change the email address
    $user->email = 'janedoe@example.com';

    // Perform the update
    $user->update();

    ?>
    <html>
      <head>
        <title>UPDATE Example</title>
      </head>
      <body>
        <p>The user updated. The userId is: <?=$user->userId?></p>
      </body>
    </html>

    حذف سطرها(DELETE)

    در اینجا تابعی با نام delete به کلاس خود اضافه می کنیم:

    public function delete()
    {
          $sql =     "DELETE FROM User
      WHERE
      userId="     . mysql_escape_string($this->userId    );

          mysql_query($sql    );
    }

    کار کردن با delete مشابه update می باشد.این متد هم از فیلد کلید اولی یعنی userID استفاده می کند.

    ارزش DataObject ها وقتی مشخص می شود که با آنها کار کنید! در قسمت بعدی به متدهای پیچیده تر برای بسط کلاس خود می پردازیم.
    1383-08-16 ساعت 13:42:16
    كار با Data Object ها در php5-قسمت1

    امروزه کار با database یکی از مسائل روزمره برنامه نویسان وب به شمار می آید،از یک پردازش ساده فرم گرفته تا برنامه های کاربردی در مقیاس بزرگ(large-scale). تقریبا در اکثر موارد از database استفاده می کنیم. بعد از کارکردن روی چند پروژه، زمان زیادی طول نخواهد کشید که متوجه می شوید،چهار عمل اصلی ساده در کار با database به طور مرتب تکرار می شوند.این اعمال عبارتند از:

    • پیداکردن و انتخاب رکوردها(SELECT)
    • به روزرسانی رکوردهای جاری(UPDATE)
    • افزودن رکوردهای جدید(INSERT)
    • حذف رکوردها(DELETE)

    شما در جاهای مختلف برنامه مجبورید که یک Query را بازنویسی کرده و یا آن را از قسمت های قبلی برنامه Copy-Paste کرده و سپس تغییرات لازم را روی آن اعمال کنید.عده ای از برنامه نویسان ترجیح می دهند که از یک لایه انتزاعی(Abstraction Layer) مثل PEAR::DB و یا DBX استفاده کنند.استفاده از یک لایه انتزاعی چیز خوبی است اما هدف اصلی در آن ،این است که RDMBS را محو کند یا به اصطلاح Transparent سازد و برنامه شما مستقل از RDMBS شود.یک لایه انتزاعی، راهی برای مجردسازی(abstraction) ساختارdatabase شما ازائه نمی دهد. اینجاست که یک لایه دسترسی مجزا می تواند مفید واقع شود.شما می توانید لایه دسترسی داده دا از راههای مختلف پیاده سازی کنید، اما در این مقاله، توجه ما معطوف به Data Object ها می باشد. مفهوم Data Object برگرفته از الگوهای طراحی به خوبی مستند شده( very well-documented design p a tterns) به نام Data Access Object و الگوهای شیء انتقال(Transfer Object) است.این الگوها می توانند بسیار پیچیده باشند،اما با کمی تفکر می توانیم به راحتی از ایده ها و اهداف پایه ای آنها در php5 استفاده کنیم.

    *یک شیء داده(Data Object) چیست؟

    همانطور که ذکر شد، ایده Data Object برگرفته از یک الگوی طراحی است.اگر نگاهی به الگوهای طراحی کنید، متوجه می شوید که تقریبا اغلب آنها بر مبنای شیءگرایی (object orienta tion)هستند. در این جا می خواهیم از مدل شی ای جدید php5 استفاده گسترده ای داشته باشیم.همچنین برای مثالهای خود از MySQL استفاده می کنیم.

    در اصل،هرData Object یک کلاس کدنویسی شده است که یک table را در database شما به طور مستقیم مشخص می کند.برای هر table یک کلاس خاص می نویسیم.کلاس،شامل متغیرهای عضو(مطابق با فیلدهای جدول) و مجموعه ای از توابع یا متدها(حداقل برای انجام ۴ عمل اصلی ذکرشده)می باشد.فرض کنید یک جدول ساده برای نگهداری مشخصات کاربر داریم:

    TABLE: User
    userId INT
    firstName VARCHAR(30)
    lastName VARCHAR(40)
    email VARCHAR(100)

    برای این جدول کلاسی تعریف می کنیم که شامل متغیرهای عضو مطابق با فیلدهای جدول باشد.بهتر است که برای Data Object خود یک پیشوند بگذاریم(مثل DO_)تا آن را با کلاسهای هم نام دیگر اشتباه نگیریم.(این یک الگوی رایج در php برای شبیه سازی namespae ها می باشد)

    class DO_User {
      public     $userId    ;
      public     $firstName    ;
      public     $lastName    ;
      public     $email    ;
    }

    مثال بالا یک سطر ساده از جدول را نشان می دهد.اگر یک شیء Do_user را نمونه سازی(instantiate) کنیم،می توانیم یک سطر از داده ها را نگهداری کنیم.حالا چطور اطلاعات را از database واکشی کرده و در این شیء ذخیره کنیم؟ برای این کار یک متد جدید به نام ()get به کلاس خود اضافه می کنیم تا از database برای یک کاربر خاص Query بگیریم. ما از userID(کلید اولیه) هر کاربر به عنوان پارامتر استفاده می کنیم:

     class DO_User {
      public     $userId    ;
      public     $firstName    ;
      public     $lastName    ;
      public     $email    ;

          // This function will perform a select on the table looking for
        // a specific userId.
          public function get($userId    )
      {
            $sql =     'SELECT * FROM User WHERE userId='
                     . mysql_escape_string($userId    );
            $rs  = mysql_query($sql    );
            $row = mysql_fetch_array($rs    );

            $this->userId  = $row['userId'    ];
            $this->firstName = $row['firstName'    ];
            $this->lastName  = $row['lastName'    ];
            $this->email   = $row['email'    ]
      }
    }

    حالا با استفاده از این Data Object می توانیم با database خود تعامل داشته باشیم.هیچ نیازی با استفاده از SQL نیست.مثال زیر اطلاعات مربوط به یک کاربر را دریافت و در Web Browser نمایش می دهد:

    <?php
    include_once('class-DO_User.php');
    $user = new DO_User();

    // We'll use a literal integer here,
    // but this could come from anywhere,
    // such as $_POST or $_GET
    $user->get(5);

    ?>
    <html>
      <head>
        <title>User Info</title>
      </head>
      <body>
        <p>Here is the user info:</p>
        <table border="1">
          <tr>
            <td>User ID</td>
            <td>    <?=$user->userId?></td>
          </tr>
          <tr>
            <td>First Name</td>
            <td>    <?=$user->firstName?></td>
          </tr>
          <tr>
            <td>Last Name</td>
            <td>    <?=$user->lastName?></td>
          </tr>
          <tr>
            <td>Email</td>
            <td>    <?=$user->email?></td>
          </tr>
        </table>
      </body>
    </html>

    همانطور که مشاهده می کنید استفاده از یک Data Object بسیار ساده است. تابع ()get ای که اضافه کردیم یک Query ساده را انجام می دهد و یک کلید اولیه مشخص(userID ) جستجو می کند. توجه کنید که چون از فیلد با کلید اولیه استفاده کردیم، تنها یک رکورد از داده ها را دریافت می کنیم و مقادیر آنها را در متغیرهای عضو کلاس قرار می دهیم.در قسمت های بعدی در مورد دریافت چند سطر از رکوردها نیز بحث خواهیم کرد.
    1383-08-11 ساعت 23:24:26
    چگونه CMS مورد نظر خود را انتخاب كنيم؟

    با توجه به رشد روزافزون برنامه هاي مديريت محتوا(CMS) انتخاب بهترین CMS بر اساس نیازهای کاربران کمی مشکل شده است.مطلب زیر، برگرفته از سایت OpenSourceCMS است و ۵ مرحله را برای انتخاب CMS مورد نظر بیان می کند:

    ۱. قبل از هر چیز باید مشخص کنید که قصد ایجاد چه نوع سایتی را دارید؟ آیا سایت شما Portal است و براساس روابط متقابل کاربر و مدیران سایت است؟ آیا سایت شما تنها یک Weblog است و شامل نوشته های روزمره می شود؟ آیا یک سایت آماری با هدف اطلاع رسانی می خواهید؟ آیا سایت شما یک محیط برای انجام یک پروژه تیمی است؟

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

    ۲. گام بعدی این است که مشخص کنید چه ویژگی ها و امکاناتی مورد نیاز شما است؟ آیا قصد نمایش اطلاعات به صورت پویا(Dynamic) را دارید ویا ایستا(Static)؟ آیا نیاز به یک تقویم وقایع و رویدادها دارید؟آیا نیاز به یک بخش Upload/Download دارید؟ آیا یک آلبوم تصاویر هم می خواهید؟ آیا به یک سیستم نظرسنجی و برآورد نیاز دارید؟ آیا نیاز به یک تابع ترجمه دارید؟

    موارد بالا Modules یا Plug-ins نامیده می شوند و عموما به صورت امکانات افزودنی(Add-ons) به هسته سیستم هستند.(بعضی مواقع این امکانات در سیستم مبنا فراهم شده اند) بیشتر سیستم های عرضه شده از Module های متعددی پشتیبانی می کنند اما ممکن است این امکانات جاری در نسخه های بعدی سیستم پشتیبانی نشوند و سازگار با تغییرات نباشند(Incompatible)! تنها پشتیبانی از Module مورد نظر شما کافی نیست بلکه باید توجه کنید که چطور امکانات مورد نظر شما کار می کنند؟آیا خواسته های شما را برآورده می کنند؟ گروههای مختلف یک ویژگی را از راههای مختلف پیاده سازی می کنند! نکته کلیدی در اینجا آزمایش است زیرا بهترین راه حل برای آگاهی از قابلیت های یک سیستم است.

    ۳.حالا که سیستم مبنا و Module های مورد نیاز خود را مشخص کردید،باید به نحوه نمایش سایت خود دقت کنید(Presentation). در حال حاضر بیشتر CMS ها امکان استفاده از CSS و Template را فراهم می آورند که این امکان را به شما می دهند که به سرعت ظاهر سایت خود را تغییر دهید.(Site Skin) محتویات مشابه با ظواهر مختلف می توانند یک منظره کاملا دراماتیک را ترسیم کنند! این منظره می تواند خیلی جذاب باشد ویا برعکس. همه چیز به تصور شما بستگی دارد! خبر خوب این است که اگر شما فردی خلاق یا هنرمند نیستید،نباید غصه بخورید زیرا منابع متعددی در اطراف شما وجود دارد که می تواند به شما کمک کنند! این منابع به صورت Template هایی هستند که توسط افرادی خلاق طراحی شده اند و در دسترس عموم قرار داده شده اند. شما می توانید این قالب ها را Download کرده به سایت خود اضافه کنید و با این کار رنگ و بوی تازه ای به سایت خود بدهید!

    ۴. حالا که لایه نمایش سایت خود را تعریف کردید باید روی محتویات سایت خود تمرکز کنید.محتوا خیلی خیلی مهم است! بدون محتوا، هر چقدر هم که سایت زیبایی داشته باشید، فایده ای ندارد! سایت شما بی فایده است، هیچ کاربری حاضر نمی شود برای بار دوم به سایت شما سر بزند و کم کم سایت شما محو می شود! اطلاعات می تواند به فرم های مختلفی ارائه شود. ممکن است مطالب کاربردی باشد یا مطالب طنز یا مطالب علمی و یا حتی چگونگی ساخت یک تله موش بهتر!

    محتوای خوب باعث جذب مخاطب می شود(شبیه یک شکلات که به بچه های کوچک می دهید!) اگر یک سایت خبری دارید، داشتن امکان تبادل اطلاعات با منابع دیگر از طریق RSS مهم است.بسته به نوع سایت شما امکانات محتوایی مختلفی مطرح می شود.

    ۵. حالا که تمام مراحل بالا را انجام داده اید، فقط یک قدم می ماند و آن نگهداری(maintenance) و تجدید(renewal) سایت است. با گذشت زمان چه اتفاقی بر روی محتوای قدیمی می افتد؟ آیا آنها آرشیو می شوند و یا در دسترس می مانند؟ آیا این امکان وجود دارد که در صورت خرابی Server تمام سیستم بر روی یک محیط مجزا بازسازی مجدد(Restore) شوند؟ آیا امکان گرفتن نسخه پشتیبان (Backup) در سیستم وجو دارد یا این کار باید به صورت دستی صورت بگیرد؟

    هر CMS ای با روش خود این مساله را حل می کند.برای اطلاع از این امکانات در CMS های مختلف ،بهتر است که با مدیران سایت های دیگر که تجربه بیشتری دارند مشورت کنید . باید از امروز به فکر آینده باشید!
    1383-08-01 ساعت 23:57:42
    << 1 2 3 4 5 6 7 8 9 10 >>
    ﻿
    « | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
    لينك هاي روزانه

    BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
    مطالب اخير
    ﻿
    Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
    آرشيو ماهيانه
    ﻿شهريور1384(1)
    مرداد1384(2)
    تير1384(2)
    خرداد1384(2)
    ارديبهشت1384(4)
    اسفند1383(2)
    بهمن1383(1)
    آذر1383(2)
    آبان1383(4)
    مهر1383(8)
    تير1383(4)
    خرداد1383(1)
    ارديبهشت1383(9)
    فروردين1383(5)
    آرشيو موضوعي
    ﻿اينترنت [2]
    كدهاي كاربردي [5]
    PHP [7]
    MySQL [5]
    برنامه هاي كمكي [7]
    برنامه هاي بازمتن [11]
    عمومي [6]
    روش هاي طراحي [4]
    لينك هاي ثابت
    [ phpmystery ]
    FarsTec
    PersianLinux
    Mohsen's Weblog
    MajidOnline
    techno-graph
    IranASP.NET
    P30World
    Virtualife
    w3schoolsir
    NetKadeh
    techopedia
    Meganit
    ITIran
    Fantazio
    Gonahkar
    IProDev
    IRANETSOL
    IFlashDes
    Oxygenws
    jooti's Blog
    Behrooznp
    WinBeta
    RADMAN
    پژواک
    AlvanWeb
    .:: OutLivE ::.
    IranPHP
    IranAMP
    Sheida
    Ali Masoudi
    SoltoonOnline
    Ashoob
    چشمان باز
    ParsMedia
    Fexon
    جستجو
    ﻿ search

    سايت هاي php
    PHP.Net
    PHP-Editors
    PHPKitchen
    PHPBuilder
    PHPArchitect
    PHPMagazine
    PHPDevNetwork
    DevShed
    SitePoint
    DotGeek
    Planet-PHP
    PHPResorceIndex
    تماس با ما
    khalili.a [at] gmail [dot] com
    آمار بازديدها

    34 | امروز:
89 | ديروز:
77158 | كل:
    مراجعه كنندگان
    free-composable-ringtones-for-alcatel.nifigase.info
    free-composable-ringtones-for-alcatel.nifigase.info
    free-composable-ringtones-for-alcatel.nifigase.info
    who-sells-samsung-cell-phones.nifigase.info
    who-sells-samsung-cell-phones.nifigase.info

    Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
آشنايي با Prado Framework

PRADO یک چارچوب(framework) برای ساخت برنامه های کاربردی تحت وب در PHP 5 می باشد. نحوه کار Prado برمبنای رویدادها(event-driven) و مولفه های آماده(component-based) می باشد.ساخت یک Web Appllication توسط Prado شامل مراحل زیر است:

  • نمونه سازی از مولفه های از قبل ساخته شده(instantiating prebuilt component types)
  • پیکربندی آنها توسط تنظیم ویژگیهای آنها(setting their properties)
  • پاسخ به رویدادهای مربوط به آنها با نوشتن توابع اداره کننده رویداد(handler functions)
  • قرار دادن مولفه ها در صفحات مورد نظر

روند طراحی در PRADO بسیار شبیه ابزارهای توسعه سریع(RAD toolkits) مثل Delphi و Visual Basic می باشد. برای درک نحوه کار Prado Framework ،فرض کنید که می خواهیم یک صفحه ورود کاربران(login page) بسازیم.مراحل زیر را دنبال می کنیم:

  1. از دو مولفه TTextBox و یک مولفه TButton برای دریافت ورودی نام کاربر،رمز عبور و دکمه submit استفاده می کنیم.
  2. خصوصیت TextMode مربوط به مولفه رمز عبور را با Password تنظیم می کنیم.
  3. یک تابع login برای رویداد OnClick مولفه دکمه می نویسیم.
  4. این مولفه های آماده را در یک صفحه با قالب مشخص قرار می دهیم.

شیوه کار Prado ، تفاوت های بسیاری با شیوه برنامه نویسی سنتی در php دارد. در شیوه معمول،برنامه سازان، ابتدا دستورات لازم برای ساخت فرم وب را با HTML کدنویسی می کنند و سپس با استفاده از روش ارسال به صورت POST یا GET اطلاعات مربوطه را پردازش می کنند. اما شیوه کاری Prado بر اساس مدل برنامه سازی در ASP.NET می باشد و بر مبنای استفاده از مولفه های آماده برای جلوگیری از تکرار کدنویسی است. مزایای استفاده از Prado عبارتند از:

  • قابلیت استفاده مجدد از مولفه های از پیش نوشته شده(reusability)
  • سادگی کار ساخت برنامه(ease of use)
  • بازدهی بالا(performance)
  • استفاده از ویژگی های شی گرایی در PHP5 مثل مدیریت خطاها(error handling )
  • مناسب برای پروژه های تیمی(team integration)

Prado بر روی سیستم های عامل Windows XPو Redhat Linux با موفقیت آزمایش شده است. Prado 1.5 با حجم ۱.۰۳ مگابایت از اینجا قابل دریافت است. برای آشنایی با نحوه کار Prado به اینجا مراجعه کنید.این چارچوب برای شرکت در Zend PHP5 Contest نوشته شده است. به هر حال هرکس سلیقه ای خاص خود دارد ومختار است که در چارچوب دلخواه خود برنامه بنویسد!
1383-07-27 ساعت 21:24:24
چگونه 1000 مگابايت GMail را پر كنيم؟!

اگه به شما یک گیگابایت فضای رایگان روی اینترنت داده بشه،چیکار می کنید؟ قطعا، اولین چیزی که به ذهنتون میرسه اینه که چطوری پرش کنید و نهایت استفاده رو از اون ببرید!

با اومدن پدیده ای به نام GMail ، برنامه نویسان وب به سرعت دست به کار شدند و به فکر استفاده از این فضای رایگان افتادند.برای نمونه می شه از GMail FS برای لینوکس و GMail Drive shell extension برای ویندوز نام برد. در این قسمت قصد دارم برنامه ای رو به اسم Goollery معرفی کنم که با PHP نوشته شده و باعث میشه که به نیمه خالی لیوان GMail توجه بیشتری کنید!

Goollery is a GMail based photo gallery. You can upload pictures from a website. The pictures will automatically be stored in your gmail accout.

Goolley یک برنامه آلبوم تصاویر است که از فضای رایگان GMail برای ذخیره تصاویر خود استفاده می کند.برای استفاده از این برنامه به امکانات زیر نیاز دارید:

  • GMail account
  • PHP
  • *libmailer (gmail-lite project)
  • ImageMagick

*GMailer یا libgmailer یک کلاس PHP می باشد که به شما این امکان را می دهد تا از طریق اسکریپت های PHP به GMail دسترسی داشته باشید.برای کسب اطلاعات بیشتر در مورد GMailer اینجا را کلیک کنید.

نسخه آزمایشی Goolley در اینجا قابل مشاهده است. یکی از اشکالات این برنامه سرعت بسیار پایین آن است که طبیعی است! این برنامه هنوز در مرحله آزمایش است و به گفته طراحان آن:This is just a proof on concept!
این برنامه از اینجا قابل دریافت است.
1383-07-19 ساعت 21:57:24
توابع جديد در PHP 5

امروز که داشتم لیست توابع جدید اضافه شده در PHP 5 را می دیدم متوجه توابع کاربردی جالبی شدم که تصمیم گرفتم چند تا از اونا رواینجا معرفی کنم:

تابع array_combine یکی از این توابع می باشد که دو آرایه را به عنوان ورودی می پذیرد و سپس با ترکیب این دو آرایه یک آرایه جدید می سازد و آن را برمی گرداند،بدین صورت که آرایه اول به عنوان اندیس ها (Keys) و آرایه دوم به عنوان مقادیر (Values) آرایه جدید می باشد.اگر طول دو آرایه ورودی با هم برابر نباشد یا خالی باشند، این تابع مقدار FALSE را بر می گرداند.به مثال زیر توجه کنید:

$a = array('green', 'red', 'yellow');
$b = array('avocado', 'apple', 'banana');
$c = array_combine($a, $b);

print_r($c);

خروجی:

Array
(
    [green]  => avocado
    [red]    => apple
    [yellow] => banana
)

تابع کاربردی دیگرarray_walk_recursive  می باشد. این تابع دو پارامتر ورودی دارد:اولی یک آرایه و دومی یک تابع . نحوه کار این تابع بدین صورت است که به همه اعضای آرایه دریافتی،تابع ورودی(پارامتر دوم) را به صورت بازگشتی اعمال می کند.این تابع در صورت اجرای موفق مقدار TRUE و در غیر این صورت FALSE را برمی گرداند. نکته مهم در استفاده از این تابع این است که پارامتر اول این تابع یعنی آرایه مورد نظر به صورت ارجاع مستقیم است و تغییرات اعمال شده مستقیما بر خود آرایه اثر می کنند و مقادیر آن را تغییر می دهند. برای فهم بهتر به مثال زیر توجه کنید:

$sweet = array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');

function test_print($item, $key)
{
    echo "$key holds $item ";
}

array_walk_recursive($fruits, 'test_print');

خروجی:

a holds apple
b holds banana
sour holds lemon

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

1383-07-15 ساعت 19:55:06
كاملترين مجموعه نصب PHP روي Windows!?

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

WinLAMP: WinLAMP Is Not LAMP یکی از کاملترین بسته های ارائه شده برای نصب PHP می باشد. این بسته نرم افزاری شامل ابزارهای اضافی مختلفی برای کار با MySQL می باشد.از جمله این ابزارها می توان به DBManager ، MySQL -Front و SQLyog اشاره کرد.

(WinLAMP? Windows+Apache+MySQL+PHP is not Linux+Apache+MySQL+PHP: WinLAMP)

برنامه نصب کننده winlamp حجمی حدود ۶۰ مگابایت دارد ولی شامل بیش از ۱۴۴ مگابایت برنامه های به درد بخور است.این برنامه از اینجا قابل دریافت است.

این برنامه شامل جدیدترین راهنمای (manual) استفاده PHP-MySQL-Apache نیز می باشد که مورد نیاز هر برنامه ساز PHP می باشد.اگر امکان دریافت این برنامه را دارید حتما امتحانش کنید و آن را با برنامه های دیگر مقایسه کنید!
1383-07-12 ساعت 07:50:30
تقويم هجري شمسي در PHP

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

این تقویم از توابع تبدیل تاریخ میلادی به جلالی (jdf) که توسط گروه پروژه های فارسی ارائه شده،استفاده می کند. فایل مربوط به تقویم از اینجا قابل دریافت است.

توضیحی در مورد کد برنامه: کدنویسی این برنامه کار ساده ای است. برای ساخت جدول تقویم،باید ابتدا اولین روز هر ماه را پیدا کنیم و سپس به اندازه آن در جدول خانه خالی درج کنیم(توجه کنید که هر سطر جدول ۷ ستون دارد ) در ادامه بسته به ماه مربوطه(۳۱،۲۹ و یا ۳۰ روزه) بقیه روزها را در جدول درج می کنیم و جدول را می بندیم.(فقط مساله ای که وجود دارد سالهای کبیسه مثل امسال است که باید لحاظ شود.) برای حرکت بین ماههای مختلف از ارسال پارامترها به روش GET استفاده می کنیم. این توضیح کلی نحوه ساخت تقویم جلالی بود.برای مشاهده جزئیات کار به کد منبع برنامه مراجعه کنید.

1383-07-09 ساعت 10:34:29
<< 1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

35 | امروز:
89 | ديروز:
77159 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
روز از نو روزي از نو

سلام.چند وقتی بود که ننوشته بودم.علتش هم بیشتر دغدغه هایی بود که هنوز هم ادامه داره و سیر صعودی خودشو طی می کنه! با اومدن ماه مهر، دانشگاه و پاس کردن واحدهای درسی هم به مجموعه مشکلات اضافه شدند. هفته پیش فرصتی پیدا کردم که بشینم و چند خطی برنامه PHP بنویسم.حاصل این فرصت خالی،یک سیستم وبلاگ جدید بود که مرا بر آن داشت که دوباره وبلاگ PHPRUN رو راه بیندازم! سعی می کنم که هر وقت فرصتی پیدا کردم وبلاگ رو به روز کنم و مطالبی از برنامه نویسی تحت وب بنویسم. ضمنا این وبلاگ قابلیت چند کاربره بودن رو هم داره.بنابر این از همه دوستانی که مایلند مقالات و مطالبشون رو در اینجا منتشر کنند و عضو phprun شوند، دعوت به همکاری به عمل می آید!(دوستان علاقمند، مشخصات خودشونو در نظرات بنویسند تا برای آنها شناسه کاربری درست کنم)
1383-07-07 ساعت 19:17:28
آشنايي با ext/mysqli در PHP5-قسمت اول

چرا از ext/mysqli استفاده کنیم؟

يكي از ويژگي هاي جالبي كه در 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 كنيد و از اين به بعد با اين ماژول كار كنيد:

    1. سرعت بيشتر
    2. امنيت بيشتر

حرف i در انتهاي ext/mysqli به معناي ,improved, interface, ingenious, incompatible incomplete مي باشد!
1383-07-05 ساعت 10:25:26
آشنايي با ext/mysqli در PHP5-قسمت دوم

نحوه کار با 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
", 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:
");

/* Fetch the results of the query */
while( $row = mysqli_fetch_assoc($result) ){
printf("%s (%s)
", $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
", 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:
");

/* Fetch the results of the query */
while( $row = $result->fetch_assoc() ){
printf("%s (%s)
", $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
", 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.
", $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.
", $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
", 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
", $col1, $col2);
}

/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();

?>
1383-07-05 ساعت 09:19:26
Jetbox : مدیریت محتوا با استفاده ازBox ها

Jetbox یکی دیگر از سیستم های مدیریت محتوا(CMS) تحت وب می باشد که توسط php و MySQL نوشته شده است.این برنامه تحت مجوز GPL و مجانی می باشد. Jetbox یک سیستم Portal محسوب نمی شود زیرا امکانات خیلی کمی برای ارتباط متقابل کاربران و مدیران سایت فراهم می کند . از امکانات برجسته این نرم افزار می توان رابط گرافیکی قدرتمند بخش مدیریت(Control Panel) آن را نام برد که بسیار استادانه و زیبا طراحی شده است. JetBox یک برنامه Module Oriented به شمار می آید. این سیستم مدیریت محتوا از کتابخانه هایی مثل JPGraph و phpdig و phpthumb و ... بهره می برد که پشتوانه محکمی را برای این برنامه ایجاد کرده اند. شاید مهمترین ویژگی این برنامه همانطور که از اسم آن معلوم است ٬ قالب پذیر بودن آن باشد. شما می توانید به تعداد دلخواه Box به صفحه وب خود اضافه کنید و به مدیریت محتوای این BOX ها بپردازید. از جمله ماژول های پیش فرض در این برنامه می توان به News - Links-Contacts-Events اشاره کرد. جدیدترین نسخه این برنامه(۲.۰.۸) با حجم ۱.۳۲ مگابایت از اینجا قابل دریافت است. برای کسب اطلاعات بیشتر در مورد JetBox به اینجا مراجعه کنید.
1383-04-23 ساعت 22:48:25
ساخت يك كلاس Timer ساده

در اين قسمت به ساخت يك كلاس Timer مي پردازيم كه كاربردهاي زيادي مي تواند داشته باشد.براي مثال براي اندازه گيري زمان ايجاد يك صفحه (Page Generation Time) كه در آن Query هاي زيادي وجود دارد، مي توان از اين كلاس استفاده نمود و با بهينه سازي اين Query ها، زمان ايجاد صفحه را كاهش داد. در زير كد مربوط به اين كلاس آورده شده است:

 // Class:     microTimer
// Description: calculates the micro time

class microTimer {
    function start() {
        global $starttime;
        $mtime = microtime ();
        $mtime = explode (' ', $mtime);
        $mtime = $mtime[1] + $mtime[0];
        $starttime = $mtime;
    }
    function stop() {
        global $starttime;
        $mtime = microtime ();
        $mtime = explode (' ', $mtime);
        $mtime = $mtime[1] + $mtime[0];
        $endtime = $mtime;
        $totaltime = round (($endtime - $starttime), 5);
        return $totaltime;
    }
}
تحليل كد: اين كلاس دو متد (تابع عضو) شروع و پايان دارد كه دقيقا كار يك زمان سنج را انجام مي دهد. تابع ()microtime يكي از توابع پركاربردphp مي باشد كه زمان را به صورت رشته"msec sec" بر مي گرداند كه sec زمان جاري اندازه گيري شده از مبدا زمان UNIX مي باشد.(0:00:00 January 1, 1970 GMT)
msec هم بخش مربوط به مايكرو ثانيه مي باشد. توسط تابع explode و مشخص كردن كاراكتر جداكننده اين دوبخش را از هم جدا مي كنيم و در آرايه اي قرار مي دهيم. با جمع كردن اين دو بخش، زمان جاري را به صورت مايكرو ثانيه بدست مي آوريم. پارامتر دوم تابع ()round ،مشخص مي كند كه عدد اعشاري مورد نظر تا چند رقم round شود.
استفاده از كلاس Timer :براي اندازه گيري زمان ايجاد يك صفحه، در ابتداي آن كد زير را مي نويسيم و يك Object از روي class خود ايجاد مي كنيم:
 //در قسمت آغازين كد برنامه شما
$Timer = new microTimer;
$Timer->start();
در انتهاي برنامه خود هم تابع stop از كلاس Timer را فراخواني مي كنيم:
 //در انتهاي كد برنامه
echo"<!-- execution time: ".$Timer->stop()." -->";

1383-04-09 ساعت 22:47:25
<< 1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

36 | امروز:
89 | ديروز:
77160 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
نمايش ۵ مراجعه کننده آخر سايت

در این قسمت به ساخت برنامه ای برای نمایش مراجعه کننده آخر سایت می پردازیم. با استفاده از php و MySQL نوشتن این برنامه بسیار ساده است. قبل از هر کاری باید یک Table ساده درست کنیم تا لینک های ورودی را در آن ذخیره کنیم. ساختار Table ما به صورت زیر است:

 <!-- create the following table in phpmyadmin -->

CREATE TABLE referers (
id INT (10) not null AUTO_INCREMENT,
site VARCHAR (255),
time INT (10),
PRIMARY KEY (id)
);
حالا به نوشتن اصل برنامه می پردازیم .ادیتور خود را باز کرده، کد زیر را در آن وارد کنید وآن را با نام refs.php ذخیره کنید:

<?php

$db_host = "localhost";
$db_username = "username";
$db_password = "password";
$db_name = "database_name";

$ref = $_SERVER['HTTP_REFERER'];
$domain = explode("www.", $_SERVER['SERVER_NAME']);

mysql_connect($db_host,$db_username,$db_password) or die(mysql_error());
mysql_select_db($db_name) or die(mysql_error());

if ($ref != "")
{
if (!eregi($domain[1], $ref))
{

    $time = time();

    $addref = "INSERT INTO referers (site, time) VALUES ('$ref', '$time')";
    mysql_query($addref);
  }
}

function show_refs()
{
   $getref = "SELECT * FROM referers ORDER BY time DESC LIMIT 5";
   $reflist = mysql_query($getref);

   echo "<b>Last 5 Referers:</b><br>\n";

   while($r=mysql_fetch_array($reflist))
{
   $site = $r['site'];

   echo "<a target=\"_blank\"  href= \"$site\" >$site</a><br>\n ";
  }
}

?>
تحلیل کد:محور اصلی این برنامه،استفاده از متغیر $_SERVER['HTTP_REFERER'] می باشد.
این متغیر، آدرس سایتی را که کاربر از طریق آن وارد سایت ما شده است را،در بر دارد. نکته ای که در برنامه باید رعایت شود،مساله کاربران خودی( کاربرانی که در حال گردش در سایت ما می باشند) است. با استفاده از متغیر $_SERVER['SERVER_NAME'] و انجام یک مقایسه ساده،از نمایش آدرس وب سایت خود جلوگیری می کنیم. تابع explode برای جداسازی از یک رشته استفاده می شود، پارامتر اول تابع به عنوان جدا کننده(seperator) می باشد.نتیجه به عنوان یک آرایه از رشته های جدا شده برگردانده می شود. بقیه برنامه،یک INSERT ساده و یک SELECT با محدودیت 5 رکورد می باشد.

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

 // add this to the top of your homepage

<?  include("refs.php");  ?> ?>

سپس تابع show_refs را در محل مناسب برای نمایش ،فراخوانی کنید:

 //then where you want to show the list use:

<? show_refs(); ?> ?>
برنامه تمام شد،به همین راحتی! smiley بهتر است که به فکر افزودن امکانات بیشتری به برنامه خود باشید.مثلا یک برنامه ساده برای آمارگیری بنویسید تا با شمردن تعداد لینک های ورودی،شما را از بیشترین مراجعه کنندگان آگاه سازد. یا با به کارگیری متغیرهای Server اطلاعات بیشتری از کاربران خود،کسب کنید.در زیر دو متغیر مهم و کاربردی دیگر معرفی شده اند:

$_SERVER['REMOTE_ADDR'] :The IP address from which the user is viewing the current page.

$_SERVER['HTTP_USER_AGENT']:header from the current request, if there is one. This is a string denoting the user agent being which is accessing the page. A typical example is: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Among other things, you can use this value with get_browser() to tailor your page's output to the capabilities of the user agent.

1383-02-21 ساعت 22:37:25
PDML: زبانی برای ساخت اسناد PDF

PDML مخفف Portable Document Markup Language می باشد و یک زبان غیر رسمی(Informal) نشانه گذاری می باشد که ۱۰۰٪ توسط PHP نوشته شده است.این زبان به افراد آشنا به HTML اجازه می دهد که به سادگی اسناد پیچیده PDF درست کنند. همچنین افراد آشنا با PHP می توانند از آن به عنوان روشی برای تعریف قالب هایی(templates) برای اسناد PDF پویا(dynamic PDF documents) استفاده کنند.این زبان جالب، تحت مجوز GPL عرضه شده است و بر پایه یک کلاس PHP معروف به نام FPDF بنا شده است.FPDF کلاسی در PHP می باشد که به شما این امکان را می دهد که با به کارگیری مستقیم PHP، اسنادPDF بسازید.(بدین معنی که لازم نیست از کتابخانه PDFlib استفاده کنید.). مجوز PDFlib بدین گونه است که اگر بخواهید از PDFlib ،استفاده تجاری کنید،باید پول بپردازید! حرف F در ابتدای FPDF معنی FREE بودن آن را می دهد.

PDML هنوز در ابتدای راه است و نسخه نهایی آن عرضه نشده است. نسخه آزمایشی 0.9 آن را می توانید از اینجا دریافت کنید. در این نسخه ، سعی شده است که بیشتر امکانات کلاس FPDF فراهم شود. برای مشاهده چند نمونه برنامه ساده و اولیه سری به اینجا بزنید.
1383-02-19 ساعت 22:32:25
Phuse : جستجوگر مخصوص PHP کارها

Phuse مخفف PHP Unfied Search Engine می باشد.این موتور جستجو مخصوص PHP کارها طراحی شده است.این جستجوگر هنوز در مرحله آزمایش و تکمیل می باشد.شما می توانید نسخه BETAی آن را در اینجا ببینید.در حال حاضر با استفاده از این موتور جستجو می توانید داخل ۵ وب سایت زیر به جستجو بپردازید:

  1. PHPDeveloper.org (news)
  2. PHPComplete.com (tutorials)
  3. EvilWalrus.com (code)
  4. Forums.Devnetwork.net (forums)
  5. PHPClasses.org (classes)

برای کسب اطلاعات بیشتر سری به اینجا بزنید.
1383-02-15 ساعت 22:39:25
استفاده از کتابخانه کلاس ADOdb-بخش دوم

کار با توابع کتابخانه ای ADOdb

برای دریافت نتایج حاصل از عمل SELECT بر روی پایگاه داده،چند روش مختلف وجود دارد،یکی از این روش ها به صورت زیر است:

$sql = "SELECT surname, age FROM employees";
$rs = &$db->Execute($sql);
if (!$rs) {
print $db->ErrorMsg();
}
else {
while (!$rs->EOF) {
print $rs->fields[0].' '.$rs->fields[1].'
';
// fields[0] is surname, fields[1] is age
$rs->MoveNext(); // Moves to the next row
} // end while
} // end else

در مثال بالا rs->fields$ آرایه ای است که شامل نتایج query می باشد.شاخص(index) آرایه به صورت پیش فرض،عددی(numeric) است،اما اگر می خواهید از یک آرایه associative استفاده کنید(آرایه ای که می توان در آن از شاخص های رشته ای استفاده کردassociative نامیده می شود) باید قبل از اجرای query این حالت را به صورت زیر مشخص کنید:

$sql = "SELECT surname, age FROM employees";
$db->SetFetchMode(ADODB_FETCH_ASSOC);
$rs = &$db->Execute($sql);
if (!$rs) {
print $db->ErrorMsg();
}
else {
while (!$rs->EOF) {
print $rs->fields['surname']." ".$rs->fields['age']."
";
$rs->MoveNext(); // Moves to the next row
} // end while
} // end else

راه متداولی که برای دریافت نتایج یک query وجود دارد،دریافت هر سطر به صورت یک object می باشد.ADOdb تابعی به نام FetchNextObject دارد که به صورت خودکار نتایج سطر بعدی را می دهد:

$sql = "SELECT surname, age FROM employees";
$db->SetFetchMode(ADODB_FETCH_ASSOC);
$rs = &$db->Execute($sql);
if (!$rs) {
print $db->ErrorMsg();
}

// loop through results
while ($row = $rs->FetchNextObject()) {
// The field names need to be uppercase
print $row->SURNAME." ".$row->AGE."
";
}

عمل درج(INSERT) بسیار سریع و ساده است:

$sql = "INSERT INTO employees (surname, age) values ('Clegg','43')";
if (!($db->Execute($sql))) {
print 'Error inserting: '.$db->ErrorMsg().'
';
}

مزیت اصلی ADOdb در اینجا این است که اجازه می دهد که با استفاده از یکsyntax یکسان record ها را در پایگاههای داده مختلف درج کنید.(در حالت عادی این کار امکان پذیر نیست!) دو حالت استثنایی در اینجا وجود دارد که باید به آنها توجه کنید:

ا)تمام کاراکترهای quotes باید escape شوند(یک backslash قبل از آنها قرار گیرد)در غیر این صورت با خطای syntax مواجه خواهید شد.بعضی از پایگاههای داده برای درج رشته ها از (') و بعضی دیگر از('') استفاده می کنند،به خاطر این مساله به جای استفاده از تابع ()addslashes در php بهتر است که از تابع کتابخانه ای()qstr در ADOdb استفاده کنید.این تابع یک رشته را دریافت می کند و آن را بر اساس پایگاه داده مناسب فرمت بندی می کند.

۲) پایگاههای داده مختلف از فرمت های متفاوتی برای نوع داده date استفاده می کنند.ADOdb تابعی به نام ()DBDate دارد که یک date را به صورت Unix timestamp و یاISO(Y-m-d) دریافت می کند وآن را تبدیل به فرمت مناسب برای پایگاه داده مورد استفاده شما می کند.در زیر مثالی از به کارگیری این دوتابع آورده شده است:

$employee_surname = $db->qstr("d'Angelo");
$arrival_time = $db->DBDate(time());
// The above two functions also add the enclosing //quotes, so, $arrival_time, not '$arrival_time'
$sql = "INSERT INTO employee_arrival (arrival_time,surname) values ($arrival_time,$employee_surname)";
if (!($db->Execute($sql))) {
print 'Error inserting: '.$db->ErrorMsg().'
';
}

مطالب گفته شده، مطالبی مقدماتی برای آشنایی با روش کار ADOdb بود. از اینجا به بعد همه چیز به شما بستگی دارد! پیشنهاد می کنم که سری به وب سایت PHPEveryWhere بزنید و documentation های کامل این برنامه را مطالعه کنید.(تجربه سالم هیچ ضرری ندارد!)
1383-02-06 ساعت 22:36:25
استفاده از کتابخانه کلاس ADOdb-بخش اول

نصب ADOdb

نصب ADOdb بسیار ساده است. اول مطمئن شوید که نسخهPHP شما 4.0.4 یا بالاتر می باشد،در غیر این صورت حتما به فکرUpgrade کردن نسخه PHP خود باشید. سپس جدیدترین نسخه برنامه ADOdb را از وب سایت PHPEverywhere دریافت کنید. فایل دریافت شده را در یک دایرکتوری دلخواه Unpack کنید.(حتما برنامه را در جایی قرار دهید که دسترسی عمومی نداشته باشد،اگرچه فایلهای ضمیمه ای برنامه پسوند inc.php دارند و نمی توان محتویات آن را به صورت متنی مشاهده کرد!)

با قرار دادن کد سه خطی زیر و جایگزینی متغیرها با مقادیر مناسب،برنامه را تست می کنیم:

include("$adodb_path/adodb.inc.php");
$db = NewADOConnection("$database_type");
$db->Connect("$host", "$user", "$password", "$database_name");

حالا شما یک شیء اتصال به پایگاه داده را با موفقیت درست کرده اید( db$ ). شما می توانستید از ADONewConnection هم به جایNewADOConnection استفاده کنید.این دو نام به یک تابع مشابه اشاره دارد.نوع پایگاه داده(database_type) بستگی به DBMS شما دارد که می تواند یکی از مقادیر زیر باشد:

  • access (Microsoft Access/Jet)
  • ado (Generic ADO, the base for all the other ADO drivers)
  • ado_access (Microsoft Access/Jet using ADO)
  • ado_mssql (Microsoft SQL Server using ADO)
  • db2 (DB2)
  • vfp (Microsoft Visual FoxPro)
  • fbsql (FrontBase)
  • ibase (Interbase 6 or before)
  • firebird (Firebird)
  • informix72 (Informix databases before Informix 7.3)
  • informix (Informix)
  • maxsql (MySQL with transaction support)
  • mssql (Microsoft SQL Server 7)
  • mssqlpo (Portable mssql driver)
  • mysql (MySQL without transaction support)
  • mysqlt (MySQL with transaction support, identical to maxmysql)
  • oci8 (Oracle 8/9)
  • oci805 (Oracle 8.0.5)
  • oci8po (Oracle 8/9 portable driver)
  • odbc (Generic ODBC, the base for all the other ODBC drivers)
  • odbc_mssql (MSSQL via ODBC)
  • odbc_oracle (Oracle via ODBC)
  • oracle (Oracle 7)
  • postgres (PostgreSQL)
  • postgres64 (PostgreSQL 6.4)
  • postgres7 (PostgreSQL 7, currently identical to postgres )
  • sqlanywhere (Sybase SQL Anywhere)
  • sybase (Sybase)

    • اگر در اتصال به پایگاه داده با مشکل مواجه شده اید، حتما مسیر(path) برنامه و مقادیر سایر پارامترهای اتصال را چک کنید.پیشنهاد می کنم قبل از این کار، بدون به کارگیریADOdb یکبار اتصال خود را چک کنید.( ممکن است این چیزها واضح به نظر برسد اما توجه کنید که بیشتر وقت ما صرف درگیری با همین چیزهای واضح است پس قبل از شروع کار بیایید خیالمان را از بابت این چیزها راحت کنیم!)

    اتصال به پایگاه داده در برنامه های شما

    قبل از اینکه با عجله شروع کنید و چند خط بالا را به بالای تمام برنامه های خود اضافه کنید،بهتراست که یک قدم به عقب بردارید.هدف این کتابخانه این است که برنامه های کاربردی شما را انعطاف پذیر(flexible) و انتقال پذیر(portable) سازد،بنابر این باید به پارامترهای اتصال و مسیر برنامه ،توجه خاص داشت.مثلا اگر رمز عبور شما تغییر کرد، مجبور نباشید که در تک تک فایلها تغییر را اعمال کنید. پس بهتر است که اطلاعات مربوط به اتصال و مسیر برنامه را در يك فایل مجزا بنویسیم وآن فایل(در اینجا به نام db_data) را هم به صفحات خود ضمیمه کنیم:

    $database_type="mysql";
    $host = "localhost";
    $user = "username";
    $password = "password";

    $adodb_path = "مسير برنامه";

    ?>

    شما همچنین می توانید فایل db_data.inc.php را به صورت خودکار به همه برنامه های خود اضافه کنید.برای این کار به سراغ PHP.INI رفته و خط زیر را به آن اضافه کنید:

  • auto_prepend_file=c:/inetpub/wwwroot/db_data.inc.php

  • اگر خواستید که از یک اتصال پایدار(Persistent) استفاده کنید(این کار معمولا سرعت بیشتر برنامه های کاربردی را بالا می برد ) می توانید ازPConnect به جای Connect استفاده کنید.

    include("db_data.inc.php");
    include("$adodb_path/adodb.inc.php");
    $db = NewADOConnection("$database_type");
    $db->Connect("$host", "$user", "$password", "employees");
    ?>

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

            •
    1383-02-05 ساعت 22:36:25
    << 1 2 3 4 5 6 7 8 9 10 >>
    ﻿
    « | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
    لينك هاي روزانه

    BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
    مطالب اخير
    ﻿
    Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
    آرشيو ماهيانه
    ﻿شهريور1384(1)
    مرداد1384(2)
    تير1384(2)
    خرداد1384(2)
    ارديبهشت1384(4)
    اسفند1383(2)
    بهمن1383(1)
    آذر1383(2)
    آبان1383(4)
    مهر1383(8)
    تير1383(4)
    خرداد1383(1)
    ارديبهشت1383(9)
    فروردين1383(5)
    آرشيو موضوعي
    ﻿اينترنت [2]
    كدهاي كاربردي [5]
    PHP [7]
    MySQL [5]
    برنامه هاي كمكي [7]
    برنامه هاي بازمتن [11]
    عمومي [6]
    روش هاي طراحي [4]
    لينك هاي ثابت
    [ phpmystery ]
    FarsTec
    PersianLinux
    Mohsen's Weblog
    MajidOnline
    techno-graph
    IranASP.NET
    P30World
    Virtualife
    w3schoolsir
    NetKadeh
    techopedia
    Meganit
    ITIran
    Fantazio
    Gonahkar
    IProDev
    IRANETSOL
    IFlashDes
    Oxygenws
    jooti's Blog
    Behrooznp
    WinBeta
    RADMAN
    پژواک
    AlvanWeb
    .:: OutLivE ::.
    IranPHP
    IranAMP
    Sheida
    Ali Masoudi
    SoltoonOnline
    Ashoob
    چشمان باز
    ParsMedia
    Fexon
    جستجو
    ﻿ search

    سايت هاي php
    PHP.Net
    PHP-Editors
    PHPKitchen
    PHPBuilder
    PHPArchitect
    PHPMagazine
    PHPDevNetwork
    DevShed
    SitePoint
    DotGeek
    Planet-PHP
    PHPResorceIndex
    تماس با ما
    khalili.a [at] gmail [dot] com
    آمار بازديدها

    38 | امروز:
89 | ديروز:
77162 | كل:
    مراجعه كنندگان
    free-composable-ringtones-for-alcatel.nifigase.info
    free-composable-ringtones-for-alcatel.nifigase.info
    free-composable-ringtones-for-alcatel.nifigase.info
    who-sells-samsung-cell-phones.nifigase.info
    who-sells-samsung-cell-phones.nifigase.info

    Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
مقدمه ای بر کتابخانه کلاسADOdb در php

چرا از یک کتابخانه کلاس database استفاده کنیم؟

یکی از اشتباهات رایج افراد تازه کار ، این است که بدون نگاه به آینده به طراحی یک برنامه کاربردی می پردازند! هیچ چیزی غیرممکن نیست، فرض کنید که شما برنامه خود را برای یک database خاص مثلا MySQL طراحی کرده اید، روزی مدیر شرکت شما که علاقه خاصی به SQL-SERVER دارد، با تعجب از برنامه شما ایراد می گیرد و وقتی علت را جویا می شوید متوجه این مساله می شوید که برنامه شما انعطاف پذیر(flexible) نیست! شما مجبورید که تمام کدهای خود را مجددا بازنویسی کنید. مشکل کار کجاست؟راه حل چیست؟ شاید PHP مقصر باشد، چون از توابع مختلفی برای کار با database های مختلف استفاده می کند،یعنی توابع استانداردی در این زمینه ندارد. به هر حال تغییر و بازسازی برنامه برای هر database به صورت مجزا، مسلما کار ساده و مقرون به صرفه ای نیست!

اینجاست که یک کتابخانه کلاس که خوب طراحی شده باشد(مثل ADOdb) می تواند زندگی شما را ساده تر کند و به شما امکان دهد که با صرف حداقل توان خود، برنامه خود را برای هر DBMS ای مورد استفاده قرار دهید،بدون اینکه دست به توابع خود بزنید. تنها چیزی که نیاز دارید تغییر چند پارامتر است .ADOdb در حال حاضر از پایگاه های داده زیر پشتیبانی می کند:

MySQL, PostgreSQL, Interbase, Firebird, Informix, Oracle, MS SQL 7, Foxpro, Access, ADO, Sybase, FrontBase, DB2 and generic ODBC

در پست های بعدی به نحوه نصب و استفاده از کتابخانه کلاس ADOdb می پردازیم. برای آشنایی بیشتر حتما سری به این وب سایت بزنید و جدیدترین نسخه این برنامه را از اینجا دریافت کنید.
1383-02-04 ساعت 22:35:25
مستند سازی برنامه های PHP

در فرآیند طراحی یک نرم افزار،اغلب نیاز به استفاده مجدد از کدهای نوشته شده قبلی می باشد.اگر برنامه شما یک سند(documentation) و راهنمای خوب داشته باشد،هم کار کدنویسی شما بهینه خواهد شد و هم به کاربران برنامه خود کمک می کنید که راحت تر از برنامه شما استفاده کنند و وقت کمتری هم صرف پاسخگویی به سوالات و اشکالات کاربران برنامه شما خواهد شد.

phpDocumentor یک ابزار مناسب برای مستند سازی برنامه های php شما می باشد.این برنامه می تواند مستقیما از source code پروژه php شما، سند بسازد. این برنامه از یکtemplating system گسترده استفاده می کند تا comment های نوشته شده در source code برنامه شما را به صورت خوانا برای شما در بیاورد.این سیستم به شما اجازه می دهد که در ۱۵ قالب از قبل طراحی شده HTML، فرمت PDF،فرمتCHM برای ویندوز و Docbook XML برای کدهای خود سند سازی کنید. همچنین شما می توانید خودتان برای آن، قالب بسازید. از این برنامه می توان به دو طریق خط فرمان(Command-Line) و واسط گرافیکی وب استفاده کرد. این برنامه امکانات بسیار زیاد دیگری هم دارد که می توانید برای مشاهده آنها سری به اینجا بزنید. جدیدترین نسخه این برنامه(۱.۳.۰) از اینجا قابل دریافت است.
1383-02-01 ساعت 22:34:25
مجوز(License) برنامه های php

در قسمت قبلی به معرفی License برنامه های Open Source پرداختیم.در ادامه،به نحوه ایجاد License برای برنامه php خود می پردازیم:

شما به راحتی می توانید برنامه خود را وارد قلمرو open source کنید.برای این کار هیچ اجازه خاصی لازم نیست.تنها چیزی که نیاز دارید افزودن نکات مربوط به حق کپی(Copyright Notices) در اول تمام فایلهای منبع(source) برنامه خود می باشد. نمونه ای از یک Copyright Notice در زیر آورده شده است:

/* XOOPS - PHP Content Management System Copyright (c) 2000 XOOPS.org

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.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */

همانطور که مشاهده می کنید، در ابتدا باید برنامه خود را معرفی کنید که این کار با ذکر نام برنامه،توضیحی کوتاه در مورد زمینه استفاده از برنامه ، تاریخ ساخت برنامه و آدرس وب سایت شما صورت می گیرد. بقیه توضیحات ، تقریبا در همه برنامه های تحت GNU GPL ثابت است. آخرین کاری که باید انجام دهید ضمیمه کردن متن اصلی و کامل License به بسته نرم افزاری خود می باشد. این فایل متنی از اینجا قابل دریافت است. این فابل را با نام LICENSE ، COPYING ویا gpl.txt در بسته نرم افزاری خود ،برای توزیع قرار دهید. بهتر است که فایلی دیگر نیز با نام AUTHORS درست کنید که در ابتدای آن نام شما به عنوان اولین سازنده نرم افزار درج شود و تغییراتی که بعد ها به وسیله افراد دیگر انجام می شود نیز در آن لیست شود. برای کسب اطلاعات بیشتر حتما سری به وب سایت GNU بزنید.

(حالا شما می توانید به عنوان یک تولید کننده نرم افزار، با خیال راحت برنامه خود را منتشر کنید تا همگان از برنامه شما سود بجویند و این باعث شود که تنها استفاده کننده نباشید !)
1383-01-18 ساعت 22:31:25
مجوز (License) برنامه های بازمتن

فرض کنید که شما اولین برنامه مفید PHP خود را نوشته اید و قصد دارید که آن را به صورت بازمتن(Open Source) در بیاورید،تا همه بتوانند از آن بهره مند شوند. چگونه می خواهید برنامه خود را عرضه کنید؟ اگر می خواهید آن را به صورت عمومی منتشر کنید(از آنجایی که تمام نرم افزارهای نوشته شده باید از یک سری قوانین بین المللی تبعیت کنند) شما احتیاج به یک مجوز(LICENSE) دارید!

انواع مختلفی از License ها وجود دارد: اگر قصد دارید که توسط برنامه نوشته شده خود،کسب درآمد کنید، شما می توانید برنامه خود را به صورت تجاری(Commercialware) عرضه کنید.در این صورت، افراد تنها با پرداخت پول، حق استفاده از برنامه شما را دارند. راه دیگر، این است که برنامه خود را به صورت Shareware در آورید که در این روش ،شما به افراد اجازه استفاده از یک نسخه با امکانات محدود از نرم افزار خود را می دهید.اگر کسی احساس کرد که برنامه شما برای کار او مناسب است ،برای دریافت نسخه کامل نرم افزار، پول پرداخت می کند. شما، همچنین می توانید برنامه خود را به صورت رایگان(Freeware) عرضه کنید که در این صورت، افراد بدون پرداخت هزینه، می توانند از نرم افزار شما استفاده کنند.

ما با این فرض شروع می کنیم که شما قصد کسب درآمد ار برنامه خود را ندارید. شما ممکن است فکر کنید که در این صورت، گزینه مورد نظر برای شما،Freeware می باشد. اما در اشتباه هستید! با اینکه Freeware به معنای استفاده آزاد از نرم افزاراست،اما هیچ کس به جز شما اجازه تغییر در برنامه را ندارد. برای اینکه بهتر این مساله را درک کنید، فرض کنید که یک برنامه مدیریت محتوا (CMS) نوشته اید و کاربران حتی اجازه تغییر Logoی شما و قرار دادن logoی خود را ندارند.

در حدود ۱۰ سال پیش برای حل این مساله، راه حلی به نام بازمتن(Open Source) پی ریزی شد. بازمتن ،بدین معنی است که برنامه شما برای هرگونه استفاده و تغییر، کاملا آزاد است.هر کاربر با توجه به نیازهای خود قادر به اعمال تغییر در برنامه شما می باشد. برای اینکه نرم افزار خود را به صورت بازمتن عرضه کنید،برنامه شما باید مجوز GNU GPL License داشته باشد.

GNU GPL مخفف "GNU General Public License" می باشد. و خود GNU مفهومی است که توسط موسسه نرم افزار رایگان(Free Software Foundation) بیان شده است و یک مخفف بازگشتی است که معنی آن GNU Not Unix می باشد.این اصطلاح اولین بار برای مجوزدهی به اولین نرم افزار بازمتن- سیستم عامل لینوکسLinus Torvald - در سال ۱۹۹۱ مطرح شد. از آن زمان GNU ، از نرم افزارهای بازمتن،مثل اسکریپت های PHP ،پشتیبانی می کند.

هر نرم افزاری که دارای مجوز GNU GPL می باشد،به صورت رایگان برای عموم منتشر می شود و معمولا شامل فایلهای منبع(Source Files) برنامه است.هر کس می تواند به استثناء نکات ذکر شده در حق کپی ( Copyright Notices)، سایر محتوای برنامه را تغییر دهد،بنابر این ،برنامه شما هرگز دزدیده نمی شود! هر نسخه تغییر یافته برنامه، می تواند به وسیله تغییر دهنده آن به صورت جداگانه منتشر شود،با این شرط که هنوز نویسنده اولیه دارای حق کپی آن است و شخص تغییر دهنده نامش را به License برنامه اضافه می کند.( شما نمی توانید خودتان را سرزنش کنید اگر برنامه نوشته شده توسط شما به صورت یک ویروس درآید!)

همچنین،GPL، شما را مطمئن می سازد که در صورت صدمه دیدن سیستم کاربران برنامه شما و یا به وجود آمدن مشکل در برنامه، هیچ یک از کاربران، قادر به شکایت قانونی از شما نیستند! برنامه های تحتGPL به صورت"as is" هستند،یعنی هیچ تضمینی(warranty) ندارند! ریسک استفاده از نرم افزار،با خود کاربران است.

به این مطلب هم توجه داشته باشید که هیچکس حق ندارد که کدهای شما را به صورت یک نرم افزار غیر بازمتن منتشر کند. بنابر این اگر شما، یک سری کلاس PHP تحت GPL نوشتید، هیچکس اجازه استفاده از کلاس های شما را در برنامه خود ندارد، مگر اینکه برنامه اش را به صورت GPL عرضه کند. البته مجوز دیگری به نامLGPL هم وجود دارد که معنای Lesser GPL می دهد.LGPL اجازه می دهد که از برنامه های نوشته شده تحت آن،بتوان در نرم افزارهای تجاری استفاده کرد. چون از LGPL خیلی کم برای مجوزدهی به برنامه های PHP استفاده می شود،به توضیح بیشتر آن نمی پردازیم.

درقسمت بعدی به توضیح اینکه چگونه برنامه های خود را تحت GNU GPL منتشر کنید،می پردازیم.
1383-01-17 ساعت 22:30:25
مروری سریع بر PHP 5

ظهور PHP 3 در سال ۱۹۹۷ انقلابی در نحوه ساخت وب سایت های دینامیک به وجود آورد و این امکان را به برنامه سازان وب داد که به راحتی و به سرعت، برنامه های کاربردی تحت وب قدرتمندی خلق کنند. در ادامه PHP 4 قدرتی بیشتر از سابق پیدا کرد،PHP 4 با معرفی Zend Engine بازدهی PHP را بسیار بالا برد و اجازه گسترش بیشتر از قبل را به PHP داد. نسخه پنجم PHP که نقطه عطفی در تاریخ PHP محسوب می شود، ویژگی های اساسی و پیشرفت های مهمی را ارائه می کند.

Zend Engine II به عنوان قلب PHP 5، یک مدل برنامه نویسی شی ء گرای(Object Oriented) بسیار قدرتمند و جدید را عرضه می کند که به برنامه سازان اجازه می دهد که به ساخت برنامه های کاربردی تحت وب،بر پایه اشیاء و در مقیاس بزرگ ، با استفاده از روش ها و الگوهای طراحی رایج بپردازند. Zend Engine II زیربنایی را برای ماژولهای توسعه دهنده در حال پیشرفت فراهم می آورد که PHP را بسیار راحت تر و قدرتمند تر ار آنچه که شما انتظار دارید،می سازد.

PHP 5 یک راه جدید و پیشرفته را برای رویارویی با XML ارائه می کند که یک بستر مناسب و ایده آل برای پردازش XML می باشد. ماژول گردآوری شده جدید SimpleXML اطلاعات XML را به صورت یک نوع داده محلی در PHP در می آورد که باعث می شود پردازش XML سریعتر از قبل انجام شود و همین کار PHP را به یک زبان ایده آل برای پردازش برنامه های کاربردی XML تبدیل می کند. در تکمیل ویژگی های XML جدید، یک ماژول SOAP جدید ارائه می شود که کار با وب سرویس ها را از طریق یک API سریع و آسان می دهد.

اگر جزو علاقمندان به کارگیری پایگاه داده در برنامه های خود هستید، دیگر احتیاجی به نصب یک پایگاه داده مثل MySQL برای انجام کارهای ساده خود ندارید، زیرا یک پایگاه داده داخلی به نامSQLite این کارها را برای شما انجام می دهد. برای برنامه های کاربردی در مقیاس بزرگتر ماژول جدید MySQLi به کاربران اجازه می دهد که از ویژگی های جدید MySQL 4.1 در برنامه های خود استفاده کنند که بازدهی بیشتری را نسبت به نسخه های قبلی MySQL فراهم می کند.

منبع مطلب:http://www.devshed.com نویسنده: Zeev Suraski

1383-01-16 ساعت 22:29:25
<< 1 2 3 4 5 6 7 8 9 10 >>
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

39 | امروز:
89 | ديروز:
77163 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


Web Experiences && Selective Recalls

>>>
<<<
﻿ نمايش مطالب ﻿
آشنايی با PHP - قسمت اول

Rasmus Lerdorf خالق زبان PHP مقاله ای جالب در مورد آشنایی با PHP نوشته است. در این مقاله در مورد اینکه پدیده PHP چگونه شکل گرفت،چگونه گسترش پیدا کرد و مسیر PHP به کجا می رود ،اطلاعات جالبی داده شده است. خواندن این مقاله به کسانی که قصد شروع کردن این زبان زیبا را دارند،توصیه اکید می شود! در زیر ترجمه ای از این مقاله در چند قسمت آورده شده است:

PHP همه جا هست! طبق آمار گرفته شده از سایت Netcraft در February 2004 در حال حاضر 47,173,415 دامنه(Domain) وجود دارد که در این میان، تعداد سایت هایی که از PHP استفاده می کنند 15,205,474 دامنه گزارش شده است.این یعنی تقریبا ۳۲ درصد از کل دامنه های موجود در وب! این نشان دهنده رشد چشمگیر PHP می باشد.

اولین روزهای PHP

من حدود ۱۰ سال پیش کار ساخت PHP را شروع کردم. این کار خیلی قبل تر از این بود که اصطلاح باز متن(Open Source) و یا GPL و برنامه های مجانی رایج شود. مثل بیشتر پروژه های باز متن که مشهور شده اند،انگیزه من هرگز فلسفی یا حتی عاشقانه نبود! انگیزه من نیاز به ابزاری بود که مشکلات مربوط به وب را در دنیای واقعی حل کند. در سال ۱۹۹۴ وقتی که به سمت ابزارهای طراحی وب روی می آوردی، انتخاب ها بسیار محدود بود. من مشغول نوشتن محتوای دینامیک وب سایت ها را به زبان C یا Perl بودم و روی هم افتادن کدها(Code Overlap) از مساله ای به مساله دیگر کاملا بارز بود. به خاطر بازدهی(Performance) بالا من بیشتر تمایل داشتم که از C استفاده کنم تا Perl، زیرا مراحل(fork+exec overhead) در اجرای Perl به صورت یک standalone CGI بسیار محدود کننده بود. اولین نسخه غیر منتشر شده PHP بیشتر یک کتابخانه از توابع رایج C بود که طوری نوشته شده بود که قابلیت استفاده مجدد از یک برنامه باز متن به یک برنامه باز متن دیگر را داشته باشد. من یک state-machine-driven parser ساده نوشتم که دستورات را از فایل های HTML بر می داشت و پشتوانه ای از توابع نوشته شده در C را فراخوانی می کرد.این کد به صورت عمومی تحت عنوان بسته ای به نام Personal Home Page Tools منتشر شد که هر کدام از ابزارهای آن بسته، راه حلی برای رفع مشکلات رایج مربوط به صفحات خانگی شخصی(Personal Home Page) بود. نکته ای که من در این زمینه استفاده کردم این بود که قسمتی را به عنوان مفسر فرم(Form Interpreter)جدا کردم و آن را FI نامیدم. ایده پشت FI این بود که بتواند تمام چیزهای عمومی را که شما نیاز به انجام آنها دارید، وقتی که نتیجه ارسال یک فرم را دریافت می کنید، انجام دهد. نمونه ای از مثال های اولیه:

<!--getenv HTTP_USER_AGENT-->
<!--ifsubstr $exec_result Mozilla-->
Hey, you are using Netscape!<p>
<!--endif-->

Parser من برای FI بسیار بد نوشته شده بود، بنابر این تلاش کردم که یک Parser بهتر بنویسم. من استفاده از <-- دستور --!> را رها کردم و به جای آن از < دستور ?> استفاده کردم.بخش های ابزارهای Personal Home Page به همراه ابزار FI جدید، دوباره ترکیب شد وبسته ای با نام PHP/FI در سال ۱۹۹۵منتشر شد. PHP/FI با گذشت سالها در بستر وب رشد کرد.در سال ۱۹۹۷ دو نفر در اسرائیل به نامهای Zeev Suraski و Andi Gutmans که از PHP/FI استفاده می کردند، به من پیشنهاد دادند که از Parsing Engine جدیدی که آنها برای نسخه بعدی PHP نوشته بودند،استفاده کنم! من افراد کمی را را که بسته ای رفع ایراد(Patch) و کدهایی برای PHP/FI را برای من فرستاده بودند،جمع کردم و همه با هم برای انتشار نسخه سوم PHP در اواسط سال ۱۹۹۸ هماهنگ شدیم. این ،احتمالا یک لحظه بسیار سخت و طاقت فرسا در طول دوران ساخت PHP بوده است. پروژه از بین می رفت اگر تنها با تلاش یک نفر باقی می ماند و به تحقق نمی پیوست اگر گروهی از افراد تازه کار و بیگانه گرد هم جمع می شدند و برای هدف مشترکی کار می کردند! ما هر جور که بود تلاش کردیم که از تجربیات و استعدادهای هم استفاده کنیم و بدین ترتیب پروژه پیشرفت کرد. تعداد زیادی از افراد کمک کردند که این پروژه پیشرفت کند و ما در حال تلاش هستیم که نسخه ۵ این زبان در نیمه اول سال ۲۰۰۴ منتشر شود.
1383-01-14 ساعت 22:23:25
آشنايی با PHP - قسمت دوم

جوجه اردک زشت زبان های برنامه نویسی

نظر عمومی راجع به PHP دو دسته است: عده ای از متعصبین زبان های برنامه نویسی بسیاری از ویژگی های منحصر بفرد PHP را قبول ندارند.در نقطه مقابل ،عده ای از برنامه نویسان واقع بین ،عاشق PHP هستند و آن را به عنوان یک ابزار کامل برای حل مسائل مرتبط با وب می دانند. نمونه ای از مسائلی که متعصبین زبان های برنامه نویسی را دیوانه کرده است عبارتند از: نام توابع، حساس به حروف(case-sensitive) نیستند، در حالی که نام متغیرها case-sensitive هستند! توابع built-in با یک قانون ثابت نامگذاری نشده اند! و اینکه برنامه نویس PHP مجبور نیست از یک اصول ثابت و پیوسته تبعیت کند و این باعث تولید کدهای شلوغ و آشفته می شود!

من واقعا راجع به این انتقادات نمی توانم بحث و جدل کنم ولی حداقل تلاش می کنم که توضیح دهم که این مسائل چرا و چگونه به وجود آمده اند:

اولین مساله مربوط به case-sensitive نبودن نام توابع است:این مساله به نسخه های اولیه PHP بر می گردد.در اولین روزهای رواج وب، خیلی قبل تر از XHTML ، این خیلی رایج بود که همه دستورات HTML با حروف بزرگ نوشته شوند،اما چون این دستورات case-sensitive نبودند، اغلب افراد از یک الگوی ثابت در این کار استفاده نمی کردند. من می خواستم که افراد، با دستورات خاص PHP مشابه زبان های علامت گذاری دیگر برخورد کنند، که این بدین معنی بود که دستورات PHP نباید case-sensitive باشند. وقتی که PHP پیشرفت کرد و ویژگی های خاصی مثل متغیرها را در خود جای داد، اشکالی نداشت که این ویژگی های جدید case-sensitive باشند زیرا صدمه ای به قابلیت سازگاری(compatibility) صفحات قبلی نوشته شده با PHP نمی زد. به عقب برگشتیم و فورا دستورات اولیه را که ضروری بود،درست کردیم تا اینکه رسیدیم به فراخوانی توابع! اگر نام توابع case-sensitive می شدند، صفحات قبلی نوشته شده با PHP بلا استفاده می شدند. افراد نباید توابعی داشته باشند که تنها از نظر بزرگی و کوچکی حروف با هم تفاوت داشته باشند. اگر به عقب برگردیم شاید بهتر بود که سازگاری(compatibility) را ازبین می بردیم چون در آن زمان هنوز عده کمی ازPHP استفاده می کردند ولی در آن زمان هیچ کس نمی توانست رشد چشمگیر PHP را پیش بینی کند!

در مورد نام توابع، من تمایل داشتم که از زبان ها و API هایی که با آن ها آشنا بودم استفاده کنم. این باعث شد که PHP توابعی مثل strlen(ویا substr که ممکن بود احمقانه به نظر برسد اگر به صورت str_len یا sub_str بود) داشته باشد.من چیزهایی مثل ()stripslashes اضافه کردم که اغلب به خاطر راحتی خواندن ()StripSlashes نوشته می شود. در همان زمان API های پایگاه های داده سطح پایین را با توابعی مثل ()msql_connect شبیه سازی کردم. miniSQL اولین پایگاه داده ای بود که به وسیله PHP پشتیبانی شد. افرادی که با این منابع مختلف آشنا هستند، با نامگذاری ها در PHP بسیار راحت هستند. PHP هرگز یک زبان standalone نبوده است بلکه یک رابط بین وب سرور و تمام ابزارهای پشتیبان مختلف که مورد نیاز شماست، می باشد. اگر افراد امروزه به PHP به عنوان یک زبان به تنهایی(standalone) بنگرند، ممکن است یک زبان غیر یکدست به نظر برسد!

در مورد پیروی نکردن PHP از یک الگوی ثابت، من تنها می توانم بگویم که مطلقا از چهارچوب های برنامه نویسی که مرا محدود به استفاده از یک شیوه و الگو برای برنامه نویسی می کند ،بیزارم! این بدین معنی نیست که من اعتقادی به ساختار چارچوب ها(framework) ندارم، بلکه معتقدم که افراد باید این توانایی را داشته باشند که خودشان بر حسب سلایق خود محیط ها و چارچوب هایشان را درست کنند.

در پایان باید بگویم که PHP هرگز طراحی نشده است که یک انقلاب جدید در نوع برنامه نویسی را معرفی کند.PHP طراحی شده است که یک مساله ساده را حل کند: مساله وب . این مساله می تواند خیلی زشت به نظر برسد و بعضی اوقات شاید شما به یک ابزار زشت نیاز دارید تا یک مساله زشت را حل کنید! اگرچه یک ابزار زیبا هم ممکن است قادر باشد که یک مساله را به خوبی حل کند اما بخت و اقبال اینطوری بوده است که راه حل زشت PHP بسیار سریعتر و به همراه منابع بسیار کمتری بتواند مسائل را از میان بردارد.
1383-01-13 ساعت 22:27:25
<< 1 2 3 4 5 6 7 8 9 10
﻿
« | آبان 1384 |  |  |  |  | »
شنبه | يكشنبه | دوشنبه | سه شنبه | چهارشنبه | پنجشنبه | جمعه
 | 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 |  |  |  |
لينك هاي روزانه

BeebleX:the PHP search engine | -
AJAX Office | -
Henri Bergius's Weblog | -
کاراکتر های فارسی در عکس توسط PHP | -
کتابهایی در مورد روش AJAX | -
فارسی نیوز: فارسی شده CuteNews | -
PortableWebAp.com | -
PAJAJ: PHP Asynchronous Javascript and JSON | -
PHP6 از رویا تا واقعیت! | -
www.pro-php.com | -
سيستم مديريت وبلاگ فوژان | -
Back-End CMS | -
PHP 5 و الگوهای طراحی | -
سایت فارسی phprider.com | -
خودتان Orkut درست کنید! | -
www.Orisinal.com | -
Al Qaeda Training Manual | -
مقاله: آشنایی با XML-RPC | -
1 2 3 4 5 6 7 8 9 10 11 12 13 >>
مطالب اخير
﻿
Progress Always Comes Late | 1)
جستجوی نام های دامنه (Whois) در PHP | 2)
اداره کردن خطاها در PHP 5 | 3)
حفاظت در برابر XML-RPC Exploits | 4)
آشنایی با AJAX در نمایشگاه الکامپ! | 5)
آرشيو ماهيانه
﻿شهريور1384(1)
مرداد1384(2)
تير1384(2)
خرداد1384(2)
ارديبهشت1384(4)
اسفند1383(2)
بهمن1383(1)
آذر1383(2)
آبان1383(4)
مهر1383(8)
تير1383(4)
خرداد1383(1)
ارديبهشت1383(9)
فروردين1383(5)
آرشيو موضوعي
﻿اينترنت [2]
كدهاي كاربردي [5]
PHP [7]
MySQL [5]
برنامه هاي كمكي [7]
برنامه هاي بازمتن [11]
عمومي [6]
روش هاي طراحي [4]
لينك هاي ثابت
[ phpmystery ]
FarsTec
PersianLinux
Mohsen's Weblog
MajidOnline
techno-graph
IranASP.NET
P30World
Virtualife
w3schoolsir
NetKadeh
techopedia
Meganit
ITIran
Fantazio
Gonahkar
IProDev
IRANETSOL
IFlashDes
Oxygenws
jooti's Blog
Behrooznp
WinBeta
RADMAN
پژواک
AlvanWeb
.:: OutLivE ::.
IranPHP
IranAMP
Sheida
Ali Masoudi
SoltoonOnline
Ashoob
چشمان باز
ParsMedia
Fexon
جستجو
﻿ search

سايت هاي php
PHP.Net
PHP-Editors
PHPKitchen
PHPBuilder
PHPArchitect
PHPMagazine
PHPDevNetwork
DevShed
SitePoint
DotGeek
Planet-PHP
PHPResorceIndex
تماس با ما
khalili.a [at] gmail [dot] com
آمار بازديدها

40 | امروز:
89 | ديروز:
77164 | كل:
مراجعه كنندگان
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
free-composable-ringtones-for-alcatel.nifigase.info
who-sells-samsung-cell-phones.nifigase.info
who-sells-samsung-cell-phones.nifigase.info

Copyright © 2005 Ali Khalili. All Rights Reserved.


آشنايی با PHP - قسمت اول

Rasmus Lerdorf خالق زبان PHP مقاله ای جالب در مورد آشنایی با PHP نوشته است. در این مقاله در مورد اینکه پدیده PHP چگونه شکل گرفت،چگونه گسترش پیدا کرد و مسیر PHP به کجا می رود ،اطلاعات جالبی داده شده است. خواندن این مقاله به کسانی که قصد شروع کردن این زبان زیبا را دارند،توصیه اکید می شود! در زیر ترجمه ای از این مقاله در چند قسمت آورده شده است:

PHP همه جا هست! طبق آمار گرفته شده از سایت Netcraft در February 2004 در حال حاضر 47,173,415 دامنه(Domain) وجود دارد که در این میان، تعداد سایت هایی که از PHP استفاده می کنند 15,205,474 دامنه گزارش شده است.این یعنی تقریبا ۳۲ درصد از کل دامنه های موجود در وب! این نشان دهنده رشد چشمگیر PHP می باشد.

اولین روزهای PHP

من حدود ۱۰ سال پیش کار ساخت PHP را شروع کردم. این کار خیلی قبل تر از این بود که اصطلاح باز متن(Open Source) و یا GPL و برنامه های مجانی رایج شود. مثل بیشتر پروژه های باز متن که مشهور شده اند،انگیزه من هرگز فلسفی یا حتی عاشقانه نبود! انگیزه من نیاز به ابزاری بود که مشکلات مربوط به وب را در دنیای واقعی حل کند. در سال ۱۹۹۴ وقتی که به سمت ابزارهای طراحی وب روی می آوردی، انتخاب ها بسیار محدود بود. من مشغول نوشتن محتوای دینامیک وب سایت ها را به زبان C یا Perl بودم و روی هم افتادن کدها(Code Overlap) از مساله ای به مساله دیگر کاملا بارز بود. به خاطر بازدهی(Performance) بالا من بیشتر تمایل داشتم که از C استفاده کنم تا Perl، زیرا مراحل(fork+exec overhead) در اجرای Perl به صورت یک standalone CGI بسیار محدود کننده بود. اولین نسخه غیر منتشر شده PHP بیشتر یک کتابخانه از توابع رایج C بود که طوری نوشته شده بود که قابلیت استفاده مجدد از یک برنامه باز متن به یک برنامه باز متن دیگر را داشته باشد. من یک state-machine-driven parser ساده نوشتم که دستورات را از فایل های HTML بر می داشت و پشتوانه ای از توابع نوشته شده در C را فراخوانی می کرد.این کد به صورت عمومی تحت عنوان بسته ای به نام Personal Home Page Tools منتشر شد که هر کدام از ابزارهای آن بسته، راه حلی برای رفع مشکلات رایج مربوط به صفحات خانگی شخصی(Personal Home Page) بود. نکته ای که من در این زمینه استفاده کردم این بود که قسمتی را به عنوان مفسر فرم(Form Interpreter)جدا کردم و آن را FI نامیدم. ایده پشت FI این بود که بتواند تمام چیزهای عمومی را که شما نیاز به انجام آنها دارید، وقتی که نتیجه ارسال یک فرم را دریافت می کنید، انجام دهد. نمونه ای از مثال های اولیه:

<!--getenv HTTP_USER_AGENT-->
<!--ifsubstr $exec_result Mozilla-->
Hey, you are using Netscape!<p>
<!--endif-->

Parser من برای FI بسیار بد نوشته شده بود، بنابر این تلاش کردم که یک Parser بهتر بنویسم. من استفاده از <-- دستور --!> را رها کردم و به جای آن از < دستور ?> استفاده کردم.بخش های ابزارهای Personal Home Page به همراه ابزار FI جدید، دوباره ترکیب شد وبسته ای با نام PHP/FI در سال ۱۹۹۵منتشر شد. PHP/FI با گذشت سالها در بستر وب رشد کرد.در سال ۱۹۹۷ دو نفر در اسرائیل به نامهای Zeev Suraski و Andi Gutmans که از PHP/FI استفاده می کردند، به من پیشنهاد دادند که از Parsing Engine جدیدی که آنها برای نسخه بعدی PHP نوشته بودند،استفاده کنم! من افراد کمی را را که بسته ای رفع ایراد(Patch) و کدهایی برای PHP/FI را برای من فرستاده بودند،جمع کردم و همه با هم برای انتشار نسخه سوم PHP در اواسط سال ۱۹۹۸ هماهنگ شدیم. این ،احتمالا یک لحظه بسیار سخت و طاقت فرسا در طول دوران ساخت PHP بوده است. پروژه از بین می رفت اگر تنها با تلاش یک نفر باقی می ماند و به تحقق نمی پیوست اگر گروهی از افراد تازه کار و بیگانه گرد هم جمع می شدند و برای هدف مشترکی کار می کردند! ما هر جور که بود تلاش کردیم که از تجربیات و استعدادهای هم استفاده کنیم و بدین ترتیب پروژه پیشرفت کرد. تعداد زیادی از افراد کمک کردند که این پروژه پیشرفت کند و ما در حال تلاش هستیم که نسخه ۵ این زبان در نیمه اول سال ۲۰۰۴ منتشر شود.
1383-01-14 22:23:25
علي خليلي
نويسنده:
http://www.ali1k.com/blog


آشنايی با PHP - قسمت دوم

جوجه اردک زشت زبان های برنامه نویسی

نظر عمومی راجع به PHP دو دسته است: عده ای از متعصبین زبان های برنامه نویسی بسیاری از ویژگی های منحصر بفرد PHP را قبول ندارند.در نقطه مقابل ،عده ای از برنامه نویسان واقع بین ،عاشق PHP هستند و آن را به عنوان یک ابزار کامل برای حل مسائل مرتبط با وب می دانند. نمونه ای از مسائلی که متعصبین زبان های برنامه نویسی را دیوانه کرده است عبارتند از: نام توابع، حساس به حروف(case-sensitive) نیستند، در حالی که نام متغیرها case-sensitive هستند! توابع built-in با یک قانون ثابت نامگذاری نشده اند! و اینکه برنامه نویس PHP مجبور نیست از یک اصول ثابت و پیوسته تبعیت کند و این باعث تولید کدهای شلوغ و آشفته می شود!

من واقعا راجع به این انتقادات نمی توانم بحث و جدل کنم ولی حداقل تلاش می کنم که توضیح دهم که این مسائل چرا و چگونه به وجود آمده اند:

اولین مساله مربوط به case-sensitive نبودن نام توابع است:این مساله به نسخه های اولیه PHP بر می گردد.در اولین روزهای رواج وب، خیلی قبل تر از XHTML ، این خیلی رایج بود که همه دستورات HTML با حروف بزرگ نوشته شوند،اما چون این دستورات case-sensitive نبودند، اغلب افراد از یک الگوی ثابت در این کار استفاده نمی کردند. من می خواستم که افراد، با دستورات خاص PHP مشابه زبان های علامت گذاری دیگر برخورد کنند، که این بدین معنی بود که دستورات PHP نباید case-sensitive باشند. وقتی که PHP پیشرفت کرد و ویژگی های خاصی مثل متغیرها را در خود جای داد، اشکالی نداشت که این ویژگی های جدید case-sensitive باشند زیرا صدمه ای به قابلیت سازگاری(compatibility) صفحات قبلی نوشته شده با PHP نمی زد. به عقب برگشتیم و فورا دستورات اولیه را که ضروری بود،درست کردیم تا اینکه رسیدیم به فراخوانی توابع! اگر نام توابع case-sensitive می شدند، صفحات قبلی نوشته شده با PHP بلا استفاده می شدند. افراد نباید توابعی داشته باشند که تنها از نظر بزرگی و کوچکی حروف با هم تفاوت داشته باشند. اگر به عقب برگردیم شاید بهتر بود که سازگاری(compatibility) را ازبین می بردیم چون در آن زمان هنوز عده کمی ازPHP استفاده می کردند ولی در آن زمان هیچ کس نمی توانست رشد چشمگیر PHP را پیش بینی کند!

در مورد نام توابع، من تمایل داشتم که از زبان ها و API هایی که با آن ها آشنا بودم استفاده کنم. این باعث شد که PHP توابعی مثل strlen(ویا substr که ممکن بود احمقانه به نظر برسد اگر به صورت str_len یا sub_str بود) داشته باشد.من چیزهایی مثل ()stripslashes اضافه کردم که اغلب به خاطر راحتی خواندن ()StripSlashes نوشته می شود. در همان زمان API های پایگاه های داده سطح پایین را با توابعی مثل ()msql_connect شبیه سازی کردم. miniSQL اولین پایگاه داده ای بود که به وسیله PHP پشتیبانی شد. افرادی که با این منابع مختلف آشنا هستند، با نامگذاری ها در PHP بسیار راحت هستند. PHP هرگز یک زبان standalone نبوده است بلکه یک رابط بین وب سرور و تمام ابزارهای پشتیبان مختلف که مورد نیاز شماست، می باشد. اگر افراد امروزه به PHP به عنوان یک زبان به تنهایی(standalone) بنگرند، ممکن است یک زبان غیر یکدست به نظر برسد!

در مورد پیروی نکردن PHP از یک الگوی ثابت، من تنها می توانم بگویم که مطلقا از چهارچوب های برنامه نویسی که مرا محدود به استفاده از یک شیوه و الگو برای برنامه نویسی می کند ،بیزارم! این بدین معنی نیست که من اعتقادی به ساختار چارچوب ها(framework) ندارم، بلکه معتقدم که افراد باید این توانایی را داشته باشند که خودشان بر حسب سلایق خود محیط ها و چارچوب هایشان را درست کنند.

در پایان باید بگویم که PHP هرگز طراحی نشده است که یک انقلاب جدید در نوع برنامه نویسی را معرفی کند.PHP طراحی شده است که یک مساله ساده را حل کند: مساله وب . این مساله می تواند خیلی زشت به نظر برسد و بعضی اوقات شاید شما به یک ابزار زشت نیاز دارید تا یک مساله زشت را حل کنید! اگرچه یک ابزار زیبا هم ممکن است قادر باشد که یک مساله را به خوبی حل کند اما بخت و اقبال اینطوری بوده است که راه حل زشت PHP بسیار سریعتر و به همراه منابع بسیار کمتری بتواند مسائل را از میان بردارد.
1383-01-13 22:27:25
علي خليلي
نويسنده:


مروری سریع بر PHP 5

ظهور PHP 3 در سال ۱۹۹۷ انقلابی در نحوه ساخت وب سایت های دینامیک به وجود آورد و این امکان را به برنامه سازان وب داد که به راحتی و به سرعت، برنامه های کاربردی تحت وب قدرتمندی خلق کنند. در ادامه PHP 4 قدرتی بیشتر از سابق پیدا کرد،PHP 4 با معرفی Zend Engine بازدهی PHP را بسیار بالا برد و اجازه گسترش بیشتر از قبل را به PHP داد. نسخه پنجم PHP که نقطه عطفی در تاریخ PHP محسوب می شود، ویژگی های اساسی و پیشرفت های مهمی را ارائه می کند.

Zend Engine II به عنوان قلب PHP 5، یک مدل برنامه نویسی شی ء گرای(Object Oriented) بسیار قدرتمند و جدید را عرضه می کند که به برنامه سازان اجازه می دهد که به ساخت برنامه های کاربردی تحت وب،بر پایه اشیاء و در مقیاس بزرگ ، با استفاده از روش ها و الگوهای طراحی رایج بپردازند. Zend Engine II زیربنایی را برای ماژولهای توسعه دهنده در حال پیشرفت فراهم می آورد که PHP را بسیار راحت تر و قدرتمند تر ار آنچه که شما انتظار دارید،می سازد.

PHP 5 یک راه جدید و پیشرفته را برای رویارویی با XML ارائه می کند که یک بستر مناسب و ایده آل برای پردازش XML می باشد. ماژول گردآوری شده جدید SimpleXML اطلاعات XML را به صورت یک نوع داده محلی در PHP در می آورد که باعث می شود پردازش XML سریعتر از قبل انجام شود و همین کار PHP را به یک زبان ایده آل برای پردازش برنامه های کاربردی XML تبدیل می کند. در تکمیل ویژگی های XML جدید، یک ماژول SOAP جدید ارائه می شود که کار با وب سرویس ها را از طریق یک API سریع و آسان می دهد.

اگر جزو علاقمندان به کارگیری پایگاه داده در برنامه های خود هستید، دیگر احتیاجی به نصب یک پایگاه داده مثل MySQL برای انجام کارهای ساده خود ندارید، زیرا یک پایگاه داده داخلی به نامSQLite این کارها را برای شما انجام می دهد. برای برنامه های کاربردی در مقیاس بزرگتر ماژول جدید MySQLi به کاربران اجازه می دهد که از ویژگی های جدید MySQL 4.1 در برنامه های خود استفاده کنند که بازدهی بیشتری را نسبت به نسخه های قبلی MySQL فراهم می کند.

منبع مطلب:http://www.devshed.com نویسنده: Zeev Suraski

1383-01-16 22:29:25
علي خليلي
نويسنده:


مجوز (License) برنامه های بازمتن

فرض کنید که شما اولین برنامه مفید PHP خود را نوشته اید و قصد دارید که آن را به صورت بازمتن(Open Source) در بیاورید،تا همه بتوانند از آن بهره مند شوند. چگونه می خواهید برنامه خود را عرضه کنید؟ اگر می خواهید آن را به صورت عمومی منتشر کنید(از آنجایی که تمام نرم افزارهای نوشته شده باید از یک سری قوانین بین المللی تبعیت کنند) شما احتیاج به یک مجوز(LICENSE) دارید!

انواع مختلفی از License ها وجود دارد: اگر قصد دارید که توسط برنامه نوشته شده خود،کسب درآمد کنید، شما می توانید برنامه خود را به صورت تجاری(Commercialware) عرضه کنید.در این صورت، افراد تنها با پرداخت پول، حق استفاده از برنامه شما را دارند. راه دیگر، این است که برنامه خود را به صورت Shareware در آورید که در این روش ،شما به افراد اجازه استفاده از یک نسخه با امکانات محدود از نرم افزار خود را می دهید.اگر کسی احساس کرد که برنامه شما برای کار او مناسب است ،برای دریافت نسخه کامل نرم افزار، پول پرداخت می کند. شما، همچنین می توانید برنامه خود را به صورت رایگان(Freeware) عرضه کنید که در این صورت، افراد بدون پرداخت هزینه، می توانند از نرم افزار شما استفاده کنند.

ما با این فرض شروع می کنیم که شما قصد کسب درآمد ار برنامه خود را ندارید. شما ممکن است فکر کنید که در این صورت، گزینه مورد نظر برای شما،Freeware می باشد. اما در اشتباه هستید! با اینکه Freeware به معنای استفاده آزاد از نرم افزاراست،اما هیچ کس به جز شما اجازه تغییر در برنامه را ندارد. برای اینکه بهتر این مساله را درک کنید، فرض کنید که یک برنامه مدیریت محتوا (CMS) نوشته اید و کاربران حتی اجازه تغییر Logoی شما و قرار دادن logoی خود را ندارند.

در حدود ۱۰ سال پیش برای حل این مساله، راه حلی به نام بازمتن(Open Source) پی ریزی شد. بازمتن ،بدین معنی است که برنامه شما برای هرگونه استفاده و تغییر، کاملا آزاد است.هر کاربر با توجه به نیازهای خود قادر به اعمال تغییر در برنامه شما می باشد. برای اینکه نرم افزار خود را به صورت بازمتن عرضه کنید،برنامه شما باید مجوز GNU GPL License داشته باشد.

GNU GPL مخفف "GNU General Public License" می باشد. و خود GNU مفهومی است که توسط موسسه نرم افزار رایگان(Free Software Foundation) بیان شده است و یک مخفف بازگشتی است که معنی آن GNU Not Unix می باشد.این اصطلاح اولین بار برای مجوزدهی به اولین نرم افزار بازمتن- سیستم عامل لینوکسLinus Torvald - در سال ۱۹۹۱ مطرح شد. از آن زمان GNU ، از نرم افزارهای بازمتن،مثل اسکریپت های PHP ،پشتیبانی می کند.

هر نرم افزاری که دارای مجوز GNU GPL می باشد،به صورت رایگان برای عموم منتشر می شود و معمولا شامل فایلهای منبع(Source Files) برنامه است.هر کس می تواند به استثناء نکات ذکر شده در حق کپی ( Copyright Notices)، سایر محتوای برنامه را تغییر دهد،بنابر این ،برنامه شما هرگز دزدیده نمی شود! هر نسخه تغییر یافته برنامه، می تواند به وسیله تغییر دهنده آن به صورت جداگانه منتشر شود،با این شرط که هنوز نویسنده اولیه دارای حق کپی آن است و شخص تغییر دهنده نامش را به License برنامه اضافه می کند.( شما نمی توانید خودتان را سرزنش کنید اگر برنامه نوشته شده توسط شما به صورت یک ویروس درآید!)

همچنین،GPL، شما را مطمئن می سازد که در صورت صدمه دیدن سیستم کاربران برنامه شما و یا به وجود آمدن مشکل در برنامه، هیچ یک از کاربران، قادر به شکایت قانونی از شما نیستند! برنامه های تحتGPL به صورت"as is" هستند،یعنی هیچ تضمینی(warranty) ندارند! ریسک استفاده از نرم افزار،با خود کاربران است.

به این مطلب هم توجه داشته باشید که هیچکس حق ندارد که کدهای شما را به صورت یک نرم افزار غیر بازمتن منتشر کند. بنابر این اگر شما، یک سری کلاس PHP تحت GPL نوشتید، هیچکس اجازه استفاده از کلاس های شما را در برنامه خود ندارد، مگر اینکه برنامه اش را به صورت GPL عرضه کند. البته مجوز دیگری به نامLGPL هم وجود دارد که معنای Lesser GPL می دهد.LGPL اجازه می دهد که از برنامه های نوشته شده تحت آن،بتوان در نرم افزارهای تجاری استفاده کرد. چون از LGPL خیلی کم برای مجوزدهی به برنامه های PHP استفاده می شود،به توضیح بیشتر آن نمی پردازیم.

درقسمت بعدی به توضیح اینکه چگونه برنامه های خود را تحت GNU GPL منتشر کنید،می پردازیم.
1383-01-17 22:30:25
علي خليلي
نويسنده:


مجوز(License) برنامه های php

در قسمت قبلی به معرفی License برنامه های Open Source پرداختیم.در ادامه،به نحوه ایجاد License برای برنامه php خود می پردازیم:

شما به راحتی می توانید برنامه خود را وارد قلمرو open source کنید.برای این کار هیچ اجازه خاصی لازم نیست.تنها چیزی که نیاز دارید افزودن نکات مربوط به حق کپی(Copyright Notices) در اول تمام فایلهای منبع(source) برنامه خود می باشد. نمونه ای از یک Copyright Notice در زیر آورده شده است:

/* XOOPS - PHP Content Management System Copyright (c) 2000 XOOPS.org

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.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */

همانطور که مشاهده می کنید، در ابتدا باید برنامه خود را معرفی کنید که این کار با ذکر نام برنامه،توضیحی کوتاه در مورد زمینه استفاده از برنامه ، تاریخ ساخت برنامه و آدرس وب سایت شما صورت می گیرد. بقیه توضیحات ، تقریبا در همه برنامه های تحت GNU GPL ثابت است. آخرین کاری که باید انجام دهید ضمیمه کردن متن اصلی و کامل License به بسته نرم افزاری خود می باشد. این فایل متنی از اینجا قابل دریافت است. این فابل را با نام LICENSE ، COPYING ویا gpl.txt در بسته نرم افزاری خود ،برای توزیع قرار دهید. بهتر است که فایلی دیگر نیز با نام AUTHORS درست کنید که در ابتدای آن نام شما به عنوان اولین سازنده نرم افزار درج شود و تغییراتی که بعد ها به وسیله افراد دیگر انجام می شود نیز در آن لیست شود. برای کسب اطلاعات بیشتر حتما سری به وب سایت GNU بزنید.

(حالا شما می توانید به عنوان یک تولید کننده نرم افزار، با خیال راحت برنامه خود را منتشر کنید تا همگان از برنامه شما سود بجویند و این باعث شود که تنها استفاده کننده نباشید !)
1383-01-18 22:31:25
علي خليلي
نويسنده:


PDML: زبانی برای ساخت اسناد PDF

PDML مخفف Portable Document Markup Language می باشد و یک زبان غیر رسمی(Informal) نشانه گذاری می باشد که ۱۰۰٪ توسط PHP نوشته شده است.این زبان به افراد آشنا به HTML اجازه می دهد که به سادگی اسناد پیچیده PDF درست کنند. همچنین افراد آشنا با PHP می توانند از آن به عنوان روشی برای تعریف قالب هایی(templates) برای اسناد PDF پویا(dynamic PDF documents) استفاده کنند.این زبان جالب، تحت مجوز GPL عرضه شده است و بر پایه یک کلاس PHP معروف به نام FPDF بنا شده است.FPDF کلاسی در PHP می باشد که به شما این امکان را می دهد که با به کارگیری مستقیم PHP، اسنادPDF بسازید.(بدین معنی که لازم نیست از کتابخانه PDFlib استفاده کنید.). مجوز PDFlib بدین گونه است که اگر بخواهید از PDFlib ،استفاده تجاری کنید،باید پول بپردازید! حرف F در ابتدای FPDF معنی FREE بودن آن را می دهد.

PDML هنوز در ابتدای راه است و نسخه نهایی آن عرضه نشده است. نسخه آزمایشی 0.9 آن را می توانید از اینجا دریافت کنید. در این نسخه ، سعی شده است که بیشتر امکانات کلاس FPDF فراهم شود. برای مشاهده چند نمونه برنامه ساده و اولیه سری به اینجا بزنید.
1383-02-19 22:32:25
علي خليلي
نويسنده:


مستند سازی برنامه های PHP

در فرآیند طراحی یک نرم افزار،اغلب نیاز به استفاده مجدد از کدهای نوشته شده قبلی می باشد.اگر برنامه شما یک سند(documentation) و راهنمای خوب داشته باشد،هم کار کدنویسی شما بهینه خواهد شد و هم به کاربران برنامه خود کمک می کنید که راحت تر از برنامه شما استفاده کنند و وقت کمتری هم صرف پاسخگویی به سوالات و اشکالات کاربران برنامه شما خواهد شد.

phpDocumentor یک ابزار مناسب برای مستند سازی برنامه های php شما می باشد.این برنامه می تواند مستقیما از source code پروژه php شما، سند بسازد. این برنامه از یکtemplating system گسترده استفاده می کند تا comment های نوشته شده در source code برنامه شما را به صورت خوانا برای شما در بیاورد.این سیستم به شما اجازه می دهد که در ۱۵ قالب از قبل طراحی شده HTML، فرمت PDF،فرمتCHM برای ویندوز و Docbook XML برای کدهای خود سند سازی کنید. همچنین شما می توانید خودتان برای آن، قالب بسازید. از این برنامه می توان به دو طریق خط فرمان(Command-Line) و واسط گرافیکی وب استفاده کرد. این برنامه امکانات بسیار زیاد دیگری هم دارد که می توانید برای مشاهده آنها سری به اینجا بزنید. جدیدترین نسخه این برنامه(۱.۳.۰) از اینجا قابل دریافت است.
1383-02-01 22:34:25
علي خليلي
نويسنده:


مقدمه ای بر کتابخانه کلاسADOdb در php

چرا از یک کتابخانه کلاس database استفاده کنیم؟

یکی از اشتباهات رایج افراد تازه کار ، این است که بدون نگاه به آینده به طراحی یک برنامه کاربردی می پردازند! هیچ چیزی غیرممکن نیست، فرض کنید که شما برنامه خود را برای یک database خاص مثلا MySQL طراحی کرده اید، روزی مدیر شرکت شما که علاقه خاصی به SQL-SERVER دارد، با تعجب از برنامه شما ایراد می گیرد و وقتی علت را جویا می شوید متوجه این مساله می شوید که برنامه شما انعطاف پذیر(flexible) نیست! شما مجبورید که تمام کدهای خود را مجددا بازنویسی کنید. مشکل کار کجاست؟راه حل چیست؟ شاید PHP مقصر باشد، چون از توابع مختلفی برای کار با database های مختلف استفاده می کند،یعنی توابع استانداردی در این زمینه ندارد. به هر حال تغییر و بازسازی برنامه برای هر database به صورت مجزا، مسلما کار ساده و مقرون به صرفه ای نیست!

اینجاست که یک کتابخانه کلاس که خوب طراحی شده باشد(مثل ADOdb) می تواند زندگی شما را ساده تر کند و به شما امکان دهد که با صرف حداقل توان خود، برنامه خود را برای هر DBMS ای مورد استفاده قرار دهید،بدون اینکه دست به توابع خود بزنید. تنها چیزی که نیاز دارید تغییر چند پارامتر است .ADOdb در حال حاضر از پایگاه های داده زیر پشتیبانی می کند:

MySQL, PostgreSQL, Interbase, Firebird, Informix, Oracle, MS SQL 7, Foxpro, Access, ADO, Sybase, FrontBase, DB2 and generic ODBC

در پست های بعدی به نحوه نصب و استفاده از کتابخانه کلاس ADOdb می پردازیم. برای آشنایی بیشتر حتما سری به این وب سایت بزنید و جدیدترین نسخه این برنامه را از اینجا دریافت کنید.
1383-02-04 22:35:25
علي خليلي
نويسنده:


استفاده از کتابخانه کلاس ADOdb-بخش اول

نصب ADOdb

نصب ADOdb بسیار ساده است. اول مطمئن شوید که نسخهPHP شما 4.0.4 یا بالاتر می باشد،در غیر این صورت حتما به فکرUpgrade کردن نسخه PHP خود باشید. سپس جدیدترین نسخه برنامه ADOdb را از وب سایت PHPEverywhere دریافت کنید. فایل دریافت شده را در یک دایرکتوری دلخواه Unpack کنید.(حتما برنامه را در جایی قرار دهید که دسترسی عمومی نداشته باشد،اگرچه فایلهای ضمیمه ای برنامه پسوند inc.php دارند و نمی توان محتویات آن را به صورت متنی مشاهده کرد!)

با قرار دادن کد سه خطی زیر و جایگزینی متغیرها با مقادیر مناسب،برنامه را تست می کنیم:

include("$adodb_path/adodb.inc.php");
$db = NewADOConnection("$database_type");
$db->Connect("$host", "$user", "$password", "$database_name");

حالا شما یک شیء اتصال به پایگاه داده را با موفقیت درست کرده اید( db$ ). شما می توانستید از ADONewConnection هم به جایNewADOConnection استفاده کنید.این دو نام به یک تابع مشابه اشاره دارد.نوع پایگاه داده(database_type) بستگی به DBMS شما دارد که می تواند یکی از مقادیر زیر باشد:

  • access (Microsoft Access/Jet)
  • ado (Generic ADO, the base for all the other ADO drivers)
  • ado_access (Microsoft Access/Jet using ADO)
  • ado_mssql (Microsoft SQL Server using ADO)
  • db2 (DB2)
  • vfp (Microsoft Visual FoxPro)
  • fbsql (FrontBase)
  • ibase (Interbase 6 or before)
  • firebird (Firebird)
  • informix72 (Informix databases before Informix 7.3)
  • informix (Informix)
  • maxsql (MySQL with transaction support)
  • mssql (Microsoft SQL Server 7)
  • mssqlpo (Portable mssql driver)
  • mysql (MySQL without transaction support)
  • mysqlt (MySQL with transaction support, identical to maxmysql)
  • oci8 (Oracle 8/9)
  • oci805 (Oracle 8.0.5)
  • oci8po (Oracle 8/9 portable driver)
  • odbc (Generic ODBC, the base for all the other ODBC drivers)
  • odbc_mssql (MSSQL via ODBC)
  • odbc_oracle (Oracle via ODBC)
  • oracle (Oracle 7)
  • postgres (PostgreSQL)
  • postgres64 (PostgreSQL 6.4)
  • postgres7 (PostgreSQL 7, currently identical to postgres )
  • sqlanywhere (Sybase SQL Anywhere)
  • sybase (Sybase)

    • اگر در اتصال به پایگاه داده با مشکل مواجه شده اید، حتما مسیر(path) برنامه و مقادیر سایر پارامترهای اتصال را چک کنید.پیشنهاد می کنم قبل از این کار، بدون به کارگیریADOdb یکبار اتصال خود را چک کنید.( ممکن است این چیزها واضح به نظر برسد اما توجه کنید که بیشتر وقت ما صرف درگیری با همین چیزهای واضح است پس قبل از شروع کار بیایید خیالمان را از بابت این چیزها راحت کنیم!)

    اتصال به پایگاه داده در برنامه های شما

    قبل از اینکه با عجله شروع کنید و چند خط بالا را به بالای تمام برنامه های خود اضافه کنید،بهتراست که یک قدم به عقب بردارید.هدف این کتابخانه این است که برنامه های کاربردی شما را انعطاف پذیر(flexible) و انتقال پذیر(portable) سازد،بنابر این باید به پارامترهای اتصال و مسیر برنامه ،توجه خاص داشت.مثلا اگر رمز عبور شما تغییر کرد، مجبور نباشید که در تک تک فایلها تغییر را اعمال کنید. پس بهتر است که اطلاعات مربوط به اتصال و مسیر برنامه را در يك فایل مجزا بنویسیم وآن فایل(در اینجا به نام db_data) را هم به صفحات خود ضمیمه کنیم:

    $database_type="mysql";
    $host = "localhost";
    $user = "username";
    $password = "password";

    $adodb_path = "مسير برنامه";

    ?>

    شما همچنین می توانید فایل db_data.inc.php را به صورت خودکار به همه برنامه های خود اضافه کنید.برای این کار به سراغ PHP.INI رفته و خط زیر را به آن اضافه کنید:

  • auto_prepend_file=c:/inetpub/wwwroot/db_data.inc.php

  • اگر خواستید که از یک اتصال پایدار(Persistent) استفاده کنید(این کار معمولا سرعت بیشتر برنامه های کاربردی را بالا می برد ) می توانید ازPConnect به جای Connect استفاده کنید.

    include("db_data.inc.php");
    include("$adodb_path/adodb.inc.php");
    $db = NewADOConnection("$database_type");
    $db->Connect("$host", "$user", "$password", "employees");
    ?>

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

            •
    1383-02-05 22:36:25
    علي خليلي
    نويسنده:


استفاده از کتابخانه کلاس ADOdb-بخش دوم

کار با توابع کتابخانه ای ADOdb

برای دریافت نتایج حاصل از عمل SELECT بر روی پایگاه داده،چند روش مختلف وجود دارد،یکی از این روش ها به صورت زیر است:

$sql = "SELECT surname, age FROM employees";
$rs = &$db->Execute($sql);
if (!$rs) {
print $db->ErrorMsg();
}
else {
while (!$rs->EOF) {
print $rs->fields[0].' '.$rs->fields[1].'
';
// fields[0] is surname, fields[1] is age
$rs->MoveNext(); // Moves to the next row
} // end while
} // end else

در مثال بالا rs->fields$ آرایه ای است که شامل نتایج query می باشد.شاخص(index) آرایه به صورت پیش فرض،عددی(numeric) است،اما اگر می خواهید از یک آرایه associative استفاده کنید(آرایه ای که می توان در آن از شاخص های رشته ای استفاده کردassociative نامیده می شود) باید قبل از اجرای query این حالت را به صورت زیر مشخص کنید:

$sql = "SELECT surname, age FROM employees";
$db->SetFetchMode(ADODB_FETCH_ASSOC);
$rs = &$db->Execute($sql);
if (!$rs) {
print $db->ErrorMsg();
}
else {
while (!$rs->EOF) {
print $rs->fields['surname']." ".$rs->fields['age']."
";
$rs->MoveNext(); // Moves to the next row
} // end while
} // end else

راه متداولی که برای دریافت نتایج یک query وجود دارد،دریافت هر سطر به صورت یک object می باشد.ADOdb تابعی به نام FetchNextObject دارد که به صورت خودکار نتایج سطر بعدی را می دهد:

$sql = "SELECT surname, age FROM employees";
$db->SetFetchMode(ADODB_FETCH_ASSOC);
$rs = &$db->Execute($sql);
if (!$rs) {
print $db->ErrorMsg();
}

// loop through results
while ($row = $rs->FetchNextObject()) {
// The field names need to be uppercase
print $row->SURNAME." ".$row->AGE."
";
}

عمل درج(INSERT) بسیار سریع و ساده است:

$sql = "INSERT INTO employees (surname, age) values ('Clegg','43')";
if (!($db->Execute($sql))) {
print 'Error inserting: '.$db->ErrorMsg().'
';
}

مزیت اصلی ADOdb در اینجا این است که اجازه می دهد که با استفاده از یکsyntax یکسان record ها را در پایگاههای داده مختلف درج کنید.(در حالت عادی این کار امکان پذیر نیست!) دو حالت استثنایی در اینجا وجود دارد که باید به آنها توجه کنید:

ا)تمام کاراکترهای quotes باید escape شوند(یک backslash قبل از آنها قرار گیرد)در غیر این صورت با خطای syntax مواجه خواهید شد.بعضی از پایگاههای داده برای درج رشته ها از (') و بعضی دیگر از('') استفاده می کنند،به خاطر این مساله به جای استفاده از تابع ()addslashes در php بهتر است که از تابع کتابخانه ای()qstr در ADOdb استفاده کنید.این تابع یک رشته را دریافت می کند و آن را بر اساس پایگاه داده مناسب فرمت بندی می کند.

۲) پایگاههای داده مختلف از فرمت های متفاوتی برای نوع داده date استفاده می کنند.ADOdb تابعی به نام ()DBDate دارد که یک date را به صورت Unix timestamp و یاISO(Y-m-d) دریافت می کند وآن را تبدیل به فرمت مناسب برای پایگاه داده مورد استفاده شما می کند.در زیر مثالی از به کارگیری این دوتابع آورده شده است:

$employee_surname = $db->qstr("d'Angelo");
$arrival_time = $db->DBDate(time());
// The above two functions also add the enclosing //quotes, so, $arrival_time, not '$arrival_time'
$sql = "INSERT INTO employee_arrival (arrival_time,surname) values ($arrival_time,$employee_surname)";
if (!($db->Execute($sql))) {
print 'Error inserting: '.$db->ErrorMsg().'
';
}

مطالب گفته شده، مطالبی مقدماتی برای آشنایی با روش کار ADOdb بود. از اینجا به بعد همه چیز به شما بستگی دارد! پیشنهاد می کنم که سری به وب سایت PHPEveryWhere بزنید و documentation های کامل این برنامه را مطالعه کنید.(تجربه سالم هیچ ضرری ندارد!)
1383-02-06 22:36:25
علي خليلي
نويسنده:


نمايش ۵ مراجعه کننده آخر سايت

در این قسمت به ساخت برنامه ای برای نمایش مراجعه کننده آخر سایت می پردازیم. با استفاده از php و MySQL نوشتن این برنامه بسیار ساده است. قبل از هر کاری باید یک Table ساده درست کنیم تا لینک های ورودی را در آن ذخیره کنیم. ساختار Table ما به صورت زیر است:

 <!-- create the following table in phpmyadmin -->

CREATE TABLE referers (
id INT (10) not null AUTO_INCREMENT,
site VARCHAR (255),
time INT (10),
PRIMARY KEY (id)
);
حالا به نوشتن اصل برنامه می پردازیم .ادیتور خود را باز کرده، کد زیر را در آن وارد کنید وآن را با نام refs.php ذخیره کنید:

<?php

$db_host = "localhost";
$db_username = "username";
$db_password = "password";
$db_name = "database_name";

$ref = $_SERVER['HTTP_REFERER'];
$domain = explode("www.", $_SERVER['SERVER_NAME']);

mysql_connect($db_host,$db_username,$db_password) or die(mysql_error());
mysql_select_db($db_name) or die(mysql_error());

if ($ref != "")
{
if (!eregi($domain[1], $ref))
{

    $time = time();

    $addref = "INSERT INTO referers (site, time) VALUES ('$ref', '$time')";
    mysql_query($addref);
  }
}

function show_refs()
{
   $getref = "SELECT * FROM referers ORDER BY time DESC LIMIT 5";
   $reflist = mysql_query($getref);

   echo "<b>Last 5 Referers:</b><br>\n";

   while($r=mysql_fetch_array($reflist))
{
   $site = $r['site'];

   echo "<a target=\"_blank\"  href= \"$site\" >$site</a><br>\n ";
  }
}

?>
تحلیل کد:محور اصلی این برنامه،استفاده از متغیر $_SERVER['HTTP_REFERER'] می باشد.
این متغیر، آدرس سایتی را که کاربر از طریق آن وارد سایت ما شده است را،در بر دارد. نکته ای که در برنامه باید رعایت شود،مساله کاربران خودی( کاربرانی که در حال گردش در سایت ما می باشند) است. با استفاده از متغیر $_SERVER['SERVER_NAME'] و انجام یک مقایسه ساده،از نمایش آدرس وب سایت خود جلوگیری می کنیم. تابع explode برای جداسازی از یک رشته استفاده می شود، پارامتر اول تابع به عنوان جدا کننده(seperator) می باشد.نتیجه به عنوان یک آرایه از رشته های جدا شده برگردانده می شود. بقیه برنامه،یک INSERT ساده و یک SELECT با محدودیت 5 رکورد می باشد.

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

 // add this to the top of your homepage

<?  include("refs.php");  ?> ?>

سپس تابع show_refs را در محل مناسب برای نمایش ،فراخوانی کنید:

 //then where you want to show the list use:

<? show_refs(); ?> ?>
برنامه تمام شد،به همین راحتی! smiley بهتر است که به فکر افزودن امکانات بیشتری به برنامه خود باشید.مثلا یک برنامه ساده برای آمارگیری بنویسید تا با شمردن تعداد لینک های ورودی،شما را از بیشترین مراجعه کنندگان آگاه سازد. یا با به کارگیری متغیرهای Server اطلاعات بیشتری از کاربران خود،کسب کنید.در زیر دو متغیر مهم و کاربردی دیگر معرفی شده اند:

$_SERVER['REMOTE_ADDR'] :The IP address from which the user is viewing the current page.

$_SERVER['HTTP_USER_AGENT']:header from the current request, if there is one. This is a string denoting the user agent being which is accessing the page. A typical example is: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Among other things, you can use this value with get_browser() to tailor your page's output to the capabilities of the user agent.

1383-02-21 22:37:25
علي خليلي
نويسنده:


Phuse : جستجوگر مخصوص PHP کارها

Phuse مخفف PHP Unfied Search Engine می باشد.این موتور جستجو مخصوص PHP کارها طراحی شده است.این جستجوگر هنوز در مرحله آزمایش و تکمیل می باشد.شما می توانید نسخه BETAی آن را در اینجا ببینید.در حال حاضر با استفاده از این موتور جستجو می توانید داخل ۵ وب سایت زیر به جستجو بپردازید:

  1. PHPDeveloper.org (news)
  2. PHPComplete.com (tutorials)
  3. EvilWalrus.com (code)
  4. Forums.Devnetwork.net (forums)
  5. PHPClasses.org (classes)

برای کسب اطلاعات بیشتر سری به اینجا بزنید.
1383-02-15 22:39:25
علي خليلي
نويسنده:


ساخت فايلهای PDF در PHP

در این مقاله به معرفی یکی از قابلیت های PHP ، که ساخت فایلهای PDF می باشد،می پردازیم.PDF مخفف Portable Document Format می باشد که توسط شرکت Adobe عرضه شده است.ساخت اسناد PDF توسط کتابخانه PDFlib انجام می شود. برای استفاده از extension مربوط به PDFlib باید به فایل PHP.INI رفته و آن را فعال کنید.(این کار با برداشتن سمیکالن ';' از ابتدای آن انجام می شود. توجه کنید که مسیر مربوط به extension ها را در PHP.INI درست وارد کرده باشید!)

ساخت یک سند PDF در چهار مرحله انجام می شود:

  1. ساخت یک Handle برای کار با سند
  2. تعیین فونت ها و رنگ های سند
  3. انجام عملیات نوشتن و رسم بر روی Handle با استفاده از توابع از پیش تعریف شده
  4. ذخیره سند نهایی

حالا مرحله به مرحله به ساخت یک سند PDF ساده می پردازیم:

در مرحله اول باید یک Handle برای سند خود درست کنیم که این کار توسط تابع ()pdf_new انجام می شود:

$pdf = pdf_new();

برای انجام عملیات مختلف بر روی سند،از این Handle استفاده خواهیم کرد. بعد از این کار،باید نام فایل PDF خود را تعیین کنیم که این کار توسط تابع ()pdf_open_file انجام می شود:

pdf_open_file($pdf, "HelloWorld.pdf");

وقتی فایل جدید را ساختید،می توانید داخل آن به ساخت صفحات PDF بپردازید:

// start a new page (A4)
pdf_begin_page($pdf, 595, 842);

با استفاده از تابع ()pdf_begin_page اندازه صفحات را مشخص می کنیم.واحد اندازه ها در اینجا Points می باشد که هر Point برابر ۱.۷۲ اینچ می باشد. برعکس این تابع، تابع ()pdf_end_page می باشد که بعد ازتمام شدن کار نوشتن صفحات،آنها را می بندد.

در مرحله دوم برای نوشتن در صفحات ابتدا نوع فونت مورد نظر را انتخاب می کنیم.این کار توسط تابع ()pdf_find_font انجام می شود.این تابع ۳ پارامتر دارد که اولی نوع فونت را مشخص می کند،دومی encoding مورد استفاده را معلوم می کند و سومی ،یک متغیر Boolean می باشد که مشخص می کند که آیا فونت در سند مربوطه ضمیمه شود یا خیر.بعد از این کار با استفاده از تابع ()pdf_setfont و مشخص کردن اندازه فونت، از فونت استفاده می کنیم :

$arial = pdf_findfont($pdf, "Arial", "host", 1); pdf_setfont($pdf, $arial, 10);

در مرحله سوم،حالا که فونت مشخص شد، با به کارگیری تابع ()pdf_show_xy و دادن مختصات و متن مورد نظر،آن رادر صفحه نمایش می دهیم:

pdf_show_xy($pdf, "Hello,World!",50, 750);
pdf_show_xy($pdf, "This is My first PDF document!", 50,730);

بعد از این که کار نوشتن در صفحه تمام شد، با استفاده از تابع()pdf_end_page صفحه را می بندیم:

pdf_end_page($pdf);

در مرحله چهارم، سند نهایی را با استفاده از تابع ()pdf_close ذخیره می کنیم:

pdf_close($pdf);

به همین راحتی یک سند بسیار ساده PDF ساختیم. توابع کتابخانه ای بسیار زیادی وجود دارند که اجازه انجام عملیات مختلف روی یک سند PDF را به ما می دهند.بهتر است برای کسب اطلاعات بیشتر،سری به اینجا بزنید.

<?php
// create handle for new PDF document
$pdf = pdf_new();
// open a file
pdf_open_file($pdf, "HelloWorld.pdf");
// start a new page (A4)
pdf_begin_page($pdf, 595, 842);
// get and use a font object
$arial = pdf_findfont($pdf, "Arial", "host", 1); pdf_setfont($pdf, $arial, 20);
// print text
pdf_show_xy($pdf, "Hello,World!",50, 750);
pdf_show_xy($pdf, "This is My first PDF document!", 50,730);
// end page
pdf_end_page($pdf);
// close and save file
pdf_close($pdf);
?>

﻿
1383-02-22 22:40:25
علي خليلي
نويسنده:


CMS به شرط چاقو !

امروزه تمایل اکثر مدیران وب سایت ها به سمت برنامه های مدیریت محتوا (Content Management System) می باشد. برنامه های مدیریت محتوا این امکان را می دهد که افراد غیر آشنا با برنامه نویسی وب هم بتوانند به تولید محتوا بر روی وب بپردازند. این برنامه ها مثل یک لایه انتزاعی (abstract) عمل می کنند و خلل ناشی از آشنا نبودن با برنامه نویسی وب را برطرف می کنند. برنامه های مدیریت محتوا را می توان به چند دسته تقسیم کرد:

CMS - Portals :بازار این دسته از CMS ها امروزه بسیار پر رونق است. نمونه بارز این نوع از CMS ها برنامه معروف PHP-Nuke می باشد، که تقریبا معرف حضور اکثر کاربران وب ایران می باشد. این نوع از CMS ها کلکسیون کاملی از نیازهای یک وب سایت دینامیک را شامل می شود. به عنوان مثال می توان به انجمن(forum)، سیستم کاربری(Membership)، سیستم مدیریت اخبار و مقالات، بخش Download و .... اشاره کرد. معمولا این نوع از CMS ها طوری طراحی می شوند که قابلیت ارتقا و افزودن امکانات سفارشی را از طریق ماژول ها(Modules) فراهم می آوردند.

CMS - Blogs : این دسته از CMS ها ، برنامه های مدیریت وبلاگ هستند و در مقایسه با دسته بالا از امکانات کمتری برخوردارند و کمتر قابلیت گسترش با استفاده از ماژول ها را دارند. به عنوان یک نمونه بارز از این دسته،می توان از Pmachine نام برد.

CMS - e-Commerce : این نوع از CMS ها برای تجارت الکترونیکی به کار گرفته می شوند. این برنامه ها امکاناتی مثل صدور کارت خرید و نمایش کالاها و دسته بندی آنها و... را شامل می شوند که در ایران هنوز مورد استفاده چندانی پیدا نکرده اند.به عنوان یک نمونه از CMS ها می توان از OSCommerce نام برد.

CMS - Forums : این برنامه ها که به عنوان انجمن یا تالار گفتگو شناخته می شوند، امروزه کاربرد بسیار زیادی پیدا کرده اند. نمونه بارز این نوع CMS ها برنامه مشهور و قدرتمند PHPBB می باشد. ای نوع از CMS ها برای سوال و جواب و رفع اشکالات کاربران در زمینه های موضوعی مختلف مورد استفاده قرار می گیرند.

از دیگر برنامه های مدیریت محتوا می توان به CMS - Groupware و CMS - e-Learning و ... اشاره کرد.

اگر جزو علاقمندان استفاده از سیستم های مدیریت محتوای باز متن (Open Source)هستید، پیشنهاد می کنم به خاطر این که تنوع محصول در این زمینه بسیار زیاد است ،اول آزمایش کنید سپس انتخاب کنید.شاید نام فرمول 6P به گوشتان خورده باشد:Proper Prior Planning Prevents Poor Performance: برنامه ریزی قبلی مانع عملکرد ضعیف می شود. ابتدا خواسته های خود را در نظر بگیرید سپس بهترین محصول برای تامین نیاز خود را انتخاب کنید.

اگر می خواهید CMS مورد نظر خود را به شرط چاقو انتخاب کنید حتما سری به وب سایت OpenSourceCMS بزنید. شما با عضویت در این وب سایت می توانید به عنوان مدیر(Administrator) وارد تک تک سیستم های مدیریت محتوا شوید و آنها را امتحان کنید. همچنین از طریق این وب سایت می توانید هر روز در جریان اخبار مربوط به برنامه های مدیریت محتوای بازمتن قرار بگیرید.

Try Before You ....Install !
1383-02-28 22:42:25
علي خليلي
نويسنده:


نمايش تعداد بازديدكنندگان ديروز ، امروز و كل

در اين قسمت به ساخت يك شمارنده ساده (Hit Counter) با استفاده از php و MySQL مي پردازيم.
قبل از هر چيز با كمك PhpMyAdmin جدولي با ساختار زير ايجاد كنيد:

 # Table structure for table `counter`
#

CREATE TABLE `counter` (
  `id` tinyint(4) NOT NULL default '1',
  `total` bigint(20) unsigned NOT NULL default '0',
  `yesterday` int(10) unsigned NOT NULL default '0',
  `today` int(10) unsigned NOT NULL default '0',
  `date` date default NULL
) TYPE=MyISAM;

#
# Dumping data for table `counter`
#

INSERT INTO `counter` VALUES (1, 0, 0, 0, NOW());
اين جدول شامل يك فيلد مشخصه، سه فيلد براي شمارش بازديدها و يك فيلد براي تاريخ مي باشد.توجه داشته باشيد كه اين جدول، يك record بيشتر ندارد و عمليات بر روي جدول با Update كردن همين ركورد انجام مي شود. به عنوان پيش فرض مقادير صفر و همچنين تاريخ جاري را در اين ركورد ثبت مي كنيم.
حالا كه ساختار ذخيره داده ها را مشخص كرديم به نوشتن كد برنامه مي پردازيم:
//اطلاعات لازم براي اتصال به پايگاه داده
$db_user="username";
$db_pass="password";
$db_name="MyDB";
//اتصال به پايگاه داده
$con=mysql_connect('localhost',$db_user,$db_pass);
mysql_select_db($db_name,$con);
اولين مرحله كار ، اتصال به پايگاه داده مي باشد.در كد بالا بايد اطلاعات مربوط به اتصال را به درستي وارد كنيد و الا اجراي برنامه در همين جا متوقف خواهد شد!
//دريافت نتايج از جدول
$result=mysql_query("SELECT * FROM counter");
$row=mysql_fetch_array($result);
$total=$row['total'];
$yesterday=$row['yesterday'];
$today=$row['today'];
$date=$row['date'];
list($year,$month,$day)=split('-',$date);
در اين مرحله اطلاعات قبلي ذخيره شده در پايگاه داده را بازيابي مي كنيم. تابع split رشته اي را به عنوان آرگومان دوم خود دريافت كرده و طبق آرگومان اول كه حاوي كاراكتر جداكننده مي باشد آن را تقسيم مي كند و نتيجه را در آرايه اي به ما برمي گرداند. دستورlist عناصر آرايه را به متغيرهاي ليست، نسبت مي دهد.
 $CurrentDate=date("Y-m-d"); //زمان جاري
list($CurrentYear,$CurrentMonth,$CurrentDay)=split('-',$CurrentDate);
در اين قسمت با استفاده از تابع date زمان جاري را بدست مي آوريم.توجه داشته باشيد كه آرگومان اين تابع فرمت دريافت تاريخ را مشخص مي كند.
 //تابع به روزرساني جدول
function Update($today,$yesterday,$total,$date){
    mysql_query("UPDATE counter SET today='$today',yesterday='$yesterday',total='$total' ,date='$date' WHERE id=1");
}
تابع Update وظيفه به روزرساني جدول را بر عهده دارد.اين تابع ، مقادير فيلدها را بر اساس پارامترهاي دريافتي تنظيم مي كند.
 //مقايسه تاريخ جاري با تاريخ ذخيره شده در جدول و انجام محاسبات لازم
$total++;
if($CurrentYear==$year){
    if($CurrentMonth==$month){
        if($CurrentDay==$day){
            $today++;
            Update($today,$yesterday,$total,$CurrentDate);
        }else{
            if($CurrentDay==++$day){
                $yesterday=$today;
                $today=1;
                Update($today,$yesterday,$total,$CurrentDate);
            }else{
                $yesterday=0;
                $today=1;
                Update($today,$yesterday,$total,$CurrentDate);
            }
        }
    }else{
        if($CurrentMonth==++$month){
            $yesterday=$today;
            $today=1;
            Update($today,$yesterday,$total,$CurrentDate);
        }else{
            $yesterday=0;
            $today=1;
            Update($today,$yesterday,$total,$CurrentDate);
        }
    }

}
else{
    if($CurrentYear==++$year){
        $yesterday=$today;
        $today=1;
        Update($today,$yesterday,$total,$CurrentDate);
    }
    else{
    $yesterday=0;
    $today=1;
    Update($today,$yesterday,$total,$CurrentDate);
    }
}
هسته اصلي برنامه، قسمت بالا مي باشد.اين قسمت در واقع تمرين ساختارهاي شرطي تو در تو مي باشد. دستورات مقايسه اي زمان جاري را با زمان ذخيره شده قبلي مقايسه مي كنند و طبق آنها عمل شمارش را انجام مي دهند.سپس با استفاده از تابع Update عمل به روزرساني جدول صورت مي گيرد.
 //بازيابي مجدد اطلاعات از جدول
$result=mysql_query("SELECT * FROM counter");
$row=mysql_fetch_array($result);
$total=$row['total'];
$yesterday=$row['yesterday'];
$today=$row['today'];
در آخر كار، يك پرس و جوي ديگر انجام مي دهيم و اطلاعات به روز شده را دريافت مي كنيم و در متغيرهاي مربوطه درج مي كنيم.براي نمايش شمارنده، به صورت زير عمل مي كنيم:
 //نمايش شمارنده
echo "today:<strong>$today</strong><br>";
echo"yesterday: <strong> $yesterday</strong><br>";
echo"total:<strong> $total</strong>";
حالا مي توانيد كدهاي بالا را در فايلي به نام counter.php ذخيره كنيد و آن را آزمايش كنيد. با استفاده از كد زير مي توانيد اين فايل را به صفحه اصلي سايت خود ضميمه كنيد:
<?php
include_once("counter.php");
?>
فايل سورس برنامه به همراه ساختار جدول از اينجا قابل دريافت است.
به خاطر درگيري با امتحانات پايان ترم( huh) خيلي نتونستم به جزئيات بپردازم.اميدوارم كه با نوشتن اين برنامه، چيز جديدي ياد گرفته باشيد cool
اگر نظر خاصي براي بهبود برنامه داريد يا اينكه ايرادي در برنامه مي بينيد، حتما در بخش نظرات بنويسيد wink

1383-03-31 22:43:25
علي خليلي
نويسنده:


با FuseBox ، متفاوت برنامه بنويسيد!

FuseBox یک چارچوب(framework) استاندارد برای طراحی برنامه های کاربردی تحت وب می باشد.

یکی از مسائل مهم در طراحی یک برنامه کاربردی مبتنی بر وب ، آینده نگری می باشد. برنامه ای که می نویسید باید قابلیت ارتقا و افزودن امکانات جدید با حداقل تغییر در سورس کد برنامه را داشته باشد. برای آسودگی در آینده باید از همین امروز شروع کرد! FuseBox یک روش(Methodology) برای ساخت برنامه های تحت وب می باشد. این روش همانطور که از نامش پیداست، بر مبنای جعبه فیوز شبیه سازی شده است! در یک جعبه فیوز، اگر یک فیوز بسوزد و یا از کار بیفتد، خللی در کاربقیه فیوزها ایجاد نمی کند. هر فیوز کاری تعریف شده و مختص خود دارد و فیوز A برای انجام وظیفه خود نیازی به کمک فیوزهای B ,C ,D ندارد.

در حال حاضر بیش از 23688 نفر در سراسر دنیا بر مبنای روش FuseBox برنامه سازی می کنند. نسخه های مختلفی از FuseBox برای برنامه نویسی با PHP ,ASP,J2EE , ColdFusion وجود دارد.

نحوه كار با FuseBox : برای ساخت یک برنامه کاربردی ،طراح ، برنامه خود را به مجموعه ای از عملیات (Fuseactions ) تقسیم می کند سپس صفحات و اسکریپت ها(Fuses) را طراحی کرده و آنها را به همراه هم ،در یک دایرکتوری(Circuit) قرار می دهد. Fuse ها انواع مختلفی دارند:

  • Display Fuses : این فیوزها که با پیشوند dsp آغاز می شوند برای نمایش اطلاعات به کاربر استفاده می شوند.
  • Select Query Fuses : با پیشوند qry شروع می شوند و دستورات پرس و جوی انتخاب را شامل می شوند
  • Action Query Fuses : با پیشوند act آغاز می شوند و دستورات پرس و جوی UPDATE ، INSERT و DELETE را شامل می شوند.
  • Location Fuses : این فیوزها با پیشوند url آغاز می شوند و برای فرستادن برنامه به یک آدرس جدید، مورد استفاده قرار می گیرند.

این مطلب فقط برای آشنایی با روشFuseBox بود. برای دریافت خود برنامه و مقالات مرتبط با آن سری به وب سایت رسمی FuseBox بزنید:

http://fusebox.org
1383-04-07 22:45:25
علي خليلي
نويسنده:


CPG-Nuke : رقيبي سرسخت براي PHP-Nuke

CPG-Nuke یک برنامه مدیریت محتوای(CMS/Portal) باز متن می باشد. این برنامه بهینه شده PHP-Nuke می باشد و امکانات فوق العاده ای دارد. به نظر من ، CPG-Nuke یکی از کاملترین سیستم های Portal در حال پیشرفت است. یکی از مزایای اصلی این برنامه پشتیبانی کامل از یونیکد(UTF-8) می باشد که مشکل زبان را حل کرده است. به گفته طراحان این برنامه،CPG-Nuke در مقایسه با PHP-Nuke از نظر سرعت10x افزایش داشته و همچنین %30 از نظر کاهش کدهای توابع عمومی پایه بهینه شده است! همچنین سرعت ارتباط با پایگاه داده با بهینه سازی Query ها افزایش چشمگیری دارد. از نظر امنیتی هم این برنامه در برابر بیشتر حملات، ایمن و مطمئن می باشد.

در داخل CPG-Nuke یک آلبوم تصاویر قدرتمند به نامCoppermine Photo Gallery قرار دارد که امکانات بسیار زیادی را برای کاربران فراهم می کند. در این برنامه استفاده از BBCODE هم در پست ها، پیشرفت های زیادی کرده است.

اگر به دنبال یک سیستم وب پورتال می گردید، درنگ نکنید و سری به وب سایت رسمی CPG-Nuke بزنید و جدید ترین نسخه این برنامه(۸.۲) را باحجم ۱.۶۶ مگابایت از آنجا دریافت کنید.
1383-04-08 22:46:25
علي خليلي
نويسنده:


ساخت يك كلاس Timer ساده

در اين قسمت به ساخت يك كلاس Timer مي پردازيم كه كاربردهاي زيادي مي تواند داشته باشد.براي مثال براي اندازه گيري زمان ايجاد يك صفحه (Page Generation Time) كه در آن Query هاي زيادي وجود دارد، مي توان از اين كلاس استفاده نمود و با بهينه سازي اين Query ها، زمان ايجاد صفحه را كاهش داد. در زير كد مربوط به اين كلاس آورده شده است:

 // Class:     microTimer
// Description: calculates the micro time

class microTimer {
    function start() {
        global $starttime;
        $mtime = microtime ();
        $mtime = explode (' ', $mtime);
        $mtime = $mtime[1] + $mtime[0];
        $starttime = $mtime;
    }
    function stop() {
        global $starttime;
        $mtime = microtime ();
        $mtime = explode (' ', $mtime);
        $mtime = $mtime[1] + $mtime[0];
        $endtime = $mtime;
        $totaltime = round (($endtime - $starttime), 5);
        return $totaltime;
    }
}
تحليل كد: اين كلاس دو متد (تابع عضو) شروع و پايان دارد كه دقيقا كار يك زمان سنج را انجام مي دهد. تابع ()microtime يكي از توابع پركاربردphp مي باشد كه زمان را به صورت رشته"msec sec" بر مي گرداند كه sec زمان جاري اندازه گيري شده از مبدا زمان UNIX مي باشد.(0:00:00 January 1, 1970 GMT)
msec هم بخش مربوط به مايكرو ثانيه مي باشد. توسط تابع explode و مشخص كردن كاراكتر جداكننده اين دوبخش را از هم جدا مي كنيم و در آرايه اي قرار مي دهيم. با جمع كردن اين دو بخش، زمان جاري را به صورت مايكرو ثانيه بدست مي آوريم. پارامتر دوم تابع ()round ،مشخص مي كند كه عدد اعشاري مورد نظر تا چند رقم round شود.
استفاده از كلاس Timer :براي اندازه گيري زمان ايجاد يك صفحه، در ابتداي آن كد زير را مي نويسيم و يك Object از روي class خود ايجاد مي كنيم:
 //در قسمت آغازين كد برنامه شما
$Timer = new microTimer;
$Timer->start();
در انتهاي برنامه خود هم تابع stop از كلاس Timer را فراخواني مي كنيم:
 //در انتهاي كد برنامه
echo"<!-- execution time: ".$Timer->stop()." -->";

1383-04-09 22:47:25
علي خليلي
نويسنده:


Jetbox : مدیریت محتوا با استفاده ازBox ها

Jetbox یکی دیگر از سیستم های مدیریت محتوا(CMS) تحت وب می باشد که توسط php و MySQL نوشته شده است.این برنامه تحت مجوز GPL و مجانی می باشد. Jetbox یک سیستم Portal محسوب نمی شود زیرا امکانات خیلی کمی برای ارتباط متقابل کاربران و مدیران سایت فراهم می کند . از امکانات برجسته این نرم افزار می توان رابط گرافیکی قدرتمند بخش مدیریت(Control Panel) آن را نام برد که بسیار استادانه و زیبا طراحی شده است. JetBox یک برنامه Module Oriented به شمار می آید. این سیستم مدیریت محتوا از کتابخانه هایی مثل JPGraph و phpdig و phpthumb و ... بهره می برد که پشتوانه محکمی را برای این برنامه ایجاد کرده اند. شاید مهمترین ویژگی این برنامه همانطور که از اسم آن معلوم است ٬ قالب پذیر بودن آن باشد. شما می توانید به تعداد دلخواه Box به صفحه وب خود اضافه کنید و به مدیریت محتوای این BOX ها بپردازید. از جمله ماژول های پیش فرض در این برنامه می توان به News - Links-Contacts-Events اشاره کرد. جدیدترین نسخه این برنامه(۲.۰.۸) با حجم ۱.۳۲ مگابایت از اینجا قابل دریافت است. برای کسب اطلاعات بیشتر در مورد JetBox به اینجا مراجعه کنید.
1383-04-23 22:48:25
علي خليلي
نويسنده:


آشنايي با ext/mysqli در PHP5-قسمت اول

چرا از ext/mysqli استفاده کنیم؟

يكي از ويژگي هاي جالبي كه در 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 كنيد و از اين به بعد با اين ماژول كار كنيد:

    1. سرعت بيشتر
    2. امنيت بيشتر

حرف i در انتهاي ext/mysqli به معناي ,improved, interface, ingenious, incompatible incomplete مي باشد!
1383-07-05 10:25:26
علي خليلي
نويسنده:


آشنايي با ext/mysqli در PHP5-قسمت دوم

نحوه کار با 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
", 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:
");

/* Fetch the results of the query */
while( $row = mysqli_fetch_assoc($result) ){
printf("%s (%s)
", $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
", 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:
");

/* Fetch the results of the query */
while( $row = $result->fetch_assoc() ){
printf("%s (%s)
", $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
", 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.
", $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.
", $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
", 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
", $col1, $col2);
}

/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();

?>
1383-07-05 09:19:26
علي خليلي
نويسنده:


تقويم هجري شمسي در PHP

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

این تقویم از توابع تبدیل تاریخ میلادی به جلالی (jdf) که توسط گروه پروژه های فارسی ارائه شده،استفاده می کند. فایل مربوط به تقویم از اینجا قابل دریافت است.

توضیحی در مورد کد برنامه: کدنویسی این برنامه کار ساده ای است. برای ساخت جدول تقویم،باید ابتدا اولین روز هر ماه را پیدا کنیم و سپس به اندازه آن در جدول خانه خالی درج کنیم(توجه کنید که هر سطر جدول ۷ ستون دارد ) در ادامه بسته به ماه مربوطه(۳۱،۲۹ و یا ۳۰ روزه) بقیه روزها را در جدول درج می کنیم و جدول را می بندیم.(فقط مساله ای که وجود دارد سالهای کبیسه مثل امسال است که باید لحاظ شود.) برای حرکت بین ماههای مختلف از ارسال پارامترها به روش GET استفاده می کنیم. این توضیح کلی نحوه ساخت تقویم جلالی بود.برای مشاهده جزئیات کار به کد منبع برنامه مراجعه کنید.

1383-07-09 10:34:29
علي خليلي
نويسنده:


كاملترين مجموعه نصب PHP روي Windows!?

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

WinLAMP: WinLAMP Is Not LAMP یکی از کاملترین بسته های ارائه شده برای نصب PHP می باشد. این بسته نرم افزاری شامل ابزارهای اضافی مختلفی برای کار با MySQL می باشد.از جمله این ابزارها می توان به DBManager ، MySQL -Front و SQLyog اشاره کرد.

(WinLAMP? Windows+Apache+MySQL+PHP is not Linux+Apache+MySQL+PHP: WinLAMP)

برنامه نصب کننده winlamp حجمی حدود ۶۰ مگابایت دارد ولی شامل بیش از ۱۴۴ مگابایت برنامه های به درد بخور است.این برنامه از اینجا قابل دریافت است.

این برنامه شامل جدیدترین راهنمای (manual) استفاده PHP-MySQL-Apache نیز می باشد که مورد نیاز هر برنامه ساز PHP می باشد.اگر امکان دریافت این برنامه را دارید حتما امتحانش کنید و آن را با برنامه های دیگر مقایسه کنید!
1383-07-12 07:50:30
علي خليلي
نويسنده:


توابع جديد در PHP 5

امروز که داشتم لیست توابع جدید اضافه شده در PHP 5 را می دیدم متوجه توابع کاربردی جالبی شدم که تصمیم گرفتم چند تا از اونا رواینجا معرفی کنم:

تابع array_combine یکی از این توابع می باشد که دو آرایه را به عنوان ورودی می پذیرد و سپس با ترکیب این دو آرایه یک آرایه جدید می سازد و آن را برمی گرداند،بدین صورت که آرایه اول به عنوان اندیس ها (Keys) و آرایه دوم به عنوان مقادیر (Values) آرایه جدید می باشد.اگر طول دو آرایه ورودی با هم برابر نباشد یا خالی باشند، این تابع مقدار FALSE را بر می گرداند.به مثال زیر توجه کنید:

$a = array('green', 'red', 'yellow');
$b = array('avocado', 'apple', 'banana');
$c = array_combine($a, $b);

print_r($c);

خروجی:

Array
(
    [green]  => avocado
    [red]    => apple
    [yellow] => banana
)

تابع کاربردی دیگرarray_walk_recursive  می باشد. این تابع دو پارامتر ورودی دارد:اولی یک آرایه و دومی یک تابع . نحوه کار این تابع بدین صورت است که به همه اعضای آرایه دریافتی،تابع ورودی(پارامتر دوم) را به صورت بازگشتی اعمال می کند.این تابع در صورت اجرای موفق مقدار TRUE و در غیر این صورت FALSE را برمی گرداند. نکته مهم در استفاده از این تابع این است که پارامتر اول این تابع یعنی آرایه مورد نظر به صورت ارجاع مستقیم است و تغییرات اعمال شده مستقیما بر خود آرایه اثر می کنند و مقادیر آن را تغییر می دهند. برای فهم بهتر به مثال زیر توجه کنید:

$sweet = array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');

function test_print($item, $key)
{
    echo "$key holds $item ";
}

array_walk_recursive($fruits, 'test_print');

خروجی:

a holds apple
b holds banana
sour holds lemon

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

1383-07-15 19:55:06
علي خليلي
نويسنده:


چگونه 1000 مگابايت GMail را پر كنيم؟!

اگه به شما یک گیگابایت فضای رایگان روی اینترنت داده بشه،چیکار می کنید؟ قطعا، اولین چیزی که به ذهنتون میرسه اینه که چطوری پرش کنید و نهایت استفاده رو از اون ببرید!

با اومدن پدیده ای به نام GMail ، برنامه نویسان وب به سرعت دست به کار شدند و به فکر استفاده از این فضای رایگان افتادند.برای نمونه می شه از GMail FS برای لینوکس و GMail Drive shell extension برای ویندوز نام برد. در این قسمت قصد دارم برنامه ای رو به اسم Goollery معرفی کنم که با PHP نوشته شده و باعث میشه که به نیمه خالی لیوان GMail توجه بیشتری کنید!

Goollery is a GMail based photo gallery. You can upload pictures from a website. The pictures will automatically be stored in your gmail accout.

Goolley یک برنامه آلبوم تصاویر است که از فضای رایگان GMail برای ذخیره تصاویر خود استفاده می کند.برای استفاده از این برنامه به امکانات زیر نیاز دارید:

  • GMail account
  • PHP
  • *libmailer (gmail-lite project)
  • ImageMagick

*GMailer یا libgmailer یک کلاس PHP می باشد که به شما این امکان را می دهد تا از طریق اسکریپت های PHP به GMail دسترسی داشته باشید.برای کسب اطلاعات بیشتر در مورد GMailer اینجا را کلیک کنید.

نسخه آزمایشی Goolley در اینجا قابل مشاهده است. یکی از اشکالات این برنامه سرعت بسیار پایین آن است که طبیعی است! این برنامه هنوز در مرحله آزمایش است و به گفته طراحان آن:This is just a proof on concept!
این برنامه از اینجا قابل دریافت است.
1383-07-19 21:57:24
علي خليلي
نويسنده:


آشنايي با Prado Framework

PRADO یک چارچوب(framework) برای ساخت برنامه های کاربردی تحت وب در PHP 5 می باشد. نحوه کار Prado برمبنای رویدادها(event-driven) و مولفه های آماده(component-based) می باشد.ساخت یک Web Appllication توسط Prado شامل مراحل زیر است:

  • نمونه سازی از مولفه های از قبل ساخته شده(instantiating prebuilt component types)
  • پیکربندی آنها توسط تنظیم ویژگیهای آنها(setting their properties)
  • پاسخ به رویدادهای مربوط به آنها با نوشتن توابع اداره کننده رویداد(handler functions)
  • قرار دادن مولفه ها در صفحات مورد نظر

روند طراحی در PRADO بسیار شبیه ابزارهای توسعه سریع(RAD toolkits) مثل Delphi و Visual Basic می باشد. برای درک نحوه کار Prado Framework ،فرض کنید که می خواهیم یک صفحه ورود کاربران(login page) بسازیم.مراحل زیر را دنبال می کنیم:

  1. از دو مولفه TTextBox و یک مولفه TButton برای دریافت ورودی نام کاربر،رمز عبور و دکمه submit استفاده می کنیم.
  2. خصوصیت TextMode مربوط به مولفه رمز عبور را با Password تنظیم می کنیم.
  3. یک تابع login برای رویداد OnClick مولفه دکمه می نویسیم.
  4. این مولفه های آماده را در یک صفحه با قالب مشخص قرار می دهیم.

شیوه کار Prado ، تفاوت های بسیاری با شیوه برنامه نویسی سنتی در php دارد. در شیوه معمول،برنامه سازان، ابتدا دستورات لازم برای ساخت فرم وب را با HTML کدنویسی می کنند و سپس با استفاده از روش ارسال به صورت POST یا GET اطلاعات مربوطه را پردازش می کنند. اما شیوه کاری Prado بر اساس مدل برنامه سازی در ASP.NET می باشد و بر مبنای استفاده از مولفه های آماده برای جلوگیری از تکرار کدنویسی است. مزایای استفاده از Prado عبارتند از:

  • قابلیت استفاده مجدد از مولفه های از پیش نوشته شده(reusability)
  • سادگی کار ساخت برنامه(ease of use)
  • بازدهی بالا(performance)
  • استفاده از ویژگی های شی گرایی در PHP5 مثل مدیریت خطاها(error handling )
  • مناسب برای پروژه های تیمی(team integration)

Prado بر روی سیستم های عامل Windows XPو Redhat Linux با موفقیت آزمایش شده است. Prado 1.5 با حجم ۱.۰۳ مگابایت از اینجا قابل دریافت است. برای آشنایی با نحوه کار Prado به اینجا مراجعه کنید.این چارچوب برای شرکت در Zend PHP5 Contest نوشته شده است. به هر حال هرکس سلیقه ای خاص خود دارد ومختار است که در چارچوب دلخواه خود برنامه بنویسد!
1383-07-27 21:24:24
علي خليلي
نويسنده:


چگونه CMS مورد نظر خود را انتخاب كنيم؟

با توجه به رشد روزافزون برنامه هاي مديريت محتوا(CMS) انتخاب بهترین CMS بر اساس نیازهای کاربران کمی مشکل شده است.مطلب زیر، برگرفته از سایت OpenSourceCMS است و ۵ مرحله را برای انتخاب CMS مورد نظر بیان می کند:

۱. قبل از هر چیز باید مشخص کنید که قصد ایجاد چه نوع سایتی را دارید؟ آیا سایت شما Portal است و براساس روابط متقابل کاربر و مدیران سایت است؟ آیا سایت شما تنها یک Weblog است و شامل نوشته های روزمره می شود؟ آیا یک سایت آماری با هدف اطلاع رسانی می خواهید؟ آیا سایت شما یک محیط برای انجام یک پروژه تیمی است؟

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

۲. گام بعدی این است که مشخص کنید چه ویژگی ها و امکاناتی مورد نیاز شما است؟ آیا قصد نمایش اطلاعات به صورت پویا(Dynamic) را دارید ویا ایستا(Static)؟ آیا نیاز به یک تقویم وقایع و رویدادها دارید؟آیا نیاز به یک بخش Upload/Download دارید؟ آیا یک آلبوم تصاویر هم می خواهید؟ آیا به یک سیستم نظرسنجی و برآورد نیاز دارید؟ آیا نیاز به یک تابع ترجمه دارید؟

موارد بالا Modules یا Plug-ins نامیده می شوند و عموما به صورت امکانات افزودنی(Add-ons) به هسته سیستم هستند.(بعضی مواقع این امکانات در سیستم مبنا فراهم شده اند) بیشتر سیستم های عرضه شده از Module های متعددی پشتیبانی می کنند اما ممکن است این امکانات جاری در نسخه های بعدی سیستم پشتیبانی نشوند و سازگار با تغییرات نباشند(Incompatible)! تنها پشتیبانی از Module مورد نظر شما کافی نیست بلکه باید توجه کنید که چطور امکانات مورد نظر شما کار می کنند؟آیا خواسته های شما را برآورده می کنند؟ گروههای مختلف یک ویژگی را از راههای مختلف پیاده سازی می کنند! نکته کلیدی در اینجا آزمایش است زیرا بهترین راه حل برای آگاهی از قابلیت های یک سیستم است.

۳.حالا که سیستم مبنا و Module های مورد نیاز خود را مشخص کردید،باید به نحوه نمایش سایت خود دقت کنید(Presentation). در حال حاضر بیشتر CMS ها امکان استفاده از CSS و Template را فراهم می آورند که این امکان را به شما می دهند که به سرعت ظاهر سایت خود را تغییر دهید.(Site Skin) محتویات مشابه با ظواهر مختلف می توانند یک منظره کاملا دراماتیک را ترسیم کنند! این منظره می تواند خیلی جذاب باشد ویا برعکس. همه چیز به تصور شما بستگی دارد! خبر خوب این است که اگر شما فردی خلاق یا هنرمند نیستید،نباید غصه بخورید زیرا منابع متعددی در اطراف شما وجود دارد که می تواند به شما کمک کنند! این منابع به صورت Template هایی هستند که توسط افرادی خلاق طراحی شده اند و در دسترس عموم قرار داده شده اند. شما می توانید این قالب ها را Download کرده به سایت خود اضافه کنید و با این کار رنگ و بوی تازه ای به سایت خود بدهید!

۴. حالا که لایه نمایش سایت خود را تعریف کردید باید روی محتویات سایت خود تمرکز کنید.محتوا خیلی خیلی مهم است! بدون محتوا، هر چقدر هم که سایت زیبایی داشته باشید، فایده ای ندارد! سایت شما بی فایده است، هیچ کاربری حاضر نمی شود برای بار دوم به سایت شما سر بزند و کم کم سایت شما محو می شود! اطلاعات می تواند به فرم های مختلفی ارائه شود. ممکن است مطالب کاربردی باشد یا مطالب طنز یا مطالب علمی و یا حتی چگونگی ساخت یک تله موش بهتر!

محتوای خوب باعث جذب مخاطب می شود(شبیه یک شکلات که به بچه های کوچک می دهید!) اگر یک سایت خبری دارید، داشتن امکان تبادل اطلاعات با منابع دیگر از طریق RSS مهم است.بسته به نوع سایت شما امکانات محتوایی مختلفی مطرح می شود.

۵. حالا که تمام مراحل بالا را انجام داده اید، فقط یک قدم می ماند و آن نگهداری(maintenance) و تجدید(renewal) سایت است. با گذشت زمان چه اتفاقی بر روی محتوای قدیمی می افتد؟ آیا آنها آرشیو می شوند و یا در دسترس می مانند؟ آیا این امکان وجود دارد که در صورت خرابی Server تمام سیستم بر روی یک محیط مجزا بازسازی مجدد(Restore) شوند؟ آیا امکان گرفتن نسخه پشتیبان (Backup) در سیستم وجو دارد یا این کار باید به صورت دستی صورت بگیرد؟

هر CMS ای با روش خود این مساله را حل می کند.برای اطلاع از این امکانات در CMS های مختلف ،بهتر است که با مدیران سایت های دیگر که تجربه بیشتری دارند مشورت کنید . باید از امروز به فکر آینده باشید!
1383-08-01 23:57:42
علي خليلي
نويسنده:


كار با Data Object ها در php5-قسمت1

امروزه کار با database یکی از مسائل روزمره برنامه نویسان وب به شمار می آید،از یک پردازش ساده فرم گرفته تا برنامه های کاربردی در مقیاس بزرگ(large-scale). تقریبا در اکثر موارد از database استفاده می کنیم. بعد از کارکردن روی چند پروژه، زمان زیادی طول نخواهد کشید که متوجه می شوید،چهار عمل اصلی ساده در کار با database به طور مرتب تکرار می شوند.این اعمال عبارتند از:

  • پیداکردن و انتخاب رکوردها(SELECT)
  • به روزرسانی رکوردهای جاری(UPDATE)
  • افزودن رکوردهای جدید(INSERT)
  • حذف رکوردها(DELETE)

شما در جاهای مختلف برنامه مجبورید که یک Query را بازنویسی کرده و یا آن را از قسمت های قبلی برنامه Copy-Paste کرده و سپس تغییرات لازم را روی آن اعمال کنید.عده ای از برنامه نویسان ترجیح می دهند که از یک لایه انتزاعی(Abstraction Layer) مثل PEAR::DB و یا DBX استفاده کنند.استفاده از یک لایه انتزاعی چیز خوبی است اما هدف اصلی در آن ،این است که RDMBS را محو کند یا به اصطلاح Transparent سازد و برنامه شما مستقل از RDMBS شود.یک لایه انتزاعی، راهی برای مجردسازی(abstraction) ساختارdatabase شما ازائه نمی دهد. اینجاست که یک لایه دسترسی مجزا می تواند مفید واقع شود.شما می توانید لایه دسترسی داده دا از راههای مختلف پیاده سازی کنید، اما در این مقاله، توجه ما معطوف به Data Object ها می باشد. مفهوم Data Object برگرفته از الگوهای طراحی به خوبی مستند شده( very well-documented design p a tterns) به نام Data Access Object و الگوهای شیء انتقال(Transfer Object) است.این الگوها می توانند بسیار پیچیده باشند،اما با کمی تفکر می توانیم به راحتی از ایده ها و اهداف پایه ای آنها در php5 استفاده کنیم.

*یک شیء داده(Data Object) چیست؟

همانطور که ذکر شد، ایده Data Object برگرفته از یک الگوی طراحی است.اگر نگاهی به الگوهای طراحی کنید، متوجه می شوید که تقریبا اغلب آنها بر مبنای شیءگرایی (object orienta tion)هستند. در این جا می خواهیم از مدل شی ای جدید php5 استفاده گسترده ای داشته باشیم.همچنین برای مثالهای خود از MySQL استفاده می کنیم.

در اصل،هرData Object یک کلاس کدنویسی شده است که یک table را در database شما به طور مستقیم مشخص می کند.برای هر table یک کلاس خاص می نویسیم.کلاس،شامل متغیرهای عضو(مطابق با فیلدهای جدول) و مجموعه ای از توابع یا متدها(حداقل برای انجام ۴ عمل اصلی ذکرشده)می باشد.فرض کنید یک جدول ساده برای نگهداری مشخصات کاربر داریم:

TABLE: User
userId INT
firstName VARCHAR(30)
lastName VARCHAR(40)
email VARCHAR(100)

برای این جدول کلاسی تعریف می کنیم که شامل متغیرهای عضو مطابق با فیلدهای جدول باشد.بهتر است که برای Data Object خود یک پیشوند بگذاریم(مثل DO_)تا آن را با کلاسهای هم نام دیگر اشتباه نگیریم.(این یک الگوی رایج در php برای شبیه سازی namespae ها می باشد)

class DO_User {
  public $userId;
  public $firstName;
  public $lastName;
  public $email;
}

مثال بالا یک سطر ساده از جدول را نشان می دهد.اگر یک شیء Do_user را نمونه سازی(instantiate) کنیم،می توانیم یک سطر از داده ها را نگهداری کنیم.حالا چطور اطلاعات را از database واکشی کرده و در این شیء ذخیره کنیم؟ برای این کار یک متد جدید به نام ()get به کلاس خود اضافه می کنیم تا از database برای یک کاربر خاص Query بگیریم. ما از userID(کلید اولیه) هر کاربر به عنوان پارامتر استفاده می کنیم:

 class DO_User {
  public $userId;
  public $firstName;
  public $lastName;
  public $email;

  // This function will perform a select on the table looking for
    // a specific userId.
  public function get($userId)
  {
    $sql = 'SELECT * FROM User WHERE userId='
             . mysql_escape_string($userId);
    $rs  = mysql_query($sql);
    $row = mysql_fetch_array($rs);

    $this->userId  = $row['userId'];
    $this->firstName = $row['firstName'];
    $this->lastName  = $row['lastName'];
    $this->email   = $row['email']
  }
}

حالا با استفاده از این Data Object می توانیم با database خود تعامل داشته باشیم.هیچ نیازی با استفاده از SQL نیست.مثال زیر اطلاعات مربوط به یک کاربر را دریافت و در Web Browser نمایش می دهد:

<?php
include_once('class-DO_User.php');
$user = new DO_User();

// We'll use a literal integer here,
// but this could come from anywhere,
// such as $_POST or $_GET
$user->get(5);

?>
<html>
  <head>
    <title>User Info</title>
  </head>
  <body>
    <p>Here is the user info:</p>
    <table border="1">
      <tr>
        <td>User ID</td>
        <td><?=$user->userId?></td>
      </tr>
      <tr>
        <td>First Name</td>
        <td><?=$user->firstName?></td>
      </tr>
      <tr>
        <td>Last Name</td>
        <td><?=$user->lastName?></td>
      </tr>
      <tr>
        <td>Email</td>
        <td><?=$user->email?></td>
      </tr>
    </table>
  </body>
</html>

همانطور که مشاهده می کنید استفاده از یک Data Object بسیار ساده است. تابع ()get ای که اضافه کردیم یک Query ساده را انجام می دهد و یک کلید اولیه مشخص(userID ) جستجو می کند. توجه کنید که چون از فیلد با کلید اولیه استفاده کردیم، تنها یک رکورد از داده ها را دریافت می کنیم و مقادیر آنها را در متغیرهای عضو کلاس قرار می دهیم.در قسمت های بعدی در مورد دریافت چند سطر از رکوردها نیز بحث خواهیم کرد.
1383-08-11 23:24:26
علي خليلي
نويسنده:


كار با Data Object ها در php5-قسمت2

همانطور که در قسمت اول بحث شد، لایه دسترسی به داده ها و لایه انتزاع پایگاه داده دو چیز متفاوتند.شما می توانید یکی از این دو لایه و یا حتی هر دو را برای بدست آوردن انعطاف (flexibility) بیشتر به کار ببرید.کار لایه انتزاع پایگاه داده، مخفی کردن RDBMS ای است که در پس زمینه در حال اجرا است.اگر شما در نوشتن دستورات SQL خود، تبحر داشته باشید،به راحتی می توانید از یک database server به دیگری کوچ کنید،بدون آنکه تغییری در فراخوانی های توابع یا SQL بدهید.Pear::DB این کار را به خوبی انجام می دهد.

لایه دسترسی به داده ها(Data Access Layer) روشی است برای مشخص کردن جداول خود، تا بتوانید بدون استفاده از SQL در Business layer برنامه خود(جایی که کد تمام توابع برنامه قرار می گیرد) با داده های جداول، تعامل داشته باشید. Data Object ها ،گزینه خوبی برای لایه دسترسی به داده ها هستند زیرا از آنجا که رابطه مستقیم با جداول دارند،می توانید بدون تغییر در آنها،چندین بار از آنها در طول برنامه خود استفاده کنید.

در قسمت ۱ ،کلاسی با نام DO_User ساختیم ویک متد ساده برای دریافت رکورد بر اساس فیلد userId نوشتیم.در این قسمت به توسعه کلاس DO_User می پردایم:

افزودن یک رکورد جدید(INSERT)

در اینجا یک متد جدید به نام insert را به کلاس خود اضافه می کنیم.این متد،یک رکورد جدید به جدول ما اضافه می کند:

public function insert()
{
  $sql = "INSERT INTO User SET
  firstName='" . mysql_escape_string($this->firstName) . "',
  lastName='"  . mysql_escape_string($this->lastName)  . "',
  email='"   . mysql_escape_string($this->email)   . "'";

  mysql_query($sql);
  $this->userId = mysql_insert_id();
}

ممکن است سوال کنید که اطلاعات برای درج شدن از کجا گرفته می شوند،زیرا تابع insert هیچ پارامتری ندارد! جواب این است که قبل از فراخوانی این تابع باید متغیرهای عضو کلاس مقداردهی شده باشند به جز متغیر userId که بعد از افزودن رکورد جدید توسط تابع mysql_insert_id به آن مقدار می دهیم. مثال زیر نحوه به کارگیری این متد را نشان می دهد:

<?php
include_once('class-DO_User.php');

$user      = new DO_User();
$user->firstName = 'Jane';
$user->lastName  = 'Doe';
$user->email   = 'jane.doe@example.com';

$user->insert();
?>
<html>
  <head>
    <title>INSERT Example</title>
  </head>
  <body>
    <p>The user was added to the User table.
    The userId is: <?=$user->userId?></p>
  </body>
</html>

در مثال بالا ابتدا یک شیء از نوع DataObject را نمونه سازی می کنیم.سپس متغیرهای لازم را مقداردهی کرده و تابع insert را فراخوانی می کنیم. ما می توانیم با به کارگیری توام دو متد get و insert یک رکورد را کپی کنیم. می توانیم ابتدا یک تغییر جزئی در مقادیر بدهیم(مثلا آدرس ایمیل را عوض کنیم) و سپس رکورد را کپی کنیم:

<?php
include_once('class-DO_User.php');
$user = new DO_User();

// Again just using a literal int for now.
$user->get(5);

// Change the email address in the DataObject
// NOTE: This doesn't affect the DB at all,
// just the value in the DataObject
$user->email = 'jdoe@example.com';

// Next, we call insert() to create a NEW record in the User table
$user->insert();

?>
<html>
  <head>
    <title>Copy Row INSERT Example</title>
  </head>
  <body>
    <p>The user was copied to the User table.
    The userId is: <?=$user->userId?></p>
  </body>
</html>

مثال بالا نشان می دهد که با به کارگیری DataObject چقدر کار تعامل با پایگاه داده،آسان می شود.

بروز رسانی رکوردها(UPDATE)

بازیابی یک رکورد،تغییر بعضی مقادیر و افزودن آن به صورت یک رکورد جدید کار ارزشمندی است اما در اکثر مواقع، شما نیاز به UPDATE کردن یک رکورد دارید.در این جا متدی به نام update به کلاس خود اضافه می کنیم:

public function update()
{
  $sql = "UPDATE User SET
  firstName='" . mysql_escape_string($this->firstName) . "',
  lastName='"  . mysql_escape_string($this->lastName)  . "',
  email='"   . mysql_escape_string($this->email)   . "'
  WHERE
  userId="   . mysql_escape_string($this->userId);

  mysql_query($sql);
}

این متد بسیار شبیه متد insert است.به مثال زیر توجه کنید:

<?php
include_once('class-DO_User.php');
$user = new DO_User();

// Again just using a literal int to get a row.
$user->get(5);

// Change the email address
$user->email = 'janedoe@example.com';

// Perform the update
$user->update();

?>
<html>
  <head>
    <title>UPDATE Example</title>
  </head>
  <body>
    <p>The user updated. The userId is: <?=$user->userId?></p>
  </body>
</html>

حذف سطرها(DELETE)

در اینجا تابعی با نام delete به کلاس خود اضافه می کنیم:

public function delete()
{
  $sql = "DELETE FROM User
  WHERE
  userId=" . mysql_escape_string($this->userId);

  mysql_query($sql);
}

کار کردن با delete مشابه update می باشد.این متد هم از فیلد کلید اولی یعنی userID استفاده می کند.

ارزش DataObject ها وقتی مشخص می شود که با آنها کار کنید! در قسمت بعدی به متدهای پیچیده تر برای بسط کلاس خود می پردازیم.
1383-08-16 13:42:16
علي خليلي
نويسنده:


كار با Data Object ها در php5-قسمت3

در قسمت ۱و۲ به معرفی یک DataObject پرداختیم.کلاسی به نام DO_User تعریف کرده و متدهای حذف،اضافه و بروزرسانی مرتبط با آن را برای یک سطر از رکوردها نوشتیم. در این قسمت به بررسی پرس و جوهایی(Query)می پردازیم که بیش از یک سطر را برمی گردانند.

ساده ترین روش برای حل این مساله،ساخت آرایه ای از DataObject ها است که شامل تمام رکوردهای دریافتی باشد.این راه حل ممکن است در نگاه اول منطقی به نظر برسد اما اگرquery شما ۱۰۰۰۰ سطر و یا بیشتر را برگرداند چه اتفاقی می افتد؟ یک ارایه بسیار بزرگ از اشیاء احتیاج به حجم زیادی از حافظه دارد و بار زیادی را به host شما تحمیل می کند و ممکن است منجر به از کارافتادن(Shut Down) سایت شما شود.پس بهتر است به فکر یک راه حل دیگر برای دریافت چند سطر ازداده ها باشیم:

راه بهتر این است که یک کلاس جدید برای این کار تعریف کنیم.این کلاس را Re a dOnlyResultSet می نامیم زیرا مجموعه نتایج،فقط قابل خواندن است.این نوع نامگذاری معمولا در الگوهای طراحیJ2EE برای ثبات و یکدست بودن(Consistency) ، مورد استفاده قرار می گیرد.قبل از اینکه این کلاس را بنویسیم،یک متد جدید به نام()find به کلاس DO_User اضافه می کنیم که مجموعه نتایج را برگرداند:

public function find()
{
  $sql = "SELECT * FROM User";

  // This array will hold the where clause
  $where = array();

  // Using PHP 5's handy new reflection API
  $class = new ReflectionClass('DO_User');

  // Get all of DO_User's variable (or property) names
  $properties = $class->getProperties();

  // Loop through the properties
  for ($i = 0; $i < count($properties); $i++) {
    $name = $properties[$i]->getName();
    if ($this->$name != '') {
      // Add this to the where clause
      $where[] = "`" . $name . "`='"
      . mysql_escape_string($this->$name) . "'";
    }
  }

  // If we have a where clause, build it
  if (count($where) > 0){
    $sql .= " WHERE " . implode(' AND ', $where);
  }

  $rs = mysql_query($sql);
  include_once('class-ReadOnlyResultSet.php');
  return new ReadOnlyResultSet($rs);
}

PHP 5 به صورت توکار(built-in) از Reflection API پشتیبانی می کند که توسط آن می توان در مورد یک کلاس و یا شیء خاص اطلاعات گرفت.معمولا به این کار، مهندسی معکوس(Reverse Engineering) می گویند. ما در اینجا از Reflection API برای دریافت متغیرهای عضو یا Properties یک DataObject استفاده می کنیم.اگر فرصت داشتید حتما نگاهی به این API جدید بیندازید تا به قدرت آن پی ببرید!

توجه کنید که قبل از فراخوانی find باید داده هایی را که می خواهیم روی آنها جستجو انجام داهیم،در متغیرهای عضو کلاس قرار دهیم.متد find یک query بر اساس متغیرهای set شده درست می کند و نتیجه آن را به صورت یک شیء ReadOnlyResultSet برمی گرداند. در ادامه کد مربوط به کلاس ReadOnlyResultSet را می نویسیم:

class ReadOnlyResultSet {
    // This member variable will hold the native result set
  private $rs;

    // Assign the native result set to an instance variable
  function __construct($rs)
  {
    $this->rs = $rs;
  }

    // Receives an instance of the DataObject we're working on
  function getNext($dataobject)
  {
    $row    = mysql_fetch_array($this->rs);

    // Use reflection to fetch the DO's field names
    $class    = new ReflectionObject($dataobject);
    $properties = $class->getProperties();

    // Loop through the properties to set them from the current row
    for ($i = 0; $i < count($properties); $i++) {
      $prop_name        = $properties[$i]->getName();
      $dataobject->$prop_name = $row[$prop_name];
    }

    return $dataobject;
  }

  // Move the pointer back to the beginning of the result set
  function reset()
  {
    mysql_data_seek($this->rs, 0);
  }

  // Return the number of rows in the result set
  function rowCount()
  {
    return mysql_num_rows($this->rs);
  }
}

کلاس ReadOnlyResultSet یک پوشش(Wrapper) برای مجموعه نتایج می باشد که یک نمونه DataObject برمی گرداند.بهتر است برای همه پروژه هایی که می نویسیم از یک ReadOnlyResultSet عمومی استفاده کنیم و دیگر آن را تغییر ندهیم.

*نکته: php 5 با اشیاء به صورت ارجاع مستقیم(refrence) کار می کند(مثل JAVA) و نیازی به استفاده از & نیست.

کلاس ReadOnlyResultSet علاوه بر متد سازنده کلاس(Constructor)، سه متد دارد. متد ()reset اشاره گر نتایج را به اول آن برمی گرداند.متد ()rowCount تعداد سطرها را بر می گرداند.متد ()getNext پیچیده ترین متد این کلاس است که نیاز به کمی توضیح دارد:

از آنجا که این کلاس باید برای همه DataObject ها کار کند،باید راهی پیدا کنیم که به این متد بگوییم که با کدام DataObject کار کند. به همین علت باید DataObject مورد نظر را به عنوان پارامتر با این تابع بدهیم. خط اول این متد،سطر بعدی از مجموعه نتایج را واکشی می کند،سپس با استفاده از یک حلقه تکرار و استفاده از Reflection API خواص(properties) مربوط به اشیاء را پر می کنیم. به استفاده از ReflectionObject به جای ReflectionClass دقت کنید.ما در اینجا سعی داریم که مهندسی معکوس را برای یک شیء به کار ببریم نه یک کلاس!

حالا وقت آن رسیده که در عمل کلاس ReadOnlyResultSet را تست کنیم.مثال زیر تمام رکوردهایی را که FirstName آنها ali است جستجو می کند:

<?php
include_once('class-DO_User.php');
$user      = new DO_User();

// We'll use a literal string here,
// but this could come from anywhere,
// such as $_POST or $_GET
$user->firstName = 'ali';

// Call find(), which returns an instance of ReadOnlyResultSet
$rs        = $user->find();
?>

<html>
  <head>
    <title>Found Users</title>
  </head>
  <body>
    <p>Here the found users:</p>
    <table border="1">
      <tr>
        <td>User ID</td>
        <td>First Name</td>
        <td>Last Name</td>
        <td>Email</td>
      </tr>
<?php
// Loop through the result set
for ($i=0; $i < $rs-rowCount(); $i++) {

  // Pass on a new instance of DO_User, receiving it back filled in
  $userRow = $rs->getNext(new DO_User());
   // Display the current row in an HTML table
?>
      <tr>
        <td><?=$userRow->userId?></td>
        <td><?=$userRow->firstName?></td>
        <td><?=$userRow->lastName?></td>
        <td><?=$userRow->email?></td>
      </tr>
<?php
}
?>
    </table>
  </body>
</html>

دقت کنید که وقتی rs->getNext$ را فراخوانی می کنیم،یک نمونه جدید از DO_User می سازیم.از این جااست که کلاس ما می فهمد با کدام نوع از اشیاء داده ای سر و کار دارد.

منابع:

  • Source code: [ReadOnlyResultSet] [DO_User]
  • PHP 5: [Zend's PHP5 InfoCenter] [Reflection API]
  • Design Patterns: [Data Access Object] [Data Transfer Object]
  • http://www.onlamp.com/

    • 1383-08-19 22:55:10
    علي خليلي
    نويسنده:


Coppermine :معدني براي تصاوير

‍‍Coppermine يك برنامه قدرتمند براي مديريت تصاوير شما بر روي وب است.اين آلبوم تصاوير قدرتمند توسط PHP و با به کارگیری کتابخانه های GD و ImageMagick و همچنین پایگاه داده قدرتمند MySQL نوشته شده است .این برنامه بازمتن، ویژگی ها و امکانات زیادی دارد که آن را از سایر برنامه های مشابه متمایز می سازد.بعضی ها Coppermine را از لحاظ ویژگی ها و پیشرفتی که داشته ،مشابه PHPbb اما در رده برنامه های آلبوم تصاویر می دانند. قالب ظاهری این برنامه(Theme) به راحتی قابل تغییر است و Theme های آماده زیادی برای این برنامه به صورت رایگان وجود دارد. چند نمونه از امکانات این برنامه عبارتند از: داشتن یک سیستم عضویت قدرتمند- امکان نظردهی و رتبه دادن به تصاویر-امکانات طبقه بندی و گروه بندی تصاویر و کاربران- پشتیبانی از زبانهای مختلف-نصب ساده

یکی از برجسته ترین امکانات Coppermine پیوسته شدن(Integration) به برنامه های مدیریت محتوا و انجمن است.برای مثال این برنامه را می توان به همراه phpBB, YaBB SE, SMF, Invisionboard, vbulletin و همچنین CPG-Nuke به کار برد. نسخه نمایشی این برنامه در اینجا قابل مشاهده است. مستندات برنامه را هم می توانید در اینجا ببینید. جدیدترین نسخه برنامه Coppermine Photo Gallery از اینجا قابل دریافت است.
1383-09-13 12:36:20
علي خليلي
نويسنده:


Ajax :روشي نوين در طراحي برنامه هاي كاربردي تحت وب

امروزه، معمولا وقتی صحبت از طراحی برنامه های تعاملی(interaction design ) می شود،بیشتر توجه ها معطوف به وب است. برنامه های کاربردی تحت وب به سرعت در حال رشد و توسعه هستند و کاربران دوست دارند که با همان راحتی و سرعتی که با Desktop application ها کار می کنند با Web application ها هم کار کنند. طراحان برنامه های کاربردی وب هم برای از بین بردن این شکاف ، روش های طراحی گوناگونی را پیشنهاد کرده اند.

نگاهی به Google Suggest و Google Maps بیندازید . وقتی روی قسمتی از نقشه zoom می کنید و یا بالا و پایین می روید همه چیز تقریبا به طور همزمان و بدون Load شدن مجدد صفحات انجام می شود. Google Suggest و Google Maps دو نمونه از روش طراحی جدید به نام Ajax هستند. Ajax مخفف Asynchronous JavaScript + XML می باشد.

Ajax شامل مجموعه ای از تکنولوژی های مختف است که گرد هم آمده اند تا یک روش قدرتمند و جدید را برای طراحی برنامه های کاربردی وب ایجاد کنند:

  • standards-based presentation using XHTML and CSS;
  • dynamic display and interaction using the Document Object Model;
  • data interchange and manipulation using XML and XSLT;
  • asynchronous data retrieval using XMLHttpRequest;
  • and JavaScript binding everything together.

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

وقتی که سرور مشغول پردازش درخواست ها است، کاربر چه می کند؟ مسلم است که انتظار می کشد! و این انتظار در هر مرحله از انجام کار بیشتر و بیشتر می شود! زمانی که یک فرم وب را در برنام کاربردی خود قرار می دهید کاربر باید تا زمان دریافت نتایج صبر کند.اصلا چه لزومی دارد که کاربر ببیند برنامه او به سمت سرور می رود؟! Ajax به این پرسش ها پاسخ می دهد:

یک برنامه کاربردی Ajax ، طبیعت start-stop-start-stop برنامه های کاربردی وب را با معرفی یک واسط به نام Ajax engine بین کاربر و سرور، از بین می برد. ممکن است به نظر برسد که افزودن یک لایه جدید به برنامه کاربردی، عکس العمل آن را کند کند اما نتیجه حاصله کاملا برعکس است! به جای load کردن یک صفحه وب در آغاز یک session ، مرورگر کاربر، Ajax engine را که توسط JavaScript نوشته شده است load می کند. این engine مسئولیت render کردن واسطی که کاربر می بیند و همچنین ارتباط با سرور از سمت کاربر را بر عهده دارد.این engine سبب می شود که تعامل کاربر با برنامه کاربردی، نا همگام(asynchronously) با ارتباط کاربر با سرور انجام شود. بنابر این ،کاربر هرگز یک صفحه مرورگر خالی یا یک آیکون ساعت شنی برای انتظار نمی بیند و منتظر سرور نمی نشیند!

Google نقش مهمی را در طراحی و به کارگیری این شیوه جدید داشته است. Orkut, Gmail و آخرین نسخه آزمایشی Google Groups, Google Suggest و Google Maps به شیوه Ajax طراحی شده اند.(برای کسب اطلاعات بیشتر می توانید به تحلیل Gmail, Google Suggest و Google Maps مراجعه کنید.) بیشتر ویژگی های جالب که در Flickr مشاهده می کنید بر اساس همین شیوه است. متور جستجوی Amazon’s A9.com هم بر اساس این روش طراحی شده است.

این پروژه های موفق نشان می دهند که Ajax یک روش تئوری نیست بلکه کاملا کاربردی است!

منبع مطلب: http://www.adaptivepath.com/publications/essays/archives/000385.php
1383-12-03 07:33:07
علي خليلي
نويسنده:


آشنایی با روش Ajax -قسمت اول

در پست قبلی در مورد روش جدید Ajax برای ساخت برنامه های تحت وب بحث شد و ایده کلی این روش بیان شد.در این مقاله به معرفی شیء XMLHttpRequest که نقشی اساسی در این روش دارد، می پردازیم :

XMLHttpRequest یکی از اشیای محلی(Native Object) جاوااسکریپت است که اجازه درخواست های HTTP را از یک صفحه لود شده به کاربران می دهد.این شیء به کاربران اجازه می دهد که یک سری ریزدرخواست(Microrequests) در پاسخ به رویدادهای کاربر، بدون لود شدن مجدد صفحات ارسال کنند و این امر باعث می شود که یک برنامه تحت وب ، ماهیتی مثل desktop applications پیدا کند. توجه داشته باشید که XMLHttpRequest تنها روش ارتباط با server بدون لود شدن مجدد صفحات نیست بلاکه روش های دیگری مثل Remote Scripting نیز وجود دارند که از بحث ما خارج است! در این مقاله با یک مثال عملی ساده، چگونگی استفاده از این شیء را توضیح می دهیم:

فرض کنید که می خواهیم برنامه ای برای ضرب دو عدد بنویسیم. قرار است که ضرب دو عدد در سمت Server و توسط php انجام شود.(ممکنه که این مثال کمی احمقانه به نظر برسه چون خیلی راحت با جاوااسکریپت میشه این کارو انجام داد! ولی هدف ما توی این مقاله استفاده از یک زبان برنامه نویسی سمت server بدون لود شدن مجدد صفحات است و هدف ما به هیچوجه، انجام عمل ضرب نیست!)

اولین مرحله از کار،ساخت یک شیء XMLHttpRequest توسط جاوااسکریپت است.از آنجا که مرورگرهای وب مختلف، با این شیء به روش های مختلف برخورد می کنند برای ساخت این شیء به صورت مستقل از مرورگر، از precompile directives استفاده می کنیم.(این دستورات با /*@cc_on شروع شده و به @end @*/ ختم می شوند.) در اینجا از دستورات try-catch برای کنترل ساخت این شیء استفاده شده است.در هنگام لود صفحه اصلی، یک نمونه از این شیء درست می شود:

<script language="javascript"  type="text/javascript">
function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}
var http = getHTTPObject(); // We create the HTTP Object
</script>

در مرحله بعدی، فرمی ساده با سه فیلد با نامه های مشخصه a,b,c درست می کنیم. رویداد onblur مربوط به فیلد b را با تابع echoResult اداره می کنیم. قصد داریم وقتی کاربر با فشار دادن کلید tab ،تمرکز را از این فیلد گرفت، نتیجه ضرب a در b را در فیلد c نشان دهیم:

<form name="form1" method="post" action="">
  <table width="392" border="0" align="center" cellpadding="0" cellspacing="0">
    <tr>
      <td width="24"><input name="a" type="text" id="a" size="4" maxlength="4"></td>
      <td width="21"><div align="center">*</div></td>
      <td width="36"><div align="center">
          <input name="b" type="text" id="b" size="4" maxlength="4" onblur="echoResult();">
        </div></td>
      <td width="25"><div align="center">=</div></td>
      <td width="286"><input name="c" type="text" id="c" size="8" maxlength="8"></td>
    </tr>
  </table>
</form>

در این مرحله به نوشتن تابع echoResult و handleHttpResponse می پردازیم.تابع echoResult مقادیر فیلدهای a و b را دریافت کرده از طریق شیء XMLHttpRequest این مقادیر را به صورت پارامتر به صفحه سمت server که در اینجا handleMultiply.php می باشد، ارسال می کند. خاصیت onreadystatechange مربوط به شیء XMLHttpRequest را برابر تابع handleHttpResponse قرار داده ایم.این تابع پاسخ دریافتی از سمت Server را در فیلد مربوطه یعنی c می نویسد و سپس ارتباط با server قطع می شود:

<script language="javascript"  type="text/javascript">
var url = "handleMultiply.php?"; // The server-side script
function handleHttpResponse() {
  if (http.readyState == 4) {
    result = http.responseText;
    document.getElementById('c').value = result;
  }
}
function echoResult() {
  var a = document.getElementById("a").value;
  var b = document.getElementById("b").value;
  http.open("GET", url + "a=" + a + "&b=" + b, true);
  http.onreadystatechange = handleHttpResponse;
  http.send(null);
}
</script>

در مرحله آخر یک صفحه php با نام handleMultiply.php درست می کنیم که پارامترهای a و b را به روش GET دریافت کرده و حاصلضرب آنها را بر می گرداند.

<?php
    $a=$_GET['a'];
    $b=$_GET['b'];
    $c=$a * $b ;
    echo $c;
?>

این تمام کاری بود که باید انجام می دادیم.حالا می توانیم برنامه خود را تست کنیم و یک گام به سمت روش Ajax برداریم.نتیجه اجرای این مثال را می توانید در اینجا مشاهده کنید. کد کامل صفحه Multiply.htm نیز در زیر آورده شده است:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Multiply a*b without refreshing!</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="javascript"  type="text/javascript">
var url = "handleMultiply.php?"; // The server-side script
function handleHttpResponse() {
  if (http.readyState == 4) {
    result = http.responseText;
    document.getElementById('c').value = result;
  }
}
function echoResult() {
  var a = document.getElementById("a").value;
  var b = document.getElementById("b").value;
  http.open("GET", url + "a=" + a + "&b=" + b, true);
  http.onreadystatechange = handleHttpResponse;
  http.send(null);
}
function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}
var http = getHTTPObject(); // We create the HTTP Object
</script>
</head>
<body>
<form name="form1" method="post" action="">
  <table width="392" border="0" align="center" cellpadding="0" cellspacing="0">
    <tr>
      <td width="24"><input name="a" type="text" id="a" size="4" maxlength="4"></td>
      <td width="21"><div align="center">*</div></td>
      <td width="36"><div align="center">
          <input name="b" type="text" id="b" size="4" maxlength="4" onblur="echoResult();">
        </div></td>
      <td width="25"><div align="center">=</div></td>
      <td width="286"><input name="c" type="text" id="c" size="8" maxlength="8"></td>
    </tr>
  </table>
</form>
</body>
</html>
1383-12-23 19:25:41
علي خليلي
نويسنده:


آشنایی با روش Ajax -قسمت دوم

ابزارهای مختلفی برای به کارگیری روش Ajax عرضه شده اند.برای نمونه می توان از SAJAX (برای PHP و ASP ) و JPSPAN (برای PHP) و AJAX .Net (برای NET.) نام برد. در این قسمت، با نوشتن یک برنامه کاربردی به معرفی SAJAX می پردازیم:

هدف: برنامه ای برای نمایش رشته های تصادفی( رشته های تصادفی توسط تابعی در سمت Server ساخته می شوند)

ابزار لازم: SAJAX Toolkit (این برنامه را می توانید از اینجا دریافت کنید)

دستور العمل: ابتدا باید فکری برای ذخیره رشته ها کنیم. برای سادگی کار و برای اینکه درگیر database نشویم از آرایه ای از Session ها برای ذخیره و بازیابی رشته ها استفاده می کنیم.  حال به نوشتن توابع مربوط به تولید رشته تصادفی و بازیابی آن در سمت Server می پردازیم:

<?php

session_start();

if (!isset($_SESSION['strings'])) {
$_SESSION['strings'] = array('ali1k','phprun','Hello World');
}

function addString($string) {
$_SESSION['strings'][] = $string;
return true;
}

function randomString() {
$index = rand(0,count($_SESSION['strings'])-1);
return $_SESSION['strings'][$index];
}

function stringCount() {
return count($_SESSION['strings']);
}

?>

در مرحله بعدی کار باید فایل Ajax.php را به برنامه خود ضمیمه کنیم و سپس توابعی را که قرار است از PHP به Javascript صادر کنیم،ثبت کنیم:

<?php

require("Sajax.php");

sajax_init();
//$sajax_debug_mode = 1;
sajax_export("addString");
sajax_export("randomString");
sajax_export("stringCount");

sajax_handle_client_request();

?>

حالا به بخش HTML برنامه می رسیم. توجه داشته باشید که بر خلاف ابزار JPSPAN که توابع PHP را به Javascript نگاشت می کند و بخش Client-Side و Server-Side در دوفایل مجزا قرار می گیرند، درSAJAX هر دو بخش را در یک فایل قرار می دهیم:

<html>
<head>
    <title>SAJAX Hello World</title>
    <script>
    <?
    sajax_show_javascript();
    ?>

    function addString_cb() {
        x_stringCount(stringCount_cb);
    }

    function do_addString() {
        x_addString(document.getElementById('string').value,addString_cb);
        document.getElementById('string').value = '';
    }

    function addRandom_cb(result) {
        document.getElementById('canvas').innerHTML += '<p>'+result+'</p>';
    }

    function stringCount_cb(result) {
        document.getElementById('count').innerHTML = result;
    }

    </script>

</head>
<body onLoad="x_stringCount(stringCount_cb)">

    <input type="button" name="check" value="Show Random String" onclick="x_randomString(addRandom_cb); return false;">
    <div>Number of Random Strings: <span id="count"></span></div>
    <div id="canvas" style="border: solid 1px black; margin: 1em; padding: 1em;"></div>

    <div>
    Add new String:
    <input type="text" name="string" id="string" size="20">
    <input type="button" name="check" value="Add new String" onclick="do_addString(); return false;">
    </div>
</body>
</html>

از آنجایی که SAJAX از توابع Callback برای برگرداندن مقادیر استفاده می کند، به دو تابع جاوااسکریپت نیاز داریم. مثلا در اینجا تابع do_addString که عمل اضافه کردن رشته را انجام می دهد برای دریافت مقدار پارامترهایش از تابع addString_cb استفاده می کند(این تابع نیز مقادیر پارامترهایش را توسط تابع stringCount_cb دریافت می کند) ! همانطور که مشاهده می کنید برای استفاده از توابع PHP که قبلا ثبت کردیم از پیشوند _x استفاده می کنیم.

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

+ منبع مطلب:

http://blog.joshuaeichorn.com/
1384-02-07 19:05:37
علي خليلي
نويسنده:


exponent CMS

"مدیریت محتوا باید ساده باشد. " این شعار طراحان سیستم مدیریت محتوای exponent می باشد.این CMS توسط یک شرکت تجاری به نام S-Media و با استفاده از PHP و MySQL تحت مجوز GPLطراحی شده است.این CMS هوز در مرحله تکامل قرار دارد و آخرین نسخه عرضه شده آن 0.95 می باشد که از اینجا قابل دریافت است. اولین و برجسته ترین مشخصه exponent واسط گرافیکی بخش مدیریت آن است که آن را از دیگر برنامه های رایج مثل PHP-Nuke، XOOPS و ... متمایز می سازد.در exponent مدیریت و به روزرسانی محتوا به صورت WYSIWYG است ،یعنی شما به همان صورتی که محتوا را مشاهده می کنید می توانید آن را ویرایش کنید. از دیگر مشخصه های exponent نصب آسان آن است.این CMS از Smarty template engine برای قالب بندی صفحات استفاده می کند که تغییر قالب و ظاهر آن را بسیار ساده کرده است.( قالب های پیش فرض سیستم بر مبنای HTML 4 و table layout است.) از لحاظ کد برنامه، این سیستم به خوبی کد نویسی شده است و کدهای پروژه های خارجی مثل HTMLArea و Smarty کاملا مجزا از کد اصلی برنامه است و می توان کد آن را به راحتی تغییر داد. همچنین کدهای برنامه به خوبی مستند سازی شده است و یافتن و تغییر ماژول ها و زیر سیستم های آن(مثل SMTP functionality, session handling, user account management) ساده است. اشکالات: بااینکه این سیستم واسط گرافیکی خوبی دارد ولی در ابتدا ممکن است کمی پیچیده و گنگ به نظر برسد. بعضی از ماژول های سیستم مثل Calendar هنوز توانایی عملیاتی بالایی ندارند و ناقص به نظر می رسند.

1384-02-25 22:17:43
علي خليلي
نويسنده:


آشنايي با روش Ajax و به كارگيري آن

درقسمت های قبلی(مقدمه و۱ و۲) به طور پراکنده در مورد روش AJAX بحث شد. در مقاله زیر به جمع بندی و تکمیل قسمت های قبلی پرداختم:

>>آشنايي با روش Ajax و به كارگيري آن<<
1384-03-04 22:44:44
علي خليلي
نويسنده:


حفاظت در برابر XML-RPC Exploits

Security Error بنابر گزارش سایت مشهور Netcraft ، اکثر برنامه های وبلاگ و مدیریت محتوا که برمبنای PHP هستند ، به علت شیوه ای که این برنامه ها برای handle کردن دستورات XML استفاده می کنند دارای یک حفره امنیتی هستند که آنها را آسیب پذیر می سازد! این مشکل در برنامه های مشهوری مثل PostNuke, WordPress, Drupal, Serendipity, phpAdsNew, phpWiki و phpMyFAQ و ... گزارش شده است.

PHPXMLRPC یک پیاده سازی PHP از XML-RPC web RPC protocol می باشد که اولین بار توسط Edd Dumbill توسعه پیدا کرد و بعدها در SourceForge قرار گرفت.از PHPXMLRPC در بیشتر برنامه های باز متن مثل PostNuke, Drupal, b2evolutionوTikiWiki استفاده شده است. متاسفانه PHPXMLRPC در برابر اجرای کد های PHP از راه دور(remote php code execution) آسیب پذیر است و به مهاجمان امکان می دهد که به webserver دسترسی پیدا کنند!

اجرای دستورات از راه دور(Remote Command Execution)

آسیب پذیری PHPXMLRPC در نتیجه ارسال مستقیم داده های غیر متعارف( unsanitized) به فراخوانی() eval در تابع() parseRequest از XMLRPC server است.

// decompose incoming XML into request structure
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
    xml_set_character_data_handler($parser, "xmlrpc_cd");
    xml_set_default_handler($parser, "xmlrpc_dh");
    if (!xml_parse($parser, $data, 1)) {
      // return XML error as a faultCode
      $r=new xmlrpcresp(0,
                        $xmlrpcerrxml+xml_get_error_code($parser),
                        sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                  xml_get_current_line_number($parser)));
      xml_parser_free($parser);
    } else {
      xml_parser_free($parser);
      $m=new xmlrpcmsg($_xh[$parser]['method']);
      // now add parameters in
      $plist="";
      for($i=0; $iaddParam(' . $_xh[$parser]['params'][$i]. ");");
      }

با ساخت یک فایل XML که از single quotes برای escape کردن، در فراخوانی () eval استفاده می کند، حمله کننده به راحتی می تواند کدهای PHP را بر روی server موردنظر اجرا کند.با دانستن اینکه تابع () magic_quotes_gpc بر روی HTTP_RAW_POST_DATA$ اعمال نمی شود استفاده از single quotes هیچ مشکلی را ایجاد نمی کند!

<?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); phpinfo(); exit;/*</name></value>
</param>
</params>
</methodCall>

فایل XML بالا وقتی به server ای که این ضعف امنیتی را دارد،ارسال شود باعث می شود تابع() phpinfo بر روی آن اجرا گردد!

راه حل چیست؟!

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

http://sourceforge.net/project/showfiles.php?group_id=34455&package_id=26601

1384-04-14 06:54:21
علي خليلي
نويسنده:


اداره کردن خطاها در PHP 5

Exception Handling Exception Handling یا اداره کردن استثناها یعنی خطاهایی که در طول برنامه ممکن است رخ دهد، یکی از مسائل مهم در توسعه یک نرم افزار است. تصمیم گیری برای اینکه در هنگام وقوع یک خطا در برنامه چه عملی انجام شود (اداره کردن خطا) کار سختی است، اما از آن سخت تر، تشخیص دادن قسمت هایی از کد برنامه است که خطا خیز باشد( یعنی احتمال وقوع خطا در آن بیشتر است) و سپس تعیین نقطه مناسبی که برنامه بعد از اداره خطا از آنجا ادامه پیدا کند. امروزه بیشتر زبانهای مدرن از الگوی رایج try/catch /throw برای اداره کردن خطاها بهره می گیرند. استفاده از این ساختار مزایای بسیاری دارد، یکی از این مزایا این است که دیگر لازم نیست که در هر جای برنامه که ممکن است خطا رخ دهد دستورات ()if قرار دهید تا آنها را شناسایی و اداره کنید. بنابر این صرفه جویی بسیاری در کد برنامه صورت می گیرد. خوشبختانه در php 5 با توجه به مقوله شیء گرایی، امکانات اداره کردن استثناها هم فراهم شده است. قبل از توضیح دادن نحوه بکارگیری این امکان، باید با مقدماتی از شیء گرایی آشنا باشید:

¤ نکته: باید بین اصطلاحات Error ، Bug و Exception تفاوت قائل شویم. Bug اشتباهی است که برنامه نویس آن را مرتکب شده است.Exception ها برای محافظت در برابر Bug ها مناسب نیستند.اگرچه ممکن است یک Bug باعث وقوع یک Exception شود ولی نباید به Exception ها برای اداره کردن Bug های خودتان اتکا کنید بلکه باید این اشتباهات را خودتان برطرف کنید! یک Error براثر عمل اشتباه کاربر بوجود می آید.مثلا کاربر ممکن است فیلدی را که قرار بوده در آن یک مقدار عددی جای گیرد با یک حرف الفبا پر کند. یک Error ممکن است باعث وقوع یک Exception شود اما می توان با استفاده از تعیین صحت اعتبار یا Validating از آن جلوگیری کرد. هرجا که ممکن است Error رخ دهد باید پیش بینی و سپس پیشگیری شود. حتی اگر همه Bug ها را حذف کنید و تمام Error ها را پیش بینی کنید باز هم ممکن است مشکلات قابل پیش بینی ولی غیر قابل پیشگیری رخ دهد(مثلا بازکردن یک فایل که دیگر وجود ندارد و یا خطای Out of Memory) به این مشکلات Exception یا استثنا می گوییم.شما نمی توانید از Exception ها جلوگیری کنید اما می توانید آنها را اداره کنید تا باعث توقف برنامه شما نشوند و آنطور که شما می خواهید رفتار کنند.

-متد سازنده کلاس(Constructor) : هر بار که یک نمونه از کلاس درست کنیم(Instance) این تابع فراخوانی می شود و وظیفه مقداردهی اولیه متغیرهای کلاس و عمل Initialize کردن را بر عهده دارد. در php5 نام این تابع ، کلمه کلیدی constructــ می باشد.

-متد toString : بر خلاف انواع داده دیگر، چاپ کردن یک Object ممکن است، مفهومی نداشته باشد اما اغلب اوقات ، چاپ کردن یک Object می تواند مفید باشد و توضیحی کلی در مورد آن کلاس به ما بدهد.برای مثال فرض کنید کلاسی به نام Person داریم .چاپ کردن یک Object از این کلاس می تواند مشخصات هر فرد را نمایش دهد.در php5 تابع ()toString__ کار چاپ یک Object را انجام می دهد.

-Interface یک کلاس: مشابه تعریف خود کلاس است با این تفاوت که فقط Prototype توابع (و نه پیاده سازی آنها) و مقادیر ثابت(Constants) در آن آورده می شود.

-ویژگی های حفاظتی در کلاس: برای دسترسی به متغیرها و متدهای یک کلاس می توان با استفاده از کلمات کلیدیpublic ، private و protected سطوح دسترسی تعیین کرد. اعضای عمومی(public) میتوانند از خارج یک شیء ،مورد دسترسی قرار بگیرند.اعضای حفاظت شده(protected) می توانند در داخل خود شیء و یا شیء ای که از آن ارث می برد مورد دسترسی قرار بگیرند.اعضای خصوصی(private) فقط در داخل خود یک کلاس قابل دسترسی هستند .

برای مثال کلاس زیر را در نظر بگیرید:

class MyName {
private $name;
function __construct($name)
{
   $this->name = $name;
}
function __toString()
{
   return $this->name;
}
};

Exception Handling : پیاده سازی دستورات try/catch در php5 به صورت زیر است:

try {
... // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
... // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

بلوک try کد خطاخیز را در بر می گیرد. وقتی یک استثناء(exception) تولید شود برنامه بوسیله یک سری دستورات catch پیگیری می شود .در تعریف این دستورات، کلاس استثناء مورد نیاز برای اداره کردن خطا مشخص می شود و همچنین مشخص می شود که استثناء بوجود آمده تحت چه متغیری در داخل بلوک catch قابل دسترسی می باشد.

در هنگام تولید یک نمونه exception، مقایسه ای بین آن نمونه و کلاس های تعریف شده در catch صورت می گیرد.اگر نتیجه true باشد دستورات آن بلوک catch اجرا می شود و در غیر اینصورت به سراغ دستور catch بعدی می رود.
 تولید یک exception با دستور throw انجام می شود:

throw object;

دستور throw فقط یک Object را برمیگرداند! این Object باید ویژگی هایش را از کلاس Exception که به صورت پیش فرض(built-in) در php5 تعریف شده است به ارث ببرد،در غیر اینصورت منجر به خطای زمان اجرا می شود.

Interface کلاس Exception به صورت زیر است:

class Exception {
function __construct([$message [,$code]]);
final public getMessage();
final public getCode();
final public getFile();
final public getLine();
final public getTrace();
final public getTraceAsString();
protected $message;
protected $code;
protected $file;
protected $line;
}

* براکتهای([]) به کار رفته در تعریف متد سازنده کلاس فقط برای نشان دادن پارامترهای انتخابی(Optional) آن می باشند و از نظر Syntax صحیح نمی باشند!

در ادامه مثالی از اداره کردن خطاها آورده شده است:

کلاس NullHandleException را برای  اداره خطای تهی در نظر می گیریم:

class NullHandleException extends Exception {
function __construct($message)
{
parent::__construct($message);
}
}

تابع printObject بخشی از کد برنامه ما است که خطاخیز است و اگر آرگومان ورودی این تابع تهی باشد یک استثناء تولید خواهد شد:

function printObject($obj){
if ($obj == NULL) {
throw new NullHandleException("printObject received NULL object");
}
print $obj . "\n";
}

کلاسی ساده به نام MyName تعریف می کنیم:

class MyName {
function __construct($name)
{
$this->name = $name;
}
function __toString()
{
return $this->name;
}
private $name;
}

حال،قطعه کد زیر را در برنامه خود در نظر بگیرید:

try {
printObject(new MyName("Ali"));
printObject(NULL);
printObject(new MyName("Hamed"));
} catch (NullHandleException $exception) {
print $exception->getMessage();
print " in file " . $exception->getFile();
print " on line " . $exception->getLine() . "\n";
} catch (Exception $exception) {
// This won't be reached
}

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

Ali
printObject received NULL object in file
C:\projects\php5\tests\test.php on line 12

همانطور که مشاهده می کنید در مثال بالا نام Hamed چاپ نشده است زیرا در اثر تولید یک استثناء، برنامه متوقف شده است.
1384-05-04 01:12:48
علي خليلي
نويسنده:


جستجوی نام های دامنه (Whois) در PHP

اگر به سایتهای ثبت دامنه مانند www.Register.com سر زده باشید، دیده اید که این سایتها امکاناتی برای جستجوی نام دامنه در اختیار شما می گذارند که به شما وجود یا عدم وجود آن نام را اطلاع می دهند و اطلاعاتی نیز درباره فرد یا سازمان صاحب نام می دهد. در این مقاله نحوه ی انجام این کار را با PHP شرح می دهیم:

برای انجام عمل جستجو ابتدا باید یک ارتباط با سرورهایی که بانکهای اطلاعاتی آنها این مشخصات را دارند ارتباط برقرار کرد و با یک Query، اطلاعات مورد نظر را درخواست نمود. این ارتباط از نوع TCP و از طریق پورت 43 انجام می گیرد. لیست کاملی از این سرورها را اینجا می توانید ببینید.

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

<form name="form1" method="post" action="">
  <table width="44%"  border="0" align="center">
    <tr bgcolor="#CCFF99">
      <td colspan="3"><div align="center">WHOIS Look Up </div></td>
    </tr>
    <tr>
      <td width="28%"><div align="right">WWW.</div></td>
      <td width="30%"><input name="domain" type="text"></td>
      <td width="42%">        .
        <select name="ext">
          <option value="com">com</option>
          <option value="net">net</option>
          <option value="org">org</option>
          <option value="biz">biz</option>
          <option value="ir">ir</option>
        </select></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><div align="center">
        <input type="submit" name="Submit" value="Look Up">
      </div></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>

بعد از اینکه فرم ما Submit شد ، باید رشته ای را که می خواهیم به عنوان Query به سرور ارسال نماییم، ایجاد کنیم. برای این کار باید نام درخواستی کاربر را همراه پسوند مورد نظر(Com ،Org،...)  به سرور ارسال نماییم. توجه داشته باشید که هر کدام از سرورهای موجود در لیست فوق الذکر برای جستجوی پسوند خاصی می باشد. برای مثال whois.internic.com تنها برای دامنه های net. و com. و edu. می باشد و اگر دامنه ای با پسوند Info. را با این سرور جستجو نمایید، جواب مطلوب را نخواهید گرفت. پس اولین مرحله کار ،انتخاب سرور مورد نظر با استفاده از دستور switch-case می باشد:

$domain=$_POST['domain'];
$ext= $_POST['ext'];
$whoisServer="";
switch($ext){
case "com":
case "net":
case "edu":
  $whoisServer="whois.internic.net";
  break;
case "org":
  $whoisServer="whois.publicinterestregistry.net";
  break;
case "biz":
  $whoisServer="whois.neulevel.biz";
  break;
case "info":
  $whoisServer="whois.afilias.info";
  break;
case "ir":
case "id.ir":
case "co.ir":
case "net.ir":
  $whoisServer="whois.nic.ir";
  break;
default:
  $whoisServer= "whois.networksolutions.com";
}

در مرحله بعدی صحت ورودی کاربر را با تابع ()namecheck چک می کنیم:

//This checks the name for invaild characters
function namecheck($domain)
{
    if($domain==""){
     echo"لطفا نام دامنه مورد نظر خود را وارد کنید<br>\n";
     return false;
   }
    if(strlen($domain)< 3){
     echo"The domain name  <b>$domain</b>  is too short";
     return false;
   }
    if(strlen($domain)>57){
     echo"The domain name  <b>$domain </b>  is too long";
     return false;
    }
    if(@ereg("^-|-$",$domain)){
     echo"Domains cannot begin or end with a hypen";
     return false;
    }
    if(!ereg("([a-z]|[A-Z]|[0-9]|-){".strlen($domain)."}",$domain)){
     echo"Domain names cannot contain special characters";
      return false;
   }
    return true;
}

بعد از تایید صحت نام دامنه، باید در خواست خود را به سرور مورد نظر ارسال و نتیجه حاصل را دریافت کنیم. تابع ()dolookup این کار را انجام می دهد.این تابع، نام دامنه و سرور مورد نیاز برای جستجو را به عنوان ورودی می گیرد. خروجی این تابع ،شامل رشته برگردانده شده از طرف سرور است:

function dolookup($domain, $server){
$domain = strtolower($domain);
$server = strtolower($server);
if( $domain == '' || $server == '' ) return false;
$data = "";
$fp = @fsockopen($server, 43,$errno, $errstr, 5);
if( $fp ){
  @fputs($fp, $domain."\r\n");
  @socket_set_timeout($fp, 30);
  while( !@feof($fp) ){
   $data .= @fread($fp, 4096);
}
@fclose($fp);
return $data;
}else{
  echo "\n\Error - could not open a connection to <b>$server</b>\n\n";
  return 0;
}
}

* همانطور که می بینید، رشته ای که برای جستجو ارسال می شود به "r\n\" ختم می شود. اگر این رشته را در انتهای نام دامنه قرار ندهید، سرور نمی تواند جواب مطلوب را برگرداند.

مرحله آخر کار، تحلیل رشته برگردانده شده از طرف سرور است.اگر در این رشته، زیر رشته هایی مانند "no match" يا "not found" یا "no entries found" وجود داشته باشد، نام دامنه مورد نظر آزاد می باشد. در غیر اینصورت آن دامنه ثبت شده است. تابع()check_exist این کار را انجام می دهد:

<?
function check_exist($output)
{
   //compare what has been returned by the server
    if (eregi("Can't get information",$output) || eregi("No entries found",$output) || eregi("NOT FOUND",$output) || eregi("No match",$output) ){
        return 0;
    }else{
        return nl2br($output);
    }
}
?>

نحوه به کارگیری این توابع را پس از Submit شدن، در زیر مشاهده می کنید:

if(namecheck($domain)){
if(($output=dolookup($domain.'.'.$ext, $whoisServer))){
  if(!($data=check_exist($output))){
    echo"نام دامنه آزاد است";
   }else{
    echo"متاسفانه این دامنه قبلا توسط شخص دیگری ثبت شده است";
   }
  }
}
}

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

پ.ن :هدف این برنامه بیشتر آشنایی با Socket Programming بودو این روش، روش خوب و کاملی برای جستجوی نام دامنه نیست زیرا ممکن است به دلایل زیر این سرورها مقدار Not Found را برگردانند:

  • سرور در اون لحظه قادر به پاسخگویی نباشد
  • هیچ Whois ای برای Domain موجود نباشد
  • دامنه مورد نظر Whois Protected باشد!

برای این کار، بهترین روش ، استفاده از Web Serviceهاست که دقیقا وضعیت رو مشخص می کند!

مطالب مرتبط:

+ جستجوی نام های دامنه (Whois) در ASP.NET

+ MRWhois Lite- a Whois lookup script written in PHP

+ www.topdog-software.com
1384-05-25 08:26:31
علي خليلي
نويسنده: