بانک کلاس های مفید

شروع موضوع توسط Masoud1365 ‏12 مارس 2011 در انجمن ابزار و کدهای آماده PHP

?

نظر شما درباره اين كلاس؟

  1. عالي

    81.8%
  2. خوب

    9.1%
  3. متوسط

    0 رای
    0.0%
  4. ضعيف

    0 رای
    0.0%
  5. بد

    9.1%
  1. Masoud1365

    Masoud1365 مدیر انجمن

    ارسال‌ها:
    2,919
    تشکر شده:
    1,601
    امتیاز دستاورد:
    113
    به نام خدا !
    خب دوستان ما یه نظر سنجی کردیم واسه اینکه ببینیم یک چنین تاپیکی بزنیم یا نه ! که خب دوستان همه نظر مثبت دادند و بنا بر این ما این تاپیک رو با اهداف زیر ایجاد میکنیم :دی

    1- ساختن یک بانک از کلاس های مفید و به درد بخور برای کاربران
    2- توسعه کلاس هایی که به درد میخورند ولی یکمی ساده هستند و میشه امکانات بیشتری بهشون اضافه کرد.
    3- تغئیر در کلاس هایی که با فارسی مشکل دارند.
    4-اموزش نحوه استفاده از کلاس ها
    اما قوانین این تاپیک

    1- به هیچ وجه در این تاپیک سوال نپرسید و فقط کلاس ها رو قرار بدید. ( سوالاتتون رو در این تاپیک بپرسید )
    2- اگر کلاسی که قرار میدید کپی رایت داره حتما با کپی رایتش قرار بدید. ( یا منبعی که دریافت کردید. )
    3- کلاس رو کامل توضیح بدید که چیکار میکنه ( لازم نیست که همه متد ها رو توضیح بدید هر کدوم که ضروری هست رو توضیح بدید )
    4- خود کلاس رو + یک مثال از اون به صورت یک فایل فشرده به پستتون پیوست کنید ( لینک دانلود خارج از سایت ندید چون ممکنه لینک خراب بشه و بعد از یه مدتی دیگه کسی نتونه دانلودش کنه )
    5- دوستان مثالتون رو همین جا باید بگید ( مثل پست بعدی که خودم قرار دادم:green: )
    6- اگر کلاسی که قرار میدید مطابق با قوانین این تاپیک نباشه پست شما حذف خواهد شد !
    7- فعلا چیز خاص دیگه ای به ذهنم نمیرسه موفق باشید.
     
    آخرین ویرایش: ‏18 مارس 2011
    نوشته شده توسط Masoud1365 در ‏12 مارس 2011
    webmasterafkari، baran17862، KingCyrus و 5 نفر دیگر از این ارسال تشکر کرده اند.
  2. Masoud1365

    Masoud1365 مدیر انجمن

    ارسال‌ها:
    2,919
    تشکر شده:
    1,601
    امتیاز دستاورد:
    113
    خب برای شروع خودم یه کلاس میزارم :green:
    توضیح : یک کلاس تمپلت هست ، بسیار سبک و ساده هست و برای کارهای معمولی خوبه :wink:
    کدهای کلاس :
    PHP:
    <?php
    /***************************************************************************
    *
    *   Author   : Eric Sizemore ( www.secondversion.com & www.phpsociety.com)
    *   Package  : Simple Template Engine
    *   Version  : 1.0.2
    *   Copyright: (C) 2006 - 2007 Eric Sizemore
    *   Site     : www.secondversion.com
    *   Email    : [email protected]
    *   File     : tpl.class.php
    *
    *   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.
    *
    ***************************************************************************/


    // Template engine
    class template
    {
        /**
        * Template variables and their replacements
        *
        * @var array
        */

        var $tpl_vars;
        var $tpl_dir;

        /**
        * Constructor
        */

        function template()
        {
            $this->tpl_vars = array();
        }

        /**
        * Assign our variables and replacements
        *
        * @param  array  Template variables and replacements
        * @return none
        */

        function assign($var_array)
        {
            // Must be an array...
            if (!is_array($var_array))
            {
                die('template::assign() - $var_array must be an array.');
            }
            $this->tpl_vars = array_merge($this->tpl_vars, $var_array);
        }

        /**
        * Parse the template file
        *
        * @param  string  Template file
        * @return string  Parsed template data
        */

        function tpl_add_address($tpl_address){
            if (!$tpl_address){
                $this->tpl_dir='default';
            }
            else {
                $this->tpl_dir=$tpl_address;
            }
        }
        function parse($tpl_files)
        {
            $tpl_file='templates/'.$this->tpl_dir.'/tpl/'.$tpl_files;
            // Make sure it's a valid file, and it exists
            if (!is_file($tpl_file))
            {
                die('template::parse() - "' . $tpl_file . '" does not exist or is not a file.');
            }
            $tpl_content = file_get_contents($tpl_file);

            foreach ($this->tpl_vars AS $var => $content)
            {
                $tpl_content = str_replace('{' . $var . '}', $content, $tpl_content);
            }
            return $tpl_content;
        }
       

        /**
        * Output the template
        *
        * @param string Template file
        */

        function display($tpl_file)
        {
            echo $this->parse($tpl_file);
        }
    }

    ?>
    این از کد های کلاس ! و اما نحوه استفاده از این کلاس
    یک صفحه جدید ایجاد کنید و اسم اونو index.php بزارید و یک شیئ از این کلاس ایجاد کنید مثل کد زیر :
    PHP:
    <?php

    require_once('tpl.class.php');

    $tpl = new template();

    ?>
    بعد از اون باید متد tpl_add_address رو اجرا کنید که یک پارامتر میگیره و اون نام قالب هست.
    شما می توانید آدرس قالب رو خودتون تعیین کنید برای این کار فایل کلاس رو باز کنید و خط 75 رو ببینید.شما اسم قالب رو که در متد tpl_add_address وارد میکنید این کلاس به دنبال شاخه templates و سپس آدرسی که شما دادید میره ما نام قالبمون رو میزاریم my_template
    تا اینجا صفحه index ما باید به شکل زیر شده باشه :
    PHP:
    <?php

    require_once('tpl.class.php');

    $tpl = new template();

    $tpl->tpl_add_address('my_template');

    ?>
    مرحله بعد استفاده از متد assign هست ! یک آرگومان به صورت آرایه میگیره که کلید آرایه نام متغیر و مقدار اون مقداری هست که ما میخواییم نمایش بدید ! ( خیلی سخت گفتم ؟ اشکل نداره با مثال حل میشه ! ) خب کد زیر رو ببینید :
    PHP:
    <?php

    require_once('tpl.class.php');

    $tpl = new template();

    $tpl->tpl_add_address('my_template');

    $tpl->assign(array('sitetitle' => 'My Template','newstitle' => 'Onvane Khabar', 'body'=>'in matne khabare ma ast ke darim toye ghaleb testesh mikonim :D'));

    ?>
    خب ما یه سری متغیر رو مقدار دهی کردیم ( حالا میگم به چه دردی میخورند ! )
    در آخرین مرحله استفاده از کلا ما متد display رو فراخوانی میکنیم این متد یک آرگومان میگیره که یک فایل با پسوند tpl هست که در شاخه قالب ما ایجاد شده
    در نهایت فایل index.php ما تا اینجا باید این شکلی شده باشه !
    PHP:
    <?php

    require_once('tpl.class.php');

    $tpl = new template();

    $tpl->tpl_add_address('my_template');

    $tpl->assign(array('sitetitle' => 'My Template','newstitle' => 'Onvane Khabar', 'body'=>'in matne khabare ma ast ke darim toye ghaleb testesh mikonim :D'));

    $tpl->display('home.tpl');
    ?>
    خب حالا بریم سراغ پوشه ها :
    یه پوشه root داریم که پوشه اصلی ما هست !
    پوشه های ما الان باید به شکل زیر باشه
    کد (Text):
    -root
      -templates
        -my_template
          -tpl
            -home.tpl
      index.php
      tpl.class.php
    حالا فقط فایل home.tpl مونده که اونم به شکل زیر درستش میکنیم.
    HTML:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

    <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <meta name="author" content="Masoud" />

        <title>{sitetitle}</title>
    </head>

    <body>

    <table>
        <tr><td>{newstitle}</td></tr>
        <tr><td>{body}</td></tr>
    </table>

    </body>
    </html>
    حالا فایل index.php رو اجرا میکنیم ! همونطور که مشاهده میکنید تمامی متغیرهایی که داخل {} قرار دادیم و با متد assign مقدار دهی کردیم ، مقدارهاشون جایگزین شدند.

    کل پوشه ها و فایل ها پیوست شد
    موفق باشید:rose:
     

    پیوست ها:

    • root.zip
      اندازه فایل:
      کیلوبایت 2.2
      نمایش ها:
      48
    نوشته شده توسط Masoud1365 در ‏12 مارس 2011
    MrAhmad، KingCyrus، splinter cell و 9 نفر دیگر از این ارسال تشکر کرده اند.
  3. Army.Hidden

    Army.Hidden Active Member

    ارسال‌ها:
    233
    تشکر شده:
    164
    امتیاز دستاورد:
    43
    دریافت نسخه پشتیبان از MySQL

    با سلام خدمت دوستان.
    از مسعود برای این تاپیک تشکر میکنم و بعد هم کلاس DBackup رو توضیح میدم.
    سورس کلاس اصلی :
    PHP:

    <?php
    /*
    ###################################################
    #    Dump data from MySQL database
    #    Name    : DBackup (2011-23-2)
    #    Version : 1.0
    #    Author  : Army.Hidden [ Hossein Sarlak ]
    #        WebSite -> PhpGrp.Com
    #    Description :
    #        $Backup = New DBackup('Location','Username','Password','DBName' [,'Table Name']);
    #    Example :
    #        $Backup = New DBackup('localhost','root','1234','Blog');
    #            And
    #        $Tables=array('Table1','Table2','Table3');
    #        $Backup = New DBackup('localhost','root','1234','Blog',$Tables);
    ###################################################
    */

    class DBackup
    {
        private $GBLocation;
        private $GBUsername;
        private $GBPassword;
        private $GBDBName;
        private $GBTable;
        private $GBDump;
        public function __construct($Location,$Username,$Password,$DBName,$Table = Null)
        {
            $this -> GBLocation = $Location;
            $this -> GBUsername = $Username;
            $this -> GBPassword = $Password;
            $this -> GBDBName = $DBName;
            $this -> GBTable = $Table;
        }
        public function DBackup_Start()
        {
            $this -> DBackup_DBConnect();
            $MySQLinfo = $this -> DBackup_MySQLinfo();
            $Tablelist = $this -> DBackup_Tablelist();
            set_time_limit(0);
            $this -> GBDump = '
    -- PhpGrp.Com [ Army.Hidden ]
    -- http://www.phpmyadmin.net
    --
    -- Host:'
    .$this -> GBLocation.'
    -- Generation Time:'
    .date(" M j, Y ").' at '.date(" G:i A ").'
    -- Server version:'
    .$MySQLinfo[0].'
    -- Server User:'
    .$MySQLinfo[1].'
    --
    -- Database:'
    .$this -> GBDBName.'
    --
    -- --------------------------------------------------------
    '
    ;
            if($this -> GBTable)
            {
                Foreach ($this -> GBTable as $value)
                {
                    $this -> DBackup_Tableinfo($value);
                    $this -> DBackup_Columns($value);
                }
            }else{
                Foreach ($Tablelist as $value)
                {
                    $this -> DBackup_Tableinfo($value);
                    $this -> DBackup_Columns($value);
                }
            }
            return $this -> DBackup_Created();
        }
        private function DBackup_DBConnect()
        {
            @mysql_connect($this -> GBLocation,$this -> GBUsername,$this -> GBPassword);
            mysql_select_db($this -> GBDBName);
            mysql_query("SET character_set_results = 'utf8'");
        }
        private function DBackup_MySQLinfo()
        {
                $iRow = @mysql_fetch_array(mysql_query("SELECT @@version"));    $return[] = $iRow['@@version'];
                $iRow = @mysql_fetch_array(mysql_query("SELECT user();"));        $return[] = $iRow['user()'];
            return $return;
        }
        private function DBackup_Tablelist()
        {
            $return='';
            $iResult = @mysql_query("SHOW TABLES ;");
                while($iRow = @mysql_fetch_array($iResult)){
                    $return[] = $iRow[0];    
                }
            return $return;
        }
        private function DBackup_Tableinfo($TABLE)
        {
    $this -> GBDump .="
    --
    -- Table Structure For Table `$TABLE`
    --
    "
    ;
            $iRow = @mysql_fetch_array(mysql_query("SHOW CREATE TABLE $TABLE"));
            $return = $iRow[1].";\n\n";
            $this -> GBDump .= $return;
        }
        private function DBackup_Columns($TABLE)
        {
            $return ='';
            $iResult = @mysql_query("Select * From $TABLE");
            $iResult_iRow = mysql_num_rows($iResult);
            if($iResult_iRow)
            {
            $return = "
    --
    -- Dumping Data For Table `$TABLE`
    --
    INSERT INTO `$TABLE` VALUES \n"
    ;
            }
            $iResult = @mysql_query("SHOW COLUMNS FROM $TABLE");
            $iResult_iRow = mysql_num_rows($iResult);        
            $this -> GBDump .= $return ;
            $this -> DBackup_ColumnsValues($TABLE,$iResult_iRow);
        }
        private function DBackup_ColumnsValues($TABLE,$Tcc)
        {
            $return='';
            $iResult = @mysql_query("Select * From $TABLE");
            $iResult_iRow = mysql_num_rows($iResult);
                for ($ir=1 ; $ir <= $iResult_iRow ; $ir++)
                {
                    $iRow = @mysql_fetch_array($iResult);
                    $return .= "(";
                        for ($i=1 ; $i <= $Tcc ; $i++)
                        {
                            if($i == $Tcc)
                                $return .= "'".str_replace("'","''",$iRow[$i-1])."'";
                            else
                                $return .= "'".str_replace("'","''",$iRow[$i-1])."',";
                        }
                    if($ir == $iResult_iRow)
                        $return .= ");\n";
                    else
                        $return .= "),\n";

                }
            $this -> GBDump .= $return;
        }
        private function DBackup_Created()
        {
            $tableslist="";
            if($this -> GBTable)
            {
                foreach($this -> GBTable as $value)
                {
                    $tableslist .="-$value";
                }
                $Name = $this -> GBDBName."(".$tableslist.")(".time().")".".sql";
                $Name = str_replace("(-","(",$Name);
            }else{
                $Name = $this -> GBDBName."(AllTable)(".time().")".".sql";
            }    
                    $fwrite = fopen($Name,"w");
                    if(fwrite($fwrite,$this -> GBDump)){
                        return $Name;
                    }
                    fclose($fwrite);
        }
    }
    ?>
     
    این کلاس از تمام تیبل های بانک اطلاعاتی و یا انتخاب چند تیبل یک نسخه پشتیبان میگیره و در مسیر جاری روی سرور ذخیره میکنه.
    ساختار استفاده از کلاس :

    PHP:

    $Backup = New DBackup('Location','Username','Password','DBName' [,'Table Name']);
     
    Location , Username , Password
    اطلاعات مورد نیاز برای Connect به MySQL
    DBName
    نام بانک اطلاعاتی
    Table Name

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

    یک نمونه از مثال :
    PHP:

    <?php
        include 'DBackup.Class.php';
        $Tables=array('Table1','Table2','Table3');
        $DBackup = New DBackup('localhost','root','','dbname',$Tables);
        if($DBackup -> DBackup_Start())
            echo 'Backup Was Created';
        else
            echo 'Error';
    ?>

     
    در مثال بالا از تیبل های 'Table1','Table2','Table3' به صورت کامل یک نسخه پشتیبان گرفته می شود.
    قابل ذکر است که لیست تیبل ها در درون یک آرایه قرار میگیرند.
    یک مثال دیگر :

    PHP:

    <?php
        include 'DBackup.Class.php';
        $DBackup = New DBackup('localhost','root','','dhesab');
        if($DBackup -> DBackup_Start())
            echo 'Backup Was Created';
        else
            echo 'Error';
    ?>

     

    در این مثال نسخه پیشتیبان از تمام Table ها گرفته می شود.


    در صورتی که سوالی بود در داخل تاپیک مورد نظر که مسعود داد سوالات رو مطرح کنید

    با تشکر

     

    پیوست ها:

    • DBackup.zip
      اندازه فایل:
      کیلوبایت 1.7
      نمایش ها:
      41
    آخرین ویرایش: ‏5 سپتامبر 2013
    نوشته شده توسط Army.Hidden در ‏12 مارس 2011
    KingCyrus، k2-4u، amirkhoshhal و 6 نفر دیگر از این ارسال تشکر کرده اند.
  4. MMSHFE

    MMSHFE Member

    ارسال‌ها:
    173
    تشکر شده:
    169
    امتیاز دستاورد:
    16
    با سلام، اين كلاس، CompareValidator هست و مشابه System.Web.UI.WebControls.CompareValidator در ASPX عمل ميكنه. كلاس رو خودم نوشتم و كاربردش در بررسي واردكردن مقدار مشابه در دو كنترل هست (مثلاً رمز عبور و تأييد رمز عبور). عمل بررسي در هر دو سمت سرور و كلاينت قابل بررسي هست. يك مثال هم ضميمه كردم.
    -----
    ويرايش:
    كد كلاس CompareValidator :
    PHP:

    <?PHP
        class CompareValidator
        {
            private $data=array();

            public function CompareValidator($name)
            {
                $this->data['Name']=$name;
                $this->data['BackColor']='#ffff00';
                $this->data['BorderColor']='#ff0000';
                $this->data['ControlToCompare']='';
                $this->data['ControlToValidate']='';
                $this->data['Font']='Tahoma';
                $this->data['ForeColor']='#ff0000';
                $this->data['Height']='25';
                $this->data['Text']='اطلاعات وارد شده يكسان نيست';
                $this->data['Width']='250';
            }

            public function Draw()
            {
                echo '<DIV id="div'.$this->data['Name'].'" style="';
                echo 'background-color: '.$this->data['BackColor'].'; ';
                echo 'border-color: '.$this->data['BorderColor'].'; ';
                echo 'border: solid; ';
                echo 'font-family: '.$this->data['Font'].'; ';
                echo 'color: '.$this->data['ForeColor'].'; ';
                echo 'height: '.$this->data['Height'].'px; ';
                echo 'width: '.$this->data['Width'].'px;"';
                echo '></DIV>'."\n";
                echo '<INPUT type="hidden" name="inp'.$this->data['Name'].'" id="inp'.$this->data['Name'].'" value="">'."\n";
                echo '<SCRIPT language="javascript" type="text/javascript">'."\n";
                echo '    function '.$this->data['Name'].'()'."\n";
                echo '    {'."\n";
                echo '        var cmp = document.getElementById(\''.$this->data['ControlToCompare'].'\');'."\n";
                echo '        var vld = document.getElementById(\''.$this->data['ControlToValidate'].'\');'."\n";
                echo '        var div = document.getElementById(\'div'.$this->data['Name'].'\');'."\n";
                echo '        var inp = document.getElementById(\'inp'.$this->data['Name'].'\');'."\n";
                echo '        div.innerHTML = (cmp.value!=vld.value?\''.$this->data['Text'].'\':\'\')'."\n";
                echo '        inp.value = (div.innerHTML==\'\'?\'true\':\'false\')'."\n";
                echo '    }'."\n";
                echo '</SCRIPT>'."\n";
            }

            public function __get($name)
            {
                if(array_key_exists($name,$this->data))
                {
                    return $this->data[$name];
                }
            }

            public function __set($name,$value)
            {
                if(array_key_exists($name,$this->data))
                {
                    $this->data[$name]=$value;
                }
            }
        }
    ?>
     
    هدف اصلي اين كلاس، تعيين ورود مقدار يكسان در دو كنترل صفحه هست. همونطور كه ميبينيد، خاصيتهايي هم براي تعيين مشخصات كادر پيام خطا و... داره. در مثال زير، نحوه استفاده از اين كلاس رو مشاهده ميكنيد:
    PHP:

    <HTML dir="rtl">
    <HEAD>
    <META http-equiv="content-type" content="text/html; charset=utf-8"/>
    <TITLE>Hello!</TITLE>
    <?PHP
        function __autoload($className)
        {
            require_once $className.'.php';
        }
    ?>
    </HEAD>
    <BODY>
    <FORM action="" method="post">
    <INPUT type="text" id="TextBox1" name="TextBox1" onkeyup="password();"/>
    <INPUT type="text" id="TextBox2" name="TextBox2" onkeyup="password();"/>
    <?PHP
        $cmp=new CompareValidator('password');
        $cmp->ControlToCompare='TextBox1';
        $cmp->ControlToValidate='TextBox2';
        $cmp->Draw();
    ?>
    <INPUT type="submit" value="Send"/>
    </FORM>
    <?PHP
        print_r($_POST);
    ?>
    </BODY>
    </HTML>
     
    كدهاي HTML كه واضح هستن فقط چند مورد در كدهاي PHP هست كه نياز به توضيح داره:
    1- تابع autoload__ در PHP كه از نسخه 5 به بعد اضافه شده، روش كار PHP رو در زمان مواجه شدن با شناسه هاي ناشناخته تعيين ميكنه. در اين مثال، هرموقع به شناسه ناشناخته اي برخورد كرد، فايلي به همون نام و با پسوند php رو ضميمه ميكنه. با اين كار ديگه نيازي نيست موقع صدا زدن يك كلاس، حتماً فايلش رو هم ضميمه كنيم و اين كار بطور خودكار انجام ميشه.
    2- يك شئ از كلاس CompareValidator ايجاد شده و خاصيت ID كنترلهايي كه ميخوايم با هم مقايسه بشن رو بهش اعلام ميكنيم. اگه نياز به تنظيمات ديگري هم باشه (مثل تنظيم متن پيام خطا و رنگ و... هم ميتونيم همينجا انجام بديم (ازطريق خاصيتهاي مربوطه كه در كد كلاس قابل مشاهده است).
    3- با فراخواني تابع Draw شئ مربوطه، كدهاي لازم براي Validation ايجاد ميشه (سمت كلاينت با JS انجام ميشه و در سمت سرور هم ازطريق تگ مخفي كه ايجاد ميشه، ميتونيم ببينيم نتيجه اعتبارسنجي چي بوده).
    موفق و مؤيد باشيد.
     

    پیوست ها:

    آخرین ویرایش: ‏18 مارس 2011
    نوشته شده توسط MMSHFE در ‏18 مارس 2011
    KingCyrus، k2-4u، farik و 3 نفر دیگر از این ارسال تشکر کرده اند.
  5. MMSHFE

    MMSHFE Member

    ارسال‌ها:
    173
    تشکر شده:
    169
    امتیاز دستاورد:
    16
    با سلام، اين بار يك كلاس كامل براي جمع آوري آمار بازديد سايت آماده كردم كه كدش رو ميتونيد ببينيد:
    PHP:

    <?PHP
        //Copyright محمد مصطفي شهركي @ http://www.ncis.ir
        class Visits
        {
            private $now;

            public function Visits()
            {
                $this->Today();
            }

            private function Today()
            {
                $this->now = new DateTime('now');
            }

            private function Connect()
            {
                mysql_connect('localhost','root','');
                mysql_select_db('visits');
                mysql_query('SET NAMES \'utf8\'');
            }

            public function Count()
            {
                $this->Connect();
                $this->Today();
                $now = $this->now;
                $now = $now->format('Y-m-d');
                $result = mysql_query("SELECT * FROM `counter` WHERE (`vdate`='$now') ORDER BY `id`");
                switch(mysql_num_rows($result))
                {
                    case -1:
                        echo '<P dir="ltr" align="left">'.mysql_error().'</P>'."\n";
                        break;
                    case 0:
                        $result = mysql_query('SELECT * FROM `counter` ORDER BY `id` DESC LIMIT 1');
                        $id = 0;
                        if(mysql_num_rows($result) > 0)
                        {
                            $id = mysql_result($result, 0, 0);
                        }
                        $id++;
                        mysql_query("INSERT INTO `counter` VALUES ('$id','$now','1')");
                        break;
                    default:
                        while($row = mysql_fetch_assoc($result))
                        {
                            $id = $row['id'];
                            mysql_query("UPDATE `counter` SET `count`=`count`+1 WHERE (`id`='$id')");
                        }
                        break;
                }
            }

            public function GetAll()
            {
                $this->Connect();
                $result = mysql_query('SELECT * FROM `counter` ORDER BY `id`');
                $visits = 0;
                if(mysql_num_rows($result) > 0)
                {
                    while($row=mysql_fetch_assoc($result))
                    {
                        $visits += $row['count'];
                    }
                }
                return $visits;
            }

            public function GetLastDays($days)
            {
                $this->Connect();
                $this->Today();
                $now = $this->now;
                $result = mysql_query('SELECT * FROM `counter` ORDER BY `id`');
                $visits = 0;
                if(mysql_num_rows($result) > 0)
                {
                    while($row=mysql_fetch_assoc($result))
                    {
                        $vdate = new DateTime($row['vdate']);
                        $interval = -1;
                        while($vdate <= $now)
                        {
                            $vdate->add(new DateInterval('P1D'));
                            $interval++;
                        }
                        if($interval < $days)
                        {
                            $visits += $row['count'];
                        }
                    }
                }
                return $visits;
            }

            public function GetLastDay($day)
            {
                $this->Connect();
                $this->Today();
                $now = $this->now;
                $result = mysql_query('SELECT * FROM `counter` ORDER BY `id`');
                $visits = 0;
                if(mysql_num_rows($result) > 0)
                {
                    while($row=mysql_fetch_assoc($result))
                    {
                        $vdate = new DateTime($row['vdate']);
                        $interval = -1;
                        while($vdate <= $now)
                        {
                            $vdate->add(new DateInterval('P1D'));
                            $interval++;
                        }
                        if($interval == $day)
                        {
                            $visits += $row['count'];
                        }
                    }
                }
                return $visits;
            }

            public function GetToday()
            {
                $this->Connect();
                $this->Today();
                $now = $this->now;
                $now = $now->format('Y-m-d');
                $result = mysql_query("SELECT * FROM `counter` WHERE (`vdate`='$now') ORDER BY `id`");
                $visits = 0;
                if(mysql_num_rows($result) > 0)
                {
                    while($row=mysql_fetch_assoc($result))
                    {
                        $visits += $row['count'];
                    }
                }
                return $visits;
            }
        }
    ?>
     
    روش استفاده از اين كلاس بدين ترتيب هست:
    ابتدا يك جدول به نام visits در DB خودتون بسازين و فيلدهاي id و vdate و count رو به ترتيب با انواع int و date و int ايجاد كرده و فيلد id رو كليد اصلي (Primary Key) بگذارين. بعد به فايل visits.php رفته و درون متد Connect، نام سرور، نام كاربري، رمز عبور و نام DB رو مطابق با تنظيمات سايت خودتون اصلاح كنيد.
    حالا براي استفاده كافيه فايل visits.php رو در هر صفحه كه ميخواين آمار بازديد رو داشته باشين، ضميمه كنيد.
    فهرست متدهاي عمومي موجود در كلاس Visits به صورت زير هست:
    Count
    اين متد عمل شمارش رو انجام ميده. اگه ركورد مربوط به امروز رو در جدول پيدا كرد، به اون ركورد يكي اضافه ميكنه و اگه پيدا نكرد، يك ركورد براي امروز ميسازه. دقت كنيد كه اگه ميخواين بازديد از صفحه جاري هم به آمار بازديد يكي اضافه كنه، اين متد رو بايد صدا بزنيد وگرنه فقط ميتونيد از ساير امكانات كلاس يعني نمايش آمار بازديد استفاده كنيد. عمداً اين قسمت رو جدا كردم چون در برخي از موارد نميخوايم آمار اضافه بشه. مثلاً صفحه نمايش آمار بازديد خودش نبايد شمرده بشه!
    GetAll
    آمار بازديد كل رو بر ميگردونه.
    GetLastDays
    مجموع آمار بازديد چند روز گذشته رو محاسبه ميكنه. تعداد روزها رو بايد بعنوان پارامتر براش بفرستيد.
    GetLastDay
    آمار دقيق روزهاي گذشته رو ميده. فرقش با قبلي در اينه كه در قبلي، اگه مثلاً 5 رو بعنوان پارامتر بدين، مجموع آمار بازديد 5 روز قبل رو ميده ولي اين يكي، دقيقاً آمار پنجمين روز قبل از امروز رو ميگه.
    GetToday
    آمار بازديد امروز رو اعلام ميكنه. البته اگه دو متد قبلي رو با پارامتر 0 صدا بزنيد هم همينكار انجام ميشه ولي اين مورد رو براي راحتي بيشتر گذاشتم.
    در ادامه، يك مثال ميبينيد كه از اين كلاس استفاده كرده:
    PHP:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <HTML xmlns="http://www.w3.org/1999/xhtml">
    <HEAD>
    <META http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <TITLE>Visits</TITLE>
    </HEAD>
    <BODY>
    <?PHP
        require_once('visits.php');
        $visits = new Visits();
        $visits->Count();
        echo '<B>Visits</B><BR/>'."\n";
        echo 'Total&nbsp;'.$visits->GetAll().'<BR/>'."\n";
        echo 'Today&nbsp;'.$visits->GetToday().'<BR/>'."\n";
        echo 'Yesterday&nbsp;'.$visits->GetLastDay(1).'<BR/>'."\n";
        echo 'The day before yesterday&nbsp;'.$visits->GetLastDay(2).'<BR/>'."\n";
        echo 'Sum of 2 days ago&nbsp;'.$visits->GetLastDays(2).'<BR/>'."\n";
        echo 'Last week&nbsp;'.$visits->GetLastDays(7).'<BR/>'."\n";
        echo 'Last month&nbsp;'.$visits->GetLastDays(30).'<BR/>'."\n";
        echo 'Last year&nbsp;'.$visits->GetLastDays(365).'<BR/>'."\n";
    ?>
    </BODY>
    </HTML>
     
    نمونه خروجي:
    کد (Text):

    [B]Visits[/B]
    Total 59
    Today 31
    Yesterday 15
    The day before yesterday 13
    Sum of 2 days ago 46
    Last week 59
    Last month 59
    Last year 59
     
    اميدوارم كه اين كلاس مورد توجه دوستان قرار بگيره. مزيت اصلي اين كلاس اينه كه براي هر روز، فقط يك ركورد داريم و فشار زيادي به سرور نمياد. مثلاً در طول يك سال، فقط 365 ركورد خواهيم داشت كه با توجه به ظرفيتهاي MySQL ميشه گفت فشار وارد شده به سرور در حد صفر هست.
    موفق و مؤيد باشيد.
     

    پیوست ها:

    • visits.zip
      اندازه فایل:
      کیلوبایت 2.7
      نمایش ها:
      32
    آخرین ویرایش: ‏10 آوریل 2011
    نوشته شده توسط MMSHFE در ‏10 آوریل 2011
    KingCyrus، k2-4u، iran-TEC و 3 نفر دیگر از این ارسال تشکر کرده اند.
  6. MMSHFE

    MMSHFE Member

    ارسال‌ها:
    173
    تشکر شده:
    169
    امتیاز دستاورد:
    16
    كلاس ذخيره سازي Session توي DB

    با سلام، اين كلاس فكر ميكنم خيلي به درد ميخوره. بخصوص براي جلوگيري از حملاتي به سايت مثل سرقت Session و... در سرورهاي اشتراكي كه همه به پوشه tmp ميتونن دسترسي داشته باشن. ابتدا كد كلاس رو مشاهده كنيد:
    PHP:

    <?PHP
        //Copyright محمد مصطفي شهركي @ http://www.ncis.ir
        ini_set('session.save_handler','user');

        class MySessionHandler
        {
            private $time_out;          //Time out for session
            private $salt;              //Salt, an uniq string
            private $browser_hash;      //Browser hash
            private $server;            //Server name
            private $user;              //User name
            private $pass;              //Pass word
            private $db;                //Database name

            public function Open($save_path, $session_name)
            {
                //Initialize your need here.
                //In my case, I need nothing.
                return true;
            }

            public function Close()
            {
                //Just deinitialize your resources
                return true;
            }

            public function Write($id,$data)
            {
                $safe_id=mysql_real_escape_string($id);
                $safe_data=mysql_real_escape_string($data);
                $hash=mysql_real_escape_string($this->browser_hash);
                $now=date("Y-m-d H:i:s");
                $query="INSERT INTO `sessions` (`id`,`data`,`modified`,`hash`) VALUES ('$safe_id','$safe_data','$now','$hash') ON DUPLICATE KEY UPDATE `data`='$safe_data', `modified`='$now',`hash`='$hash'";
                try
                {
                    mysql_query($query);
                }
                catch(Exception $e)
                {
                    return false;
                }
                return true;
            }

            public function Read($id)
            {
                $query='SELECT * FROM `sessions` WHERE (`id`=\''.mysql_real_escape_string($id).'\')';
                try
                {
                    $result=mysql_query($query);
                }
                catch(Exception $e)
                {
                    return '';
                }
                //Is there any???
                if (mysql_num_rows($result)!=1)
                {
                    return '';
                }
                $data=mysql_fetch_assoc($result);
                //Now its time to validate...
                $time=strtotime($data['modified']);
                $hash=$data['hash'];
                //Check for time out and browser data
                if(time()-$time > $this->time_out || strcasecmp($this->browser_hash,$hash)!=0)
                {
                    return '';
                }
                //Anything is ok, return data
                return $data['data'];
            }

            public function Destroy($id)
            {
                $safe_id=mysql_real_escape_string($id);
                $query="DELETE FROM `sessions` WHERE (`id`='$safe_id')";
                try
                {
                    mysql_query($query);
                }
                catch(Exception $e)
                {
                    return false;
                }
                $this->GC($this->time_out);
                return true;
            }

            public function GC($maxlifetime)
            {
                //You can use your timeout instead of this.
                $date=time()-$maxlifetime;
                $date_str=date("Y-m-d H:i:s",$date);
                $query="DELETE FROM `sessions` WHERE (`modified`<'$date')";
                try
                {
                    mysql_query($query);
                }
                catch(Exception $e)
                {
                    return false;
                }
                return true;
            }

            private function connect()
            {
                mysql_connect($this->server,$this->user,$this->pass) or die('Connection Error');
                mysql_select_db($this->db) or die('Database does not exit.');
                mysql_query('SET NAMES \'utf8\'');
            }

            public function __construct($server,$user,$pass,$db,$time_out=600,$salt='')
            {
                date_default_timezone_set('Asia/Tehran');
                if($salt=='')
                {
                    $salt=md5('http://www.ncis.ir');
                }
                $this->server=$server;
                $this->user=$user;
                $this->pass=$pass;
                $this->db=$db;
                $this->time_out=$time_out;
                $this->salt=$salt;
                $this->calcHash();
                $this->connect();
                session_set_save_handler(array(&$this,'Open'),array(&$this,'Close'),array(&$this,'Read'),array(&$this,'Write'),array(&$this,'Destroy'),array(&$this,'GC'));
            }

            private function calcHash()
            {
                $ip=isset($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:"Unknown";
                $ip.=isset($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:"Unknown";
                $ip.=isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:"Unknown";
                $agent=isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:'NoUserAgent';
                $browser_data=$this->salt.$_ip.$_agent;
                $this->browser_hash=md5($browser_data);
            }
        }
    ?>
     
    توي اين كلاس، بخشهاي زير وجود داره:
    تنظيم session.save_handler با مقدار user تا ديگه موقع ساخت Session از فايلها استفاده نشه.
    متد Open كه براي ايجاد يك Session جديد يا بازكردن Session موجود به كار ميره. همونطور كه ميبينيد، در كلاسي كه نوشتم، اين متد قرار نيست كاري انجام بده!
    متد Close كه براي بستن Session كاربرد داره و همونطور كه ميبينيد، در كلاسي كه نوشتم، اين متد هم كاري انجام نميده!
    متد Write كه براي نوشتن Session كاربرد داره و بعد از انجام كنترلهاي امنيتي، اطلاعات Session رو در بانك اطلاعاتي ذخيره ميكنه.
    متد Read كه براي خواندن Session به كار ميره و بعد از اينكه مطمئن شد Session ID واردشده معتبره و زمان اعتبار Session تمام نشده، اطلاعات Session رو از بانك اطلاعاتي استخراج كرده و بر ميگردونه.
    متد Destroy كه براي تخريب Session كاربرد داره و همونطور كه ميبينيد، بعد از حذف Session از بانك اطلاعاتي، متد GC رو صدا ميزنه كه به زباله روب معروفه!
    متد GC همونطور كه گفتم، به زباله روب معروفه و قاعدتاً بايد هر چند وقت يكبار بطور خودكار فراخواني بشه ولي تابحال نديدم اين اتفاق بيفته. شايد علتش اين باشه كه PHP براي استفاده بهينه از منابع سرور، فقط وقتي صداش ميزنه كه با كمبود حافظه مواجه بشه. به هر حال، با فراخواني اين تابع، Sessionهايي كه مدت اعتبارشون منقضي شده، از بانك اطلاعاتي حذف ميشن تا حافظه اشغال شده، آزاد بشه. براي اطمينان، توي متد Destroy اين متد رو خودمون فراخواني ميكنيم تا هرموقع يك Session تخريب شد، ساير Sessionهاي منقضي شده هم از بانك اطلاعاتي حذف بشن.
    متد Connect كه private هست و فقط داخل كلاس براي اتصال به بانك اطلاعاتي ازش استفاده ميكنيم.
    متد سازنده كلاس كه كارش معلومه : مقداردهي اوليه به فيلدهاي كلاس و فراخواني تابع session_set_save_handler و ارسال متدهاي كلاس بعنوان پارامتر براي اون تا به PHP بگيم از اين متدها براي كار با Session استفاده كن.
    و در آخر، متد calcHash كه private هست و با تركيب IP كاربر و IP پشت Proxy و IP پشت V P N و همچنين Agent كه معرف سيستم عامل و مرورگر مورد استفاده است، يك كد Hash منحصر به فرد براي هر كاربر ايجاد ميكنه كه براي شناسايي كاربر استفاده ميشه. براي مثال، اگه IP فرد عوض بشه يا با مرورگر ديگه همزمان وارد سايت بشه، نميتونه از Session قبلي در اون مرورگر يا با IP جديد استفاده كنه.
    حالا ببينيم چطور از اين كلاس استفاده مي كنيم:
    اول يك جدول در بانك اطلاعاتي با ساختار زير ايجاد كنيد:
    کد (Text):

    CREATE TABLE IF NOT EXISTS `sessions` (
      `id` varchar(100) COLLATE utf8_bin NOT NULL,
      `data` text COLLATE utf8_bin NOT NULL,
      `modified` datetime NOT NULL,
      `hash` varchar(60) COLLATE utf8_bin NOT NULL,
      UNIQUE KEY `id` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    PHP:

    <!doctype html public "-//w3c//dtd xhtml 1.0 strict//en"
        "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
    <!-- Copyright محمد مصطفي شهركي @ http://www.ncis.ir -->
    <HTML xmlns="http://www.w3.org/1999/xhtml">
    <HEAD>
    <TITLE>Session Set Save Handler DEMO</TITLE>
    <META http-equiv="content-type" content="text/html; charset=utf-8"/>
    <?PHP
        require_once('sssh.class.php');
    ?>
    </HEAD>
    <BODY>
    <?PHP
        $session=new MySessionHandler('localhost','root','','session_db');
        session_start();
        echo isset($_SESSION['test'])?$_SESSION['test']:'Test session is not defined';
        $_SESSION['test']='http://www.ncis.ir';
        echo '<BR/>';
        echo isset($_SESSION['value'])?$_SESSION['value']:'value session is not defined';
        $_SESSION['value']='http://www.NCIS.ir';
    ?>
    </BODY>
    </HTML>
     
    خيلي ساده است، نه؟ كافيه يك شئ از كلاس ايجاد كنيم و بقيه كارها دقيقاً مثل قبله. انگار نه انگار كه Session توي DB ذخيره ميشه. مثل قبل با session_start و SESSION_$ و ساير توابع Session كار ميكنيم ولي ديگه فايلي براي ما ساخته نميشه. بنابراين، هرجا خواستين Session رو توي DB ذخيره كنيد، از اين كلاس يك شئ ايجاد كنيد و بعد با Session مثل قبل كار كنيد.
    اميدوارم به دردتون بخوره.
    ضمناً فايل كلاس رو همراه با ساختار بانك اطلاعاتي و مثال استفاده از اون، ضميمه كردم.
    موفق باشيد.
     

    پیوست ها:

    • sssh.zip
      اندازه فایل:
      کیلوبایت 2.7
      نمایش ها:
      24
    آخرین ویرایش: ‏17 می 2011
    نوشته شده توسط MMSHFE در ‏12 می 2011
    sir-mammad، KingCyrus، farik و 3 نفر دیگر از این ارسال تشکر کرده اند.
  7. MMSHFE

    MMSHFE Member

    ارسال‌ها:
    173
    تشکر شده:
    169
    امتیاز دستاورد:
    16
    كلاس ذخيره Session درون DB

    با سلام، اين كلاس فكر ميكنم خيلي به درد ميخوره. بخصوص براي جلوگيري از حملاتي به سايت مثل سرقت Session و... در سرورهاي اشتراكي كه همه به پوشه tmp ميتونن دسترسي داشته باشن. ابتدا كد كلاس رو مشاهده كنيد:
    PHP:

    <?PHP
        //Copyright محمد مصطفي شهركي @ http://www.ncis.ir
        ini_set('session.save_handler','user');

        class MySessionHandler
        {
            private $time_out;          //Time out for session
            private $salt;              //Salt, an uniq string
            private $browser_hash;      //Browser hash
            private $server;            //Server name
            private $user;              //User name
            private $pass;              //Pass word
            private $db;                //Database name

            public function Open($save_path, $session_name)
            {
                //Initialize your need here.
                //In my case, I need nothing.
                return true;
            }

            public function Close()
            {
                //Just deinitialize your resources
                return true;
            }

            public function Write($id,$data)
            {
                $safe_id=mysql_real_escape_string($id);
                $safe_data=mysql_real_escape_string($data);
                $hash=mysql_real_escape_string($this->browser_hash);
                $now=date("Y-m-d H:i:s");
                $query="INSERT INTO `sessions`   (`id`,`data`,`modified`,`hash`) VALUES   ('$safe_id','$safe_data','$now','$hash') ON DUPLICATE KEY UPDATE   `data`='$safe_data', `modified`='$now',`hash`='$hash'";
                try
                {
                    mysql_query($query);
                }
                catch(Exception $e)
                {
                    return false;
                }
                return true;
            }

            public function Read($id)
            {
                $query='SELECT * FROM `sessions` WHERE (`id`=\''.mysql_real_escape_string($id).'\')';
                try
                {
                    $result=mysql_query($query);
                }
                catch(Exception $e)
                {
                    return '';
                }
                //Is there any???
                if (mysql_num_rows($result)!=1)
                {
                    return '';
                }
                $data=mysql_fetch_assoc($result);
                //Now its time to validate...
                $time=strtotime($data['modified']);
                $hash=$data['hash'];
                //Check for time out and browser data
                if(time()-$time > $this->time_out || strcasecmp($this->browser_hash,$hash)!=0)
                {
                    return '';
                }
                //Anything is ok, return data
                return $data['data'];
            }

            public function Destroy($id)
            {
                $safe_id=mysql_real_escape_string($id);
                $query="DELETE FROM `sessions` WHERE (`id`='$safe_id')";
                try
                {
                    mysql_query($query);
                }
                catch(Exception $e)
                {
                    return false;
                }
                $this->GC($this->time_out);
                return true;
            }

            public function GC($maxlifetime)
            {
                //You can use your timeout instead of this.
                $date=time()-$maxlifetime;
                $date_str=date("Y-m-d H:i:s",$date);
                $query="DELETE FROM `sessions` WHERE (`modified`<'$date')";
                try
                {
                    mysql_query($query);
                }
                catch(Exception $e)
                {
                    return false;
                }
                return true;
            }

            private function connect()
            {
                mysql_connect($this->server,$this->user,$this->pass) or die('Connection Error');
                mysql_select_db($this->db) or die('Database does not exit.');
                mysql_query('SET NAMES \'utf8\'');
            }

            public function __construct($server,$user,$pass,$db,$time_out=600,$salt='')
            {
                date_default_timezone_set('Asia/Tehran');
                if($salt=='')
                {
                    $salt=md5('http://www.ncis.ir');
                }
                $this->server=$server;
                $this->user=$user;
                $this->pass=$pass;
                $this->db=$db;
                $this->time_out=$time_out;
                $this->salt=$salt;
                $this->calcHash();
                $this->connect();
                  session_set_save_handler(array(&$this,'Open'),array(&$this,'Close'),array(&$this,'Read'),array(&$this,'Write'),array(&$this,'Destroy'),array(&$this,'GC'));
            }

            private function calcHash()
            {
                $ip=isset($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:"Unknown";
                $ip.=isset($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:"Unknown";
                $ip.=isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:"Unknown";
                $agent=isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:'NoUserAgent';
                $browser_data=$this->salt.$_ip.$_agent;
                $this->browser_hash=md5($browser_data);
            }
        }
    ?>
     
    توي اين كلاس، بخشهاي زير وجود داره:
    تنظيم session.save_handler با مقدار user تا ديگه موقع ساخت Session از فايلها استفاده نشه.
    متد Open كه براي ايجاد يك Session جديد يا بازكردن Session موجود به كار ميره. همونطور كه ميبينيد، در كلاسي كه نوشتم، اين متد قرار نيست كاري انجام بده!
    متد Close كه براي بستن Session كاربرد داره و همونطور كه ميبينيد، در كلاسي كه نوشتم، اين متد هم كاري انجام نميده!
    متد Write كه براي نوشتن Session كاربرد داره و بعد از انجام كنترلهاي امنيتي، اطلاعات Session رو در بانك اطلاعاتي ذخيره ميكنه.
    متد Read كه براي خواندن Session به كار ميره و بعد از اينكه مطمئن شد Session ID واردشده معتبره و زمان اعتبار Session تمام نشده، اطلاعات Session رو از بانك اطلاعاتي استخراج كرده و بر ميگردونه.
    متد Destroy كه براي تخريب Session كاربرد داره و همونطور كه ميبينيد، بعد از حذف Session از بانك اطلاعاتي، متد GC رو صدا ميزنه كه به زباله روب معروفه!
    متد GC همونطور كه گفتم، به زباله روب معروفه و قاعدتاً بايد هر چند وقت يكبار بطور خودكار فراخواني بشه ولي تابحال نديدم اين اتفاق بيفته. شايد علتش اين باشه كه PHP براي استفاده بهينه از منابع سرور، فقط وقتي صداش ميزنه كه با كمبود حافظه مواجه بشه. به هر حال، با فراخواني اين تابع، Sessionهايي كه مدت اعتبارشون منقضي شده، از بانك اطلاعاتي حذف ميشن تا حافظه اشغال شده، آزاد بشه. براي اطمينان، توي متد Destroy اين متد رو خودمون فراخواني ميكنيم تا هرموقع يك Session تخريب شد، ساير Sessionهاي منقضي شده هم از بانك اطلاعاتي حذف بشن.
    متد Connect كه private هست و فقط داخل كلاس براي اتصال به بانك اطلاعاتي ازش استفاده ميكنيم.
    متد سازنده كلاس كه كارش معلومه : مقداردهي اوليه به فيلدهاي كلاس و فراخواني تابع session_set_save_handler و ارسال متدهاي كلاس بعنوان پارامتر براي اون تا به PHP بگيم از اين متدها براي كار با Session استفاده كن.
    و در آخر، متد calcHash كه private هست و با تركيب IP كاربر و IP پشت Proxy و IP پشت V P N و همچنين Agent كه معرف سيستم عامل و مرورگر مورد استفاده است، يك كد Hash منحصر به فرد براي هر كاربر ايجاد ميكنه كه براي شناسايي كاربر استفاده ميشه. براي مثال، اگه IP فرد عوض بشه يا با مرورگر ديگه همزمان وارد سايت بشه، نميتونه از Session قبلي در اون مرورگر يا با IP جديد استفاده كنه.
    حالا ببينيم چطور از اين كلاس استفاده مي كنيم:
    اول يك جدول در بانك اطلاعاتي با ساختار زير ايجاد كنيد:
    کد (Text):

    CREATE TABLE IF NOT EXISTS `sessions` (
      `id` varchar(100) COLLATE utf8_bin NOT NULL,
      `data` text COLLATE utf8_bin NOT NULL,
      `modified` datetime NOT NULL,
      `hash` varchar(60) COLLATE utf8_bin NOT NULL,
      UNIQUE KEY `id` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    PHP:

    <!doctype html public "-//w3c//dtd xhtml 1.0 strict//en"
        "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
    <!-- Copyright محمد مصطفي شهركي @ http://www.ncis.ir -->
    <HTML xmlns="http://www.w3.org/1999/xhtml">
    <HEAD>
    <TITLE>Session Set Save Handler DEMO</TITLE>
    <META http-equiv="content-type" content="text/html; charset=utf-8"/>
    <?PHP
        require_once('sssh.class.php');
    ?>
    </HEAD>
    <BODY>
    <?PHP
        $session=new MySessionHandler('localhost','root','','session_db');
        session_start();
        echo isset($_SESSION['test'])?$_SESSION['test']:'Test session is not defined';
        $_SESSION['test']='http://www.ncis.ir';
        echo '<BR/>';
        echo isset($_SESSION['value'])?$_SESSION['value']:'value session is not defined';
        $_SESSION['value']='http://www.NCIS.ir';
    ?>
    </BODY>
    </HTML>
     
    خيلي ساده است، نه؟ كافيه يك شئ از كلاس ايجاد كنيم و بقيه كارها دقيقاً مثل قبله. انگار نه انگار كه Session توي DB ذخيره ميشه. مثل قبل با session_start و SESSION_$ و ساير توابع Session كار ميكنيم ولي ديگه فايلي براي ما ساخته نميشه. بنابراين، هرجا خواستين Session رو توي DB ذخيره كنيد، از اين كلاس يك شئ ايجاد كنيد و بعد با Session مثل قبل كار كنيد.
    اميدوارم به دردتون بخوره.
    ضمناً فايل كلاس رو همراه با ساختار بانك اطلاعاتي و مثال استفاده از اون، ضميمه كردم.
    موفق باشيد.
     

    پیوست ها:

    • sssh.zip
      اندازه فایل:
      کیلوبایت 2.7
      نمایش ها:
      13
    آخرین ویرایش: ‏17 می 2011
    نوشته شده توسط MMSHFE در ‏12 می 2011
    sir-mammad، KingCyrus، splinter cell و 5 نفر دیگر از این ارسال تشکر کرده اند.
  8. iran-TEC

    iran-TEC Member

    ارسال‌ها:
    229
    تشکر شده:
    145
    امتیاز دستاورد:
    16
    کلاس آپلود فایل

    سلام

    این کلاس رو خودم نوشتم که کارش همون طوری که گفتم آپلود فایل هست

    PHP:
    class uploadFile {
        private $file = array();
        private $size;
        private $width;
        private $height;
        private $address;
        private $change;
        //const ADDRESS = 'http://localhost/digikala/stuff_pic/';
        /*------------------------------------------------------------------------------------------------------*/
        public function uplode($file_array,$size_file,$w_file,$h_file,$address,$chage,$type=0) {
            $this->file = $file_array;
            $this->size = $size_file;
            $this->width = $w_file;
            $this->height = $h_file;
            $this->address = $address;
            $this->change = $change;
            do {
               
               if($this->file['size'] > $this->size) {
                   $message = 'اندازه فایل بیشتر از اندازه مجاز می باشذ';
                   break;
               }
               if($type == 1) {
                   if(!getimagesize($this->file['tmp_name'])) {
                      $message = 'نوع فایل قابل قبول نیست';
                      break;
                   }
                   list($width,$height,$type,$attr) = getimagesize($this->file['tmp_name']);
                   if($this->width != 0 && $this->height != 0) {
                      if($width > $this->width || $height > $this->height) {
                         $message = 'error in width and height picture';
                         break;
                      }
                   }
               }
               $blacklist = array(".php", ".phtml", ".php3", ".php4", ".js", ".shtml", ".pl" ,".py");
               foreach ($blacklist as $file) {
                  if(preg_match("/$file\$/i", $this->file['name'])) {
                      $message = 'نوع فایل قابل قبول نیست';
                      break;
                  }
               }
               if($this->change) {
                   $this->change_name();
               }
               if(!move_uploaded_file($this->file['tmp_name'],$this->address.basename($this->file['name']))) {
                   $message = 'خطا در آپلود فایل';
                   break;
               }
               else {
                   $message = 'uploade';
               }
               break;
            }
            while(0);
           
            return $message;
        }
        /*------------------------------------------------------------------------------------------------------*/
        private function change_name() {
            $arr_name = explode('.',$this->file['name']);
            $this->file['name'] = strtoupper(substr(md5(uniqid(rand(),true)),rand(5,10)));
            $this->file['name'] .= '.'.$arr_name[1];
        }
        /*------------------------------------------------------------------------------------------------------*/

    }
    $file : این همون آرایه $_FILE هست که به کلاس می فرستین

    $size : حجم فایل

    $width : طول تصویر در صورتی که فایل تصویر نیست 0 بفرستید

    $address : آدرس مکان دخیره سازی

    $change : در صورتی که می خواین اسم فایل عوض بشه true بفرستین

    در خروجی اگه کلمه uploade رو فرستاد یعنی همه چی درسته در غیر این صورت یک خطا می فرسته

    امیدوارم براتون مفید باشه .
     
    نوشته شده توسط iran-TEC در ‏21 ژوئن 2011
    sir-mammad و KingCyrus از این پست تشکر کرده اند.
  9. Masoud1365

    Masoud1365 مدیر انجمن

    ارسال‌ها:
    2,919
    تشکر شده:
    1,601
    امتیاز دستاورد:
    113
    لطفا مثل پستهای قبلی هم یک مثال بزنید از کدتون و هم فایلهای مثال+کلاس رو ضمیمه کنید !
    با تشکر :rose:
     
    نوشته شده توسط Masoud1365 در ‏21 ژوئن 2011
    main، KingCyrus و Army.Hidden از این ارسال تشکر کرده اند.

به اشتراک بگذارید