صفحه 2 از 2 نخستنخست 12
نمایش نتایج: از شماره 11 تا 16 , از مجموع 16

موضوع: Php

  1. #11
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

    Post كارتهاي الكترونيكي با php وmysql

    كارتهاي الكترونيكي با php وmysql

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

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

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


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


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

    <CENTER>

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


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


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


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



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


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


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


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


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

  2. #12
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

    Post چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ?

    چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ?

    سرفصل‌ها :
    1ـ اين اسكريپت چگونه كار مي كند | پيشنيازها | الگوي بانك اطلاعاتي
    2ـ اتصال به بانك اطلاعاتي |‌ متغيرهاي جلسات
    3ـ هسته اسكريپت | ورود كاربران
    4ـ كنترل مداوم اعتبار ورود | اطمينان از معتبر بودن اطلاعات جلسات

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

    1ـ اين اسكريپت چگونه كار مي كند ؟
    در اين قسمت مي خواهم برايتان دليل انتخاب اين متد براي لاگين امن را برايتان توضيح دهم فراموش نكنيد كه اصولا امنيت قانون ندارد و شما نيز با استفاده از تجربيات و توانايي هاي هوشي خود بايد به فكر توسعه و طراحي موارد مشابه و امن تر نمائيد و به هيچ وجه به اين حد بسنده نكنيد:
    /tmpكاربراني كه قادرند تا به سرور دست يابي داشته باشند مي تواند جلسات معتبر لاگينها را از شاخه پيش فرض كه به منظور ذخيره سازي اطلاعات جلسات استفاده ميشود مشاهده نمايند روش جلوگيري از اين نوع حمله كنترل آي پي مي باشد.

    كساني كه بر روي ميزبان شما سايتي دارند قادرند جلسات معتبر براي سايت شما توليد كنند توجه بفرمائيد كه برخي سايتها سرورهاي اختصاصي دارند كه به لحاظ امنيتي بسيار مطلوبترند مثل سايت پرشين بلاگ
    برخي از اون آدمايي كه به قول خودمون آخرشن و اند حكن مي تونن شبكه رو بو بكشن و كوكي‌ها رو بقاپن كنترل آي پي اين مشكل رو هم حل مي كنه

    2-1ـ اما پيش نيازها
    شما اول از همه بايد بدونين كه چه اطلاعاتي از كاربران قرار كه در سايت ذخيره بشه در اين مثال براي سهولت آموزش ساده ترين شكل ممكن رو فرض قرار دادم ضمنن چون الان همه ديگه پي اچ پي 4.1 به بالا دارن من هم از استفاده كردم اگر مي خواين كه اين اسكريپت رو روي نسخه هاي قديمي تر اجرا كنين شما super global arrays
    مجبوريد كه از
    $GLOBALS['HTTP_SESSION_VARS']
    استفاده كنيد.

    الگوي بانك اطلاعاتي ـ1-3
    اين فقط يك مثال ساده با ساختاري مناسب براي مديريت اگر كه مايليد اين مثال را براي كاربران ثبت نام شده استفاده كنيد مي توانيد ستونهاي را به دلخواه اضافه كنيد
    من الگوي بانك اطلاعاتي را كه از ماي اس كيو ال استفاده مي كنه اينجا گذاشتم شما مي تونين از ديگر بانكهاي اطلاعاتي نيز استفاده كنيد:


    CREATE TABLE member (
    id int NOT NULL auto_increment,
    username varchar(20) NOT NULL default '',
    password char(32) binary NOT NULL default '',
    cookie char(32) binary NOT NULL default '',
    session char(32) binary NOT NULL default '',
    ip varchar(15) binary NOT NULL default '',
    PRIMARY KEY (id),
    UNIQUE KEY username (username)
    );

    فيلدهاي پسورد و كوكي براي استفاده از ام دي فايو طراحي شدن كوكي مقدارش براي زمانيست كه كاربر بخواهد اطلاعات برايش ذخيره شود و فيلدهاي جلسه و آي پي براي جلسه آي دي و آي پي كاربر استفاده مي شوند.

    ــــــــــــــــــــــــــــــــــــــ
    2ـ اتصال به بانك اطلاعاتي

    function &db_connect() {

    require_once 'DB.php';

    PEAR::setErrorHandling(PEAR_ERROR_DIE);

    $db_host = 'localhost';
    $db_user = 'root';
    $db_pass = '';
    $db_name = 'shaggy';

    $dsn = \"mysql://$db_user:$db_pass@unix+$db_host/$db_name\";

    $db = DB::connect($dsn);

    $db->setFetchMode(DB_FETCHMODE_OBJECT);
    return $db;

    }

    اين تابع شما را به بانك اطلاعاتي متصل مي كند و يك اشاره گر به شي بانك اطلاعاتي پير باز مي گرداند

    2-2ـ متغيرهاي جلسات:
    براي سهولت در امر دستيابي به اطلاعات كاربران من اون رو يك متغير جلسه ثبت مي كنم ولي براي جلوگيري از پيغام خطا و همچنين ست كردن برخي پيش فرض ها از تابع زير استفاده مي كنم:

    function session_defaults() {

    $_SESSION['logged'] = false;
    $_SESSION['uid'] = 0;
    $_SESSION['username'] = '';
    $_SESSION['cookie'] = 0;
    $_SESSION['remember'] = false;
    }

    براي ست كردن يه مقادير پيش فرض از تابع بالا و براي چك كردن از تابع زير

    if (!isset($_SESSION['uid']) ) {
    session_defaults();
    }

    رو فرا خواني كنيمsession_startالبته فراموش نمي كنيم كه قبل از اينها بايد تابع

    3ـ هسته اسكريپت:
    براي ايجاد يكپارچگي ساده تر با ديگر اسكريپتها و ساخت مدوله شده تر هسته اسكريپت رو يك آبجكت با ظاهري خيلي ساده مي سازم

    class User {

    var $db = null; // PEAR::DB pointer
    var $failed = false; // failed login attempt
    var $date; // current date GMT
    var $id = 0; // the current user's id

    function User(&$db) {

    $this->db = $db;
    $this->date = $GLOBALS['date'];

    if ($_SESSION['logged']) {
    $this->_checkSession();
    } elseif ( isset($_COOKIE['mtwebLogin']) ) {
    $this->_checkRemembered($_COOKIE['mtwebLogin']);

    }

    }

    اين كلاس كه تعريف ميشه آبجكت ما رو ميسازه البته اين كاملا مدوله شده نيست اما يك تاريخ مشكل بزرگي نيست و شما مي تونين اونو با اسكريپتهايي كه بقيه دوستان نوشتن به صورت شمسي توليد كنيد در اينجا ما چنين چيزي رو مي سازيم:


    $date = gmdate(\"'Y-m-d'\");
    $db = db_connect();
    $user = new User($db);

    حالا براي روشن شدن هدف كد يعني لاگين كردن تلاش مي كنيم ما ابتدا كنترل مي كنيم كه آيا كاربر لاگين كرده يا نه اگر اين كار رو كرده بود ما جلسات رو چك مي كنيم(فراموش نكنين كه اين يك كد امنيتي) وگرنه يك كوكي رو نام گذاري مي كنيم براي كنترل كردن اين به ما اجازه مي ده كه بينندگان سايت رو شناسايي كنيم

    3-1ـ لاگين كردن كاربران:

    براي اجازه دادن به كاربران براي لاگين كردن شما بايد يك فرم وب بسازيد پس از اعتبار سنجي فرم شما مي تونيد اعتبار كاربر رو براي تائيد اطلاعات وارد شده كنترل كنيد كه براي اينكار از
    $user->_checkLogin('username', 'password', remember)
    استفاده مي كنيم
    خاطر نشان مي كنيم كه يوزر نيم و پسورد البته نبايد ثابت باشند و ريممبر يك مقدار بولين است كه به كاربر اجازه مي دهد تا با درست قرار دادن مقدار آن لاگين خودكار را فعال بسازد

    function _checkLogin($username, $password, $remember) {

    $username = $this->db->quote($username);
    $password = $this->db->quote(md5($password));

    $sql = \"SELECT * FROM member WHERE \" .
    \"username = $username AND \" .
    \"password = $password\";

    $result = $this->db->getRow($sql);

    if ( is_object($result) ) {
    $this->_setSession($result, $remember);
    return true;
    } else {
    $this->failed = true;
    $this->_logout();
    return false;
    }

    }

    تعريف تابع بايد در مكاني كنار كلاس تعريف شده يوزر باشه مانند تمام كدهاي پائين در تابع از متدPEAR::DB's quote استفاده كردم تا اطلاعات با امنيت كامل به بانك اطلاعاتي انتقال پيدا كنند و به صورت بي ختري نيز از آن رهاي يابند و باز گردنند من از تابع ام دي فايو ترجيحا به جاي توابع ماي اسكيو ال استفاده كردم تا شما اگر مايل بوديد بتوانيد از بانكهاي اطلاعاتي ديگر نيز استفاده كنيد.

    حلقه ور بهينه شده زيراكه يوزرنيم به صورت منفرد تعريف شده است نيازي به كنترل خطاهاي بانك اطلاعاتي نيست زيراكه خطاهاي پيشفرض قبلا در بالا ست شدند چنانچه آبجكت با رزالت بانك اطلاعاتي متچ شود لذا متغير جلسات ست مي شوند و مقدار ترو باز ميگردد وگرنه مقدار فلد با ترو برابر مي گردد شما مي تونين اينجا يك دستور كنترلي قرار دهيد تا پيغام سقوط عمليات لاگين رو اعلام كنه و براي انجام لاگ اوت براي اين بيننده كافيست تا session_defaults() را اجرا كنيم

    3-3ـ وضع كردن جلسه:

    function _setSession(&$values, $remember, $init = true) {

    $this->id = $values->id;
    $_SESSION['uid'] = $this->id;
    $_SESSION['username'] = htmlspecialchars($values->username);
    $_SESSION['cookie'] = $values->cookie;
    $_SESSION['logged'] = true;

    if ($remember) {

    $this->updateCookie($values->cookie, true);

    }

    if ($init) {

    $session = $this->db->quote(session_id());
    $ip = $this->db->quote($_SERVER['REMOTE_ADDR']);

    $sql = \"UPDATE member SET session = $session, ip = $ip WHERE \" .
    \"id = $this->id\";
    $this->db->query($sql);

    }

    }

    اين متد متغير جلسه را ست مي كند و همچنين اگر در خواست كوكي براي داشتن لاگين مسمتر (خودكار) ارسال شده باشد
    همچنين اين متد يك پارامتر دارد كه معين مي كند كه اين بار اول لاگين كردن است يا نه (از طريق فرم يا كوكي)
    يا كنترل جلسه براي اولين بار نيست.

    4ـ لاگين خود كار:
    اگر بينندگان در خواست كنند كه كوكي ارسال بشه تا دفعات بعدي از لاگين كردن در هر مشاهده از سايت بپريد
    اين دو متد به شما براي رسيدن به اين مهم كمك خواهد كرد

    function updateCookie($cookie, $save) {

    $_SESSION['cookie'] = $cookie;
    if ($save) {

    $cookie = serialize(array($_SESSION['username'], $cookie) );
    set_cookie('mtwebLogin', $cookie, time() + 31104000, '/directory/');
    }

    }

    4-1ـ كنترل لاگين خود كار:
    اگر كاربران لاگين خودكار را انتاخاب كرده باشند كه به اسكريپت اجازه ذخيره كوكي را مي دهد كه كنترل مي شه از طريق متد زير

    function _checkRemembered($cookie) {

    list($username, $cookie) = @unserialize($cookie);
    if (!$username or !$cookie) return;

    $username = $this->db->quote($username);
    $cookie = $this->db->quote($cookie);

    $sql = \"SELECT * FROM member WHERE \" .
    \"(username = $username) AND (cookie = $cookie)\";

    $result = $this->db->getRow($sql);

    if (is_object($result) ) {
    $this->_setSession($result, true);
    }

    }

    اين تابع هرگز نبايد توسط پيغام خطايي متوقف شود براي ساختن چيزهاي امن تر با كوكي ها مقدار كوكي در كوكي ذخير مي شود نه پسورد كاربر يكي از اين راه ها مي تونه درخواست يك لغت عبور باشه براي ناحيه اي كه به امنيت بيشتري نياز دارد

    5-5ـ مطمئن شدن از اعتبار جلسه:

    function _checkSession() {

    $username = $this->db->quote($_SESSION['username']);
    $cookie = $this->db->quote($_SESSION['cookie']);
    $session = $this->db->quote(session_id());
    $ip = $this->db->quote($_SERVER['REMOTE_ADDR']);

    $sql = \"SELECT * FROM member WHERE \" .
    \"(username = $username) AND (cookie = $cookie) AND \" .
    \"(session = $session) AND (ip = $ip)\";

    $result = $this->db->getRow($sql);

    if (is_object($result) ) {
    $this->_setSession($result, false, false);
    } else {
    $this->_logout();
    }

    }


    پوف بالاخره آخرين قسمت كار ما كنترل مي كنيم كه آيا كوكي ذخيره شده در جلسه درست هست يا نه جلسه آي دي و آي پي كاربر با يك پارامتر كه اجازه مي ده كه بفهميم كه اين اولين بار لاگين كردن در سيستم هست بنابراين setSessionفراخواني مقدار آي پي و آي دي در جلسه بروز رساني نشود كه در بقيه موارد بطور معمول انجام مي شود

  3. #13
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

    Post مديريت فايل هاي ارسالي توسط كاربران

    مديريت فايل هاي ارسالي توسط كاربران



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

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



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

    enctype=\"multipart/form_data\">

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


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


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

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

    }
    }?>


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

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

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

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


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


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


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


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

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


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

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

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


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


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

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


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



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

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


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

    enctype=\"multipart/form_data\">

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


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


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


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

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


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

    روش HTTP PUT
    روش ديگري نيز براي ارسال فايل به سرور وجود دارد كه بسيار ساده تر از روش بالا عمل مي كند ولي چون اين روش براي حفظ امنيت سرور نياز به تنظيمات خاصي در سرورها دارد از توضيح آن در اينجا صرف نظر كرده ام . چنانچه مايل به آشنايي با اين روش هستيد به آدرس زير مراجعه كنيد

    http://www.php-center.de/en-html-manual/features.file-upload.put-method.html

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

  4. #14
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

    Post ۷ دلیل برای اینكه استفاده از Php بهتر از Asp می باشد

    مقدمه :

    به دلیل سٶالات زیادی كه در مورد این موضوع شده بود تصمیم گرفتم كه كمی در مورد این موضوع تحقیق و نتیجه برای استفاده همان در سایت IranPHP.net برای استفاده همگان قرار دهم . قبلا گفته باشم كه اینها تنها برداشت های شخصی من در این تحقیق می باشد و خوشحال می شوم كه بقیه ایرادات من را در این تحقیق برایم ارسال كنند به دلیل اینكه من تجربه كار با ASP را ندارم و همچنین بعضی اطلاعات من مربوط به ASP است و NET. را شامل نمی شود .

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

    اولین باری كه یك كد به زبان PHP نوشتم بر روی یك كامپیوتر Pentium 166Mhz بود بر روی سیستم عامل Linux و به همراه Apache Web Server . بسیار برایم جالب بود كه چقدر كد های من سریع اجرا می شوند . یعنی در آن موقع با اگر شما یك Windows NT بر روی آن می توانستید سوار كنید و به فرض كه IIS هم بر روی آن بالا می آمد فكر كنم اصلا وقت Serve كردن صفحات عادی html را نداشت چه برسد به اینكه بخواهد ASP را هم اجرا كند . علتش این است كه Microsoft از یك Technology در اجرا كردن كدهای زبان ASP استفاده می كند كه در آن هر موقع شما تصمیم به استفاده از یك عنصر خارجی مانند VBScript, MSSQL, ODBC و خیلی چیزهای دیگر كه در حقیقت از Engine های خارجی استفاده می كنند دستور به آن Engine خارجی می دهد و جواب بدست آمده را بررسی و برای استفاده در اختیار ادامه برنامه می گذارد . همین رفت و برگشت و اجرا كردن Engine های خارجی باعث كند شدن سرویس دهی می شود كه این را شما به خوبی می توانید در استفاده از MSSQL به طرق مختلف احساس كنید . مثلا اگر شما خود MSSQL Extentions برای استفاده از MSSQL استفاده كنید برای یك Query مشترك ۱.۸۸ ثانیه زمان تلف می شود و اگر همان را با استفاده از ODBC اجرا نماﺋید زمانی در حدود ۹.۵۴ ثانیه تلف می شود كه این خود نشان می دهد كه ASP اینها را به تنهاﺋی اجراء نمی كند و از Engine های ویندوز استفاده می كند .


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

    در IIS4 اگر شما در یك صفحه مثلا ۲۰ بار یك صفحه را Include كنید این صفحه ۲۰ بار در حافظه بارگذاری می شود و در حقیقت حافظه شما ۲۰ برابر زیادتر اشغال می شود . البته شنیدم كه این مشكل در ویندوز ۲۰۰۰ و IIS5 حل شده است اما بازهم برای كسانی كه ASP را مینویسند و می خواهند آنرا بر روی سرور های Hosting كه دارای سیستم عامل NT هستند اجرا كنند مشكل زا است و باعث كند شدن سیستم می شود و در Load بالا مسلما مشكل زا خواهد شد .
    این مشكل به طور كلی در PHP وجود نداشته و ندارد و استفاده درست از Memory در هنگام اجرای یك كد باعث شده است كه صفحات در Load بالا نیز به خوبی قابل رٶیت باشند .


    ۳- خرج اضافی ندارید !
    مثلا در ASP اگر بخواهید از امكاناتی نظیر Encryption یا File Uploading یا ارسال نامه توسط كد برنامه استفاده كنید باید امكانات اضافی برای این كار خریداری كنید و نصب كنید تا این امكانات به IIS شما اضافه گردد . این در حالیست كه در PHP همه اینها در هنگام Compile در نظر گرفته می شوند و همگی از امكانات Standard این زبان هستند و هیچ نصب یا خرج اضافی در كار نیست .

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

    در اینجا قصد ندارد به مقایسه MySQL و MSSQL بپردازم . اما به خاطر قدرت خارق العاده MySQL و سازگار بودن این DBMS با زبان PHP به صورتیكه PHP اتصال به MySQL را به صورت دستورات Internally پشتیبانی می كند و حتی نیاز به نصب Module اضافی برای این كار نمی باشد ، از سرعت بسیار بالاﺋی در كار با SQL برخوردار است كه شاید بعدا در مورد MySQL مقاله ای نوشتم .

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

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

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

    تا حالا از Microsoft خواسته اید كه ایرادی را در سیستمهای خود رفع كند ؟ مسلما اگر شركت بزرگی مانند Boeing نباشید حرف شما خیلی خریدار ندارد یا لااقل به این زودی ها به نتیجه نمی رسید .
    OpenSource بودن PHP این امكان را به شما می دهد كه شخصا اقدام به رفع مشكل كنید و آنرا برای دستندركاران PHP ارسال كنید و یا اینكه در Mailing List های عمومی PHP موضوع را مطرح كنید و خواهید دید كه از سراسر دنیا برای رفع ایراد شما Patch ارسال می گردد .


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

    درست است كه خیلی از این ایرادات را Microsoft رفع خواهد كرد و Technology های جدیدتر اراﺋه خواهد كرد ( چه بسا این Net. كه الان آمده همه را درست كرده باشد ) اما یك مشكل اساسی برای ASP وجود دارد و آن این است كه ASP بدون Windows یعنی هیچ ! بدلیل اینكه ASP نصفی از كدها را توسط Engine های ویندوز اجرا می كند كه در سیستم عامل های دیگر خبری از آنها نیست . لذا ASP در سیستم عاملهای دیگر همیشه دارای ضعفهای بزرگی است .

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

  5. #15
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

    Post نکاتی مفید در مورد تنظیم php.ini

    نکاتی مفید در مورد تنظیم php.ini

    فايل پيکربندي PHP
    قبل از شروع مطالب نگاهي اجمالي به ويژگيهاي فايل پيکربندي PHP منطقي به نظر مي رسد. نام اين فايل php.ini مي باشد و به دلايلي از ساختار کلي فايلهاي ini که بيشتر در برنامه هاي کاربردي ويندوز استفاده مي شود، پيروي مي کند. اين فايل متني به صورت ASCII مي باشد که به بخشهايي (session) تقسيم مي شود. هر بخش متغيرهايي را که مربوط به آن بخش مي شوند، در بر مي گيرد. هر بخش چيزي شبيه زير مي باشد:


    [MySection]
    variable=\"value\"
    anothervariable=\"anothervalue\"



    نام بخش در يک جفت براکت"[]" در بالا قرار مي گيرد. و زير آن در هر سطر يک متغير با مقدارش قرار مي گيرد. متغيرها به حروف حساس (case sensitive) هستند و نمي توانند شامل فاصله (space) باشند، در حالي که مقادير متناظر آنها مي توانند اعداد، رشته کاراکتري (string) و يا Boolean باشند.

    سمي کالن ";" در ابتداي هر سطر به عنوان نشانگر درج توضيحات (comment) مي باشد. اين راهي ساده براي فعال يا غيرفعال کردن ويژگيهاي PHP مي باشد، به جاي حذف کردن يک سطر مي توانيد به اين روش آن را به توضيح تبديل کرده که در پردازش فايل ها شرکت نخواهد کرد. در صورتي که فکر مي کنيد ممکن است بعد ها بخواهيد از ويژگي که اکنون به کارتان نمي آيد، استفاده کنيد بهتر است آن را پاک نکنيد.

    براي اينکه PHP بتواند فايل php.ini را تشخيص بدهد بايد آن را در دايرکتوري جاري، دايرکتوري که در متغير $PHPRC تعريف شده، يا دايرکتوري که هنگام کامپايل مشخص شده است(براي ويندوز اين همان دايرکتوري اصلي PHP است) نگهداريد.

    بعد از اينکه شما تغييراتي در فايل php.ini داديد براي آنکه تغييرات اعمال شوند بايد سرور خود را مجددا راه اندازي نماييد (سرور را restart کنيد). البته فرض بر اين است که شما قبلا در حال استفاده PHP بر سرور خود بوده ايد. براي استفاده هاي command-line از PHP فايل پيکربندي php.ini در هرباري که برنامه PHP احضار مي شود خوانده و چک مي شود.


    تنظيم ويژگيهاي مفسر
    اولين مرحله در اين مقاله از مهمترين گامهاي آن مي باشد، ويژگيهايي که به مفسر زبان PHP مربوط مي شود. اولين مورد در اينجا engine variable مي باشد که چک مي کند که PHP engine بايد فعال "on" يا غير فعال "off" باشد. Off کردن اين متغير به معني اين است که کدهاي PHP توسط سرور تفسير نشوند.معمولاً نيازي به اين تغيير حس نمي شود، پس اين متغير را به صورت on رها کنيد.


    engine=On



    متغير short_open_tag کنترل مي کند که آيا مفسر بايد تگهاي کوتاه را همانند تگ استاندارد تشخيص دهد يا نه.در صورتي که تشخيص مي دهيد اين نمونه تگها باعث ناسازگاري با ديگر زبانها مي شوند يا اينکه تصميم به استفاده از قوانين syntax مختص PHP داريد مي توانيد آن را off کنيد.


    short_open_tag = On



    معمولاً session, cookie و اطلاعات HTTP header در يک اسکريپت PHP بايد قبل از توليد هرگونه خروجي توسط آن اسکريپت فرستاده شوند. در صورتي که اين در برنامه شما امکان پذير نيست مي توانيد هر چه را که PHP به نام output buffering مي شناسد، توسط متغيرهاي output_buffering فعال کنيد.

    با on بودن output buffering، زبان PHP خروجي اسکريپت شما را در يک بافر مخصوص نگه مي دارد و هنگامي آنها را مي فرستد که به طور مشخص به آن دستور داده شود. اين به شما امکان مي دهد که cookieها يا اطلاعات HTTP header را از وسط يا انتهاي کد اسکريپت خود بفرستيد. هرچند اين مي تواند کارآيي را در حاشيه کاهش دهد.


    output_buffering = Off



    شما مي توانيد با يک عدد به عنوان مقدار براي متغير output_buffering اندازه بافر را تعيين کنيد.


    output_buffering = 2048



    هنگامي که PHP شروع به کار مي کند يک پيام حاوي شماره نسخه خود به هدر استاندارد سرور مي افزايد.براي غيرفعال کردن آن مي توانيد متغير expose_PHP را off کنيد.اين مي تواند مفيد باشد، مثلا اگر بخواهيد امکانات وب سرور خود را از ديد هکرها پنهان کنيد.


    expose_PHP = On


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


    include_path = \".:/usr/local/lib/php/pear:\"



    کاربران ويندوز براي مشخص کردن چندين دايرکتوري بايد از سمي کالن";" بين آنها استفاده کنند و کاربران unix از کالن ":".

    دو متغير جالب در اين زمينه auto_prepend_file و auto_append_file مي باشند. اين متغيرها فايلهايي را مشخص مي کنند که PHP به ابتدا يا انتهاي هر سند PHP اضافه خواهد کرد. اين مورد بيشتر براي اضافه کردن header و footer به صفحاتي است که توسط PHP ايجاد مي شوند، به طوري که باعث مي شود تعدادي خط کد به هر سند PHP که شما مي نويسيد اضافه گردد.
    اين فايلها هم مي توانند اسکريپتهاي PHP و هم html معمولي باشند، ولي کدهاي PHP براي اين امر بايد در تگ استاندارد محصور شده باشند.


    auto_prepend_file = /home/web/includes/header.php
    auto_append_file = /home/web/includes/legal.php




    چگونگي رفتار با خطاها
    خطا ها در PHP در چهار دسته مي آيند: parsing errors يا خطاي زمان تجزيه (کامپايل)، تذکرات درمورد خطاهاي موجود در کد مثلا مقدار دهي نکردن يک متغير، warning يا هشدار و fatal error. معمولا هنگامي که PHP با يکي از خطاهاي parsing error يا warning يا fatal error مواجه مي شود، خطاها را نمايش مي دهد و اگر خطا از نوع fatal error باشد اجراي اسکريپت را در همان نقطه متوقف مي کند. شما مي توانيد اين رفتار را با متغير error_reporting که چند فيلد خطا را مي گيرد و تنها خطاهايي را که با آنها سازگار باشند نمايش مي دهد، اصلاح کنيد.


    error_reporting = E_ALL



    براي غير فعال کردن نمايش خطاها مقدار متغير display_errors را به نادرست تغيير دهيد و به جاي آن پيام خطاها را در ثبات خطاها از طريق متغير log_errors بنويسيد.
    انجام اين کار براي امنيت بيشتر مفيد است، با غيرفعال کردن نمايش خطا شما اطلاعات ويژه سيستم خود را مخفي مي کنيد بدون توجه به اينکه آيا کاربران قصد خراب کردن سايت شما را دارند يا فقط استفاده مي کنند.به جاي آن شما بايد خطاها را در يک فايل دلخواه يا ثبات خطاي سيستم (system logger)، با تنظيم مقدار متغير error_log به مسير فايل انتخابي يا مقدار پيش فرض "syslog"، ثبت کنيد. فقط به ياد داشته باشيد که مرتبا به اين فايل سربزنيد تا ببينيد که در برنامه شما چه خطاهايي وجود دارد.


    display_errors = Off
    log_errors = On
    error_log = \"error.log\"




    فعال کردن توسعه ها
    توسعه هاي متعددي براي PHP موجود است. در سيستمهاي يونيکس لازم است که اين توسعه ها در زمان کامپايل ساخته شوند. در ويندوز، dll هاي باينري وجود دارند که بايد ضميمه شوند. متغير extension_dir محتوي نام شاخه اي است که PHP در آن به دنبال اين توسعه ها مي گردد. مثلا:


    extension_dir = \"C:\Program Files\Internet Tools\Apache\bin\php4\extensions\"



    نسخه ويندوز PHP به همراه ۲۰ توسعه منتشر مي شود که تمامي آنها در فايل php.ini ليست شده اند. براي فعال کردن هر توسعه، علامت سمي کالن جلوي آن را حذف کرده و سرور خود را از نو راه اندازي کنيد. براي غير فعال کردن يک توسعه نيز مي توانيد جلوي آن علامت سمي کالن رو اضافه کنيد.

    اگر توسعه مورد نظرتان در ليست توسعه ها در فايل php.ini نيست از متغير extension استفاده کرده و نام dll مورد نظر را به آن نسبت دهيد. مثلا:


    extension=php_domxml.dll
    extension=php_dbase.dll




    تنظيم متغيرهاي مربوط به توسعه ها
    متغير هاي مربوط به توسعه ها، در بخش جداگانه اي از فايل پيکربندي (php.ini) ذخيره مي شوند. براي مثال تمام متغيرهايي که به توسعه هاي MySQL مربوط مي شوند بايد در قسمت [MySQL] در فايل php.ini، قرار بگيرند.

    اگر قصد استفاده از تابع mail در PHP را داريد، 3 متغير وجود دارد که بايد آنها را تنظيم کنيد. متغيرهاي SMTP و sendmail_from (در ويندوز) يا sendmail_path (در يونيکس) در هنگام ارسال e-mail از طريق تابع mail مورد استفاده قرار مي گيرند. در ويندوز اين متغير ها براي تنظيم SMTP Server و همچنين براي تعيين آدرس From در ساختار e-mail به کار مي روند. در يونيکس متغير sendmail_path مسير MTA يا Mail Transfer Agent را براي ارسال mail تنظيم مي کند.


    SMTP = myserver.localnet.com
    sendmail_from = me@localhost.comThis email address is being protected from spam bots, you need Javascript enabled to view it
    sendmail_path = /usr/sbin/sendmail



    متغيرهاي java.class.path ، java.home، java.library و java.library.path همگي آدرس کلاس ها و کتابخانه هاي جاوا را تنظيم ميکنند. اين مقادير به وسيله توسعه هاي جاوا مورد استفاده قرار مي گيرند. بنابراين اگر مي خواهيد PHP بتواند ارتباط صحيحي با برنامه هاي جاواي شما برقرار کند از درستي و معتبر بودن مقادير اين متغير ها اطمينان حاصل کنيد.


    java.class.path = .\php_java.jar
    java.home = c:\jdk
    java.library = c:\jdk\jre\bin\hotspot\jvm.dll
    java.library.path = .\



    متغير session.save_path مشخص کننده آدرس شاخه موقتي است که براي ذخيره اطلاعات session ها بکار مي رود. معمولا اين متغير به طور پيش فرض مقدار /tmp را دارد، اما از آنجا که اين شاخه در ويندوز وجود ندارد بايد آن را با آدرس درست شاخه موقت ويندوز تصحيح کنيد در غير اين صورت هنگام فراخواني دستور session_start با خطا مواجه مي شويد. همچنين مي توانيد با تنظيم متغير session.cookie_lifetime مدت اعتبار cookie هاي session را بر حسب ثانيه مشخص کنيد.


    session.save_path = c:\windows\temp
    session.cookie_lifetime = 1800



    تنظيمات مربوط به امنيت
    تعدادي متغير در php.ini وجود دارد که به امنيت PHP نصب شده بر روي سيستم شما مريوط مي شوند. مهمترين آنها متغير safe_mode مي باشد که به طور مثال استفاده از آن براي محدود کردن آنچه کاربر مي تواند از طريق PHP انجام دهد بهISP ها توصيه ميشود.


    safe_mode = Off



    اگر safe mode فعال باشد (safe_mode = on) مي توانيد با تنظيم متغير safe_mode_include_dir مشخص کنيد که کدام شاخه ها براي فايل ها مورد جستجو قرار بگيرند. همچنين ميتوانيد نوع برنامه هايي که کدهاي PHP مي توانند از طريق فرمان exec آنها را اجرا کنند، را محدود کنيد. بدين منظور بايد اين برنامه هاي مجاز را در يک شاخه مخصوص قرار دهيد و از طريق متغير safe_mode_include_dir به PHP بگوييد که تنها در آن شاخه به دنبال آنها بگردد.بدين ترتيب تنها برنامه هاي درون اين شاخه توسط فرمان exec قابل دسترس خواهند بود.


    safe_mode_include_dir = /usr/local/lib/php/safe-include
    safe_mode_exec_dir = /usr/local/lib/php/safe-bin



    شما مي توانيد اعمال مربوط به فايل ها را از طريق متغير open_basedir محدود کنيد. آدرس نسبت داده شده به اين متغير به عنوان ريشه اصلي (root) براي اعمال مربوط به فايل ها به کار مي رود. وقتي که اين متغير مقدار مي گيرد فايلهايي که در ساختار درختي اين ريشه نباشند براي PHP غير قابل دسترس خواهند بود. اين روش مناسبي براي محدود کردن کاربران يک سيستم اشتراکي مي باشد تا آنها تنها به آدرسهاي مربوط به خودشان دسترسي داشته باشند.


    open_basedir = /home/web/



    متغير max_execution_time تعيين ميکند که PHP حداکثر چند ثانيه منتظر پايان يافتن يک کد باشد قبل از آنکه به اجبار آن را خاتمه دهد. وقتي کد شما گرفتار حلقه هاي بينهايت ميشود اين متغير بکار مي آيد.اگر چه ممکن است اين موضوع گاهي مزاحمت ايجاد کند مثلا زماني که کد نوشته شده نياز به انجام اعمال زمانبري دارد، مثلا upload کردن يک فايل حجيم. در اين مواقع بايد مواظب باشيد که اين مقدار را افزايش دهيد تا مانع آن شويد که PHP اجراي کد شما را در وسط يک کار مهم خاتمه دهد.


    max_execution_time = 90



    تنظيمات مربوط به upload فايل ها و متغير هاي فرمها
    اگر پيکربندي هاي امنيتي که تاکنون ذکر شد کافي نيست باز هم مي توانيد با غير فعال کردن قابليت upload فايل از طريق متغير file_uploads، يا با محدود کردن حداکثر حجم قابل upload از طريق متغير upload_max_filesize سيستم خود را از اين هم امن تر کنيد. اغلب تمايل خواهيد داشت که فضاي کوچکي را براي upload فايلها اختصاص دهيد مگر اينکه برنامه اي داشته باشيد که قرار باشد فايل هايي نظير يک گالري عکس يا يک FTP Service را پذيرا باشد.


    file_uploads = On
    upload_max_filesize = 2M



    اگر تمايلي به upload کردن فايلها نداريد اما از تعداد زيادي فرم در صفحات PHP تان استفاده ميکنيد، 2 متغير ديگر وجود دارد که بايد برايتان جالب باشد. اول متغير register_globals، علت بيشترين سردردهاي برنامه نويسان با سابقهPHP در PHP 3.x اين متغير به طور پيش فرض فعال بود (on) که موجب ميشد وقتي يک فرم submit مي شد متغيرهاي آن بطور اتوماتيک به متغيرهاي PHP تبديل شوند.
    مسايل امنيتي موجب شد که در PHP 4.x اين متغير بطور پيش فرض غير فعال باشد. (off). در نتيجه متغيرهاي فرم تنها به کمک آرايه هاي ويژه $_GET و $_POST قابل دسترس باشند. اين امر خيلي از کدهاي نوشته شده با PHP 3.x را با مشکل مواجه ساخت. مثلا مقداري که در يک فيلد وارد شده بود در PHP 3.x با $email قابل دسترس بود در حالي که در PHP 4.x با $_POST[email] يا $_GET[email] ميتوان به آن رجوع کرد.
    ميتوانيد اين متغير را غير فعال کنيد (off) تا امنيت بيشتري را در برابر حملاتي که از طريق فرمها صورت مي گيرند برقرار کنيد. به منظور سازگاري با کدهاي نوشته شده با PHP 3.x آن را فعال کنيد:


    register_globals = on



    متغير ديگري که به کار با فرم ها مربوط ميشود post_max_size است که کنترل مي کند حداکثر چه حجم داده اي توسط متد POST يک فرم پذيرفته شود. به نظر نمي آيد که زماني لازم شود اين مقدار را از 8 MB افزايش دهيد. در عوض احتمال دارد بخواهيد آن را به يک مقدار واقعي تر تغيير دهيد. به هر حال اگر قصد داريد از امکانات upload فايل در PHP استفاده کنيد اين مقدار را بيشتر از مقدار متغير upload_max_size قرار دهيد.


    post_max_size = 8M



    يک متغير جديد هم در PHP 5 معرفي شده است: max_input_time. که حداکثر زمان بر حسب ثانيه که عمل دريافت داده هاي ورودي از طريق POST ،GET و PUT مي تواند طول بکشد را مشخص مي کند. اگر برنامه شما تحت يک اتصال کند اجرا مي شود بهتر است اين مقدار را افزايش دهيد تا به برنامه اجازه دهيد مدت بيشتري را به دريافت داده هاي ورودي اختصاص دهد.


    max_input_time = 90




    افزايش کارآيي
    هنوز مقادير ديگري هم وجود دارد که با دستکاري آنها مي توانيد کارايي مفسر PHP را بالا ببريد. به منظور جلوگيري از اجراي کدهايي که ممکن است تمام حافظه موجود سيستم را اشغال کنند، PHP به شما اجازه مي دهد که براي استفاده از حافظه محدوديتي معين کنيد. اين کار از طريق متغير memory_limit قابل انجام است که حداکثر ميزان حافظه قابل استفاده توسط يک برنامه واحد را مشخص مي کند.


    memory_limit = 8M



    مقدار متغير memory_limit اغلب بايد از مقدار متغير post_max_size بيشتر باشد.
    مساله ديگري که با دانستن آن مي توانيد کارايي را افزايش دهيد غير فعال کردن متغيرهاي $argc و $argv است که تعداد و محتواي آرگومان هاي خط فرمان که به يک برنامه ارسال شده اند، را مشخص مي کنند.


    register_argc_argv = false



    همينطور غير فعال کردن آرايه هاي $HTTP_GET_VARS , $HTTP_POST_VARS . چرا که به احتمال زياد در دنياي جديد $_GET , $_POST ديگر نيازي به آنها نيست. غير فعال کردن اين اجزا باعث بهبود کارآيي مي شود البته فقط در PHP 5 و از طريق متغيرregister_long_arrays قابل انجام است.


    register_long_arrays = false




    تابع ini_set
    و در آخر نکاتي در مورد تابع ini_set. در حالي کهPHP تمام تنظيمات اش را در هنگام بالا آمدن، از فايل php.ini مي خواند، اين اجازه را به شما مي دهد که اين تنظيمات را به کمک تابع جالب ini_set و در برنامه خود انجام دهيد. البته اين تغييرات فقط براي همان برنامه اي که در آن از تابع ini_set استفاده کرده ايد اعمال مي شوند .اين تابع 2 آرگومان مي گيرد: نام متغير پيکربندي اي که مي خواهيد مقدارش را تغيير دهيد و مقدار جديد آن. اين هم يک مثال که حداکثر زمان اجراي مجاز براي برنامه اي که اين کد در داخل آن نوشته شده است را افزايش مي دهد.


    <?php

    ini_set('max_execution_time', 600);

    // more code

    ?>


    باز هم يادآوري مي شود که اين تنظيمات در داخل هر برنامه اي که نوشته شود فقط همان برنامه را تحت الشعاع قرار مي دهد. وقتي که برنامه خاتمه پيدا کند مقدار متغير به طور اتوماتيک به مقدار اوليه تغيير خواهد کرد.

    اگر برنامه هايPHP شما بر روي يک سرور مشترک (Shared Server) اجرا مي شوند احتمالا شما دسترسي به فايل پيکربندي php.ini نخواهيد داشت. در اين موارد تابع ini_set کمک شاياني مي کند. چرا که اجازه مي دهد تنظيمات مورد نظرتان را براي برنامه هاي خودتان اعمال کنيد

  6. #16
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

    4/9/1381

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


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

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

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



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


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

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

    }
    ?>

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

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


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

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


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

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

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

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

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


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

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

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

صفحه 2 از 2 نخستنخست 12

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •