/
  • كلاس connection براي وصل شدن به mysql

  • صفحه‌ها (2):
  • ارسال پاسخ   امتیاز موضوع:
    • 1 رأی - میانگین امیتازات: 5
    • 1
    • 2
    • 3
    • 4
    • 5

    حالت موضوعی | حالت خطی كلاس connection براي وصل شدن به mysql
    نویسنده پیام
    vahidfaraji آفلاین
    عضو جدید
    **

    ارسال‌ها: 32
    تاریخ عضویت: ۱۳۸۸ مهر ۲۲
    اعتبار: 0
    تشکرها : 12
    ( 4 تشکر در 3 ارسال )
    ارسال: #1
    كلاس connection براي وصل شدن به mysql
    من يه كلاس connection براي وصل شدن به mysql به صورت زير نوشتم
    کد:
    <?php
    error_reporting(0);
    class db
    {
         private $hostname;
         private $username;
         private $password;
         private $database;
         private $connect;
         private $select_db;

         public function db()
         {
              $this->hostname = dbhost;
              $this->username = dbuser;
              $this->password = dbpass;
              $this->database = dbname;
         }
          
         public function open_connection()
         {
               $this->connect = mysql_connect($this->hostname,$this->username,$this->password) or die(error);
               $this->select_db = mysql_select_db($this->database) or die(error);
         }
          
         public function close_connection()
         {
               mysql_close($this->connect);
         }
    }
    ?>
    dbhost, dbuser, dbpas, dbname, error
    از فايل config خونده مي شن
    به صورت زير هم استفاده مي كنم
    کد:
    <?php
    require_once('config.php');
    require_once('connectToDB.php');
        
    function pageInit()
    {
        global $db;
        $db = new db();
        $db->open_connection();
    }

    function select()
    {
        global $db;
        $query = "SELECT * FROM users";
        $sql = mysql_query($query);
        if($sql)
        {
            while($r = mysql_fetch_array($sql))
            {
               echo $r['username'] . '<br />';
            }
        }
        mysql_free_result($result);
    }

    function pageTerminate()
    {
        global $db;
        $db->close_connection();
    }
    pageInit();
    select();
    pageTerminate();
    ?>
    مي خواستم بدونم مشكلي وجود داره از لحاظ اصول برنامه نويسي، اگه نكته اي وجود داره ، لطف كنيد بيان كنيد.
    ۱۳۸۹ مرداد ۳۰ ۰۷:۱۱ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط :
    bestirani2 آفلاین
    عضو
    ***

    ارسال‌ها: 87
    تاریخ عضویت: ۱۳۸۸ مهر ۱۷
    اعتبار: 0
    تشکرها : 2
    ( 49 تشکر در 36 ارسال )
    ارسال: #2
    RE: كلاس connection براي وصل شدن به mysql
    مشکل که زیاد هست
    از تحت نظر نداشتن خطا تا ...
    از کلاس زیر استفاده کن

    http://www.phpclasses.org/package/1285-P...files.html
    ۱۳۸۹ مرداد ۳۰ ۱۰:۰۸ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط :
    vahidfaraji آفلاین
    عضو جدید
    **

    ارسال‌ها: 32
    تاریخ عضویت: ۱۳۸۸ مهر ۲۲
    اعتبار: 0
    تشکرها : 12
    ( 4 تشکر در 3 ارسال )
    ارسال: #3
    RE: كلاس connection براي وصل شدن به mysql
    (۱۳۸۹ مرداد ۳۰ ۱۰:۰۸ عصر)bestirani2 نوشته شده توسط:  مشکل که زیاد هست
    از تحت نظر نداشتن خطا تا ...
    از کلاس زیر استفاده کن

    http://www.phpclasses.org/package/1285-P...files.html
    من خطا رو با die هندل می کنم، منظور شما چیه، می شه روشن تر بگید.
    ۱۳۸۹ مرداد ۳۱ ۱۲:۰۰ صبح
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط :
    sajjilove غایب
    Resided in compTIA
    ***

    ارسال‌ها: 103
    تاریخ عضویت: ۱۳۸۷ بهمن ۳۰
    اعتبار: 1
    تشکرها : 53
    ( 133 تشکر در 56 ارسال )
    ارسال: #4
    RE: كلاس connection براي وصل شدن به mysql
    بهتر هست برای کنترل خطا از try/catch استفاده بشه.البته چندتا مشکل وجود داره:

    یکی اینکه php به خودی خود قادر به تشخیص خطا در این بلاک نیست
    و دیگری در مورد performance هستش:
    در کل thrown یک exception به تنهایی performance رو پایین خواهد آورد که با وجود اینکه php به طور خودکار خطا رو تشخیص نمیده فعلا مقرون به صرفه نیست در بعضی موارد از اون استفاده بشه...
    اما در php مشکل دیگری نیز به این افزوده شده و اون خود بلاک catch هستش که performance رو پایین میاره و من اون رو جزء باگ های php دیدم:
    http://bugs.php.net/bug.php?id=40002
    __________________________________________________________________________
    The difference between stupidity and genius is that genius has its limits. - Albert Einstein

    "SUCCESS IS NOT A DESTINATION , IT'S A JOURNEY"
    ۱۳۸۹ مرداد ۳۱ ۱۲:۲۴ صبح
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط :
    vahidfaraji آفلاین
    عضو جدید
    **

    ارسال‌ها: 32
    تاریخ عضویت: ۱۳۸۸ مهر ۲۲
    اعتبار: 0
    تشکرها : 12
    ( 4 تشکر در 3 ارسال )
    ارسال: #5
    RE: كلاس connection براي وصل شدن به mysql
    (۱۳۸۹ مرداد ۳۱ ۱۲:۲۴ صبح)sajjilove نوشته شده توسط:  بهتر هست برای کنترل خطا از try/catch استفاده بشه.البته چندتا مشکل وجود داره:

    یکی اینکه php به خودی خود قادر به تشخیص خطا در این بلاک نیست
    و دیگری در مورد performance هستش:
    در کل thrown یک exception به تنهایی performance رو پایین خواهد آورد که با وجود اینکه php به طور خودکار خطا رو تشخیص نمیده فعلا مقرون به صرفه نیست در بعضی موارد از اون استفاده بشه...
    اما در php مشکل دیگری نیز به این افزوده شده و اون خود بلاک catch هستش که performance رو پایین میاره و من اون رو جزء باگ های php دیدم:
    http://bugs.php.net/bug.php?id=40002
    به هر حال چی کار کنم، از try catch استفاده کنم یا نه؟
    به غیر از try catch نکته دیگه ای نیست؟
    ۱۳۸۹ مرداد ۳۱ ۱۲:۳۵ صبح
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط :
    hosseintdk775 آفلاین
    حسین بقایی
    ****

    ارسال‌ها: 380
    تاریخ عضویت: ۱۳۸۷ دي ۱۵
    اعتبار: 11
    تشکرها : 423
    ( 412 تشکر در 246 ارسال )
    ارسال: #6
    RE: كلاس connection براي وصل شدن به mysql
    بسم الله الرحمن الرحیم
    سلام
    الان شما می تونید از این کلاس استفاده کنید؟!
    البت من کاربر مبتدی هستیم ولی تا جایی که می دونم نمی تونید از کلاس استفاده کنید:
    1 - شما چطوری می خواهید مقادیر ( آدرس سرور، یوزرنیم و ... ) رو به کلاس بدید؟ / جایی واسش نمی بینیم
    یعنی اینطوری باید باشه؟ / که بتونید مقادیر رو بگیرید( ممکنه روش دیگه ای هم باشه که من نمی دونم ):
    کد PHP:
    public function db(dbhost,dbuser,dbpass,dbname){
              
    $this->hostname dbhost;
              
    $this->username dbuser;
              
    $this->password dbpass;
              
    $this->database dbname;
         } 

    2- بعد اینکه اینجا رو یه نگاهی بکن: http://php.net/manual/en/language.oop5.decon.php
    این تابع (__destruct) کارش اینه که وقتی کارت با کلاس تموم شد بصورت اتوماتیک رستورات توش اجرا می شه
    پس بنظرم بهتره دستور mysql_close رو توی این بنویسید که بعد از ااتمام عملیات خودش ببینده / دیگه نیاز نباشه شما دستور رو اجرا کنید

    3-بعد اینکه بنظرم بهتره چیزهایی که تو کلاس تو تابع open_connection() نوشتید رو توی db() می نوشتید و با هم می بودن بهتر بود و به محض ایجاد شئی کانکشن هم ایجاد می شه ( دیگه نیاز نیست شما ایجاد کنید ) / البته ممکنه خب هم نباشه ( دقیق نمی دونم )

    4- بعد اینکه اگه تابعی هم می نوشید که کوئری رو به کلاس می دادید بهتر بود ( الان شما فقط برای ارتباط با دیتابیس فقط کلاس رو نوشتید که بهتره تغییرش بدید و کوئری رو هم به کلاس بدید / و می تونید فقط نتایجش رو از کلاس بگیرید

    بعد اینکه تو نحوه استفاده هم بنظرم مشکل هایی هست:
    شما چرا شئی رو تو تابع ایجاد کردید؟ / دلیلی برای این کار نیست و می تونید از تابع استفاده نکنید و مستقیم شئی بسازی:
    مثلا بجای
    کد PHP:
    function pageInit()
    {
        global 
    $db;
        
    $db = new db();
        
    $db->open_connection();
    }
    از ای 
    ن استفاده کنید:
    کد PHP:
    global $db;
        
    $db = new db();
        
    $db->open_connection(); 

    و سعی کنید از global هم استفاده نکنید / طبق مقاله یوشا جان نمی شه متغیرهایی که global هستند رو unset کرد

    دیگه چیزی به ذهنم نمی رسه!Smile
    __________________________________________________________________________
    یه توسعه دهنده!
    ۱۳۸۹ مرداد ۳۱ ۰۲:۵۳ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : oia
    oia آفلاین
    محمد ثانی
    *****

    ارسال‌ها: 2,012
    تاریخ عضویت: ۱۳۸۷ آذر ۲۶
    اعتبار: 66
    تشکرها : 2330
    ( 2091 تشکر در 1290 ارسال )
    ارسال: #7
    RE: كلاس connection براي وصل شدن به mysql
    نقل قول: بهتر هست برای کنترل خطا از try/catch استفاده بشه.
    درستش Exception ( استثنا ) هست

    نقل قول: یکی اینکه php به خودی خود قادر به تشخیص خطا در این بلاک نیست
    برای همین هست که می گم درستش Exception است!

    نقل قول: در کل thrown یک exception به تنهایی performance رو پایین خواهد آورد که با وجود اینکه php به طور خودکار خطا رو تشخیص نمیده فعلا مقرون به صرفه نیست در بعضی موارد از اون استفاده بشه...
    اما در php مشکل دیگری نیز به این افزوده شده و اون خود بلاک catch هستش که performance رو پایین میاره و من اون رو جزء باگ های php دیدم:
    http://bugs.php.net/bug.php?id=40002
    فک کنم باید PHPتون رو اپدیت کنید

    ---
    نقل قول: به غیر از try catch نکته دیگه ای نیست؟
    - اولین مشکل در تابع سازنده است. شما کپسوله سازی رو بخوبی پیاده نکردیداید!!!
    - دومیش مشکل نیست اما بهتره کمی بروز باشید ( Constructor )
    - استفاده از global؟ فک می کردم که اونقد مقاله تو این زمینه اومده که کسی دیگه ازش استفاده نمی کنه!
    - یه سوال: شما هدف تون از پیاده کردن این کلاس چی بوده؟ این نحوه برنامه نویسی از کجا به ذهنتون رخنه کرده؟ چون اگه بخوام نظر بدم باید بگم کارتون افتضاحه. اینو گفتم که جدی بفکر باشی نه خدای نکرده توهینی یا تحقیری کرده باشم و اگه ناراحتتون کردم معذرت می خوام
    خب شما زودتر پستتون رو ارسال کردید Smile بنابرین تشابهات زیاده!
    حالا من فرصت پیدا کردم بخونم و نقد کنم

    --
    نقل قول: 2- بعد اینکه اینجا رو یه نگاهی بکن: http://php.net/manual/en/language.oop5.decon.php
    این تابع (__destruct) کارش اینه که وقتی کارت با کلاس تموم شد بصورت اتوماتیک رستورات توش اجرا می شه
    پس بنظرم بهتره دستور mysql_close رو توی این بنویسید که بعد از ااتمام عملیات خودش ببینده / دیگه نیاز نباشه شما دستور رو اجرا کنید
    حرفت برای استفاده از destruct درسته اما نه دقیقا به این شکل. بهتر توی کلاس یه متد باشه برای بستن کانکشن کاری که تو همون کلاس با متد close_connection انجام می شه، منتها توی destruct چک بشه اگه بسته نشده با همون متد close_connection ببنده نه خودش مستقیم! - این درست تره -

    نقل قول: 3-بعد اینکه بنظرم بهتره چیزهایی که تو کلاس تو تابع open_connection() نوشتید رو توی db() می نوشتید و با هم می بودن بهتر بود و به محض ایجاد شئی کانکشن هم ایجاد می شه ( دیگه نیاز نیست شما ایجاد کنید ) / البته ممکنه خب هم نباشه ( دقیق نمی دونم )
    این اشتباهی هست که در مورد destruct هم قایل شدی. اتصال یک عملی هست جدای مقدار دهی property ها , و هر متد باید وضیفه انجام یک کار رو داشته باشه

    نقل قول: 4- بعد اینکه اگه تابعی هم می نوشید که کوئری رو به کلاس می دادید بهتر بود ( الان شما فقط برای ارتباط با دیتابیس فقط کلاس رو نوشتید که بهتره تغییرش بدید و کوئری رو هم به کلاس بدید / و می تونید فقط نتایجش رو از کلاس بگیرید

    بعد اینکه تو نحوه استفاده هم بنظرم مشکل هایی هست:
    شما چرا شئی رو تو تابع ایجاد کردید؟ / دلیلی برای این کار نیست و می تونید از تابع استفاده نکنید و مستقیم شئی بسازی
    برای همین هست که باید این کلاس رو بخود و بی جهت دونست ( دوباره می گم که قصد جسارت ندارم )
    (آخرین ویرایش در این ارسال: ۱۳۸۹ مرداد ۳۱ ۰۳:۱۸ عصر، توسط oia.)
    ۱۳۸۹ مرداد ۳۱ ۰۲:۵۹ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : hosseintdk775 molana
    hosseintdk775 آفلاین
    حسین بقایی
    ****

    ارسال‌ها: 380
    تاریخ عضویت: ۱۳۸۷ دي ۱۵
    اعتبار: 11
    تشکرها : 423
    ( 412 تشکر در 246 ارسال )
    ارسال: #8
    RE: كلاس connection براي وصل شدن به mysql
    بسم الله الرحمن الرحیم
    سلام
    oia، ممنون / یه چیزهایی یاد گرفتمWink
    در مورد این قسمت:
    نقل قول: این اشتباهی هست که در مورد destruct هم قایل شدی. اتصال یک عملی هست جدای مقدار دهی property ها , و هر متد باید وضیفه انجام یک کار رو داشته باشه
    چون نام متدی که پروپرتیهای رو می گیره با نام کلاس یکسانه در نتیجه وقتی یه شی ای ایجاد می شه همون متد هم اجرا می شه ( عمل construct )
    با این حال بهتر نیست متد open_connection() رو تو متد db() که اتوماتیک اجرا می شه صدا کرد؟ / که علاوه بر اینکه پروپرتی های رو می گیره همون موقع هم به دیتابیس وصل شه؟ ( من فکر می کردم اینطوری درسته!Huh )
    __________________________________________________________________________
    یه توسعه دهنده!
    ۱۳۸۹ مرداد ۳۱ ۰۵:۲۶ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : oia
    vahidfaraji آفلاین
    عضو جدید
    **

    ارسال‌ها: 32
    تاریخ عضویت: ۱۳۸۸ مهر ۲۲
    اعتبار: 0
    تشکرها : 12
    ( 4 تشکر در 3 ارسال )
    ارسال: #9
    RE: كلاس connection براي وصل شدن به mysql
    نقل قول: به غیر از try catch نکته دیگه ای نیست؟
    - اولین مشکل در تابع سازنده است. شما کپسوله سازی رو بخوبی پیاده نکردیداید!!!
    - دومیش مشکل نیست اما بهتره کمی بروز باشید ( Constructor )
    - استفاده از global؟ فک می کردم که اونقد مقاله تو این زمینه اومده که کسی دیگه ازش استفاده نمی کنه!
    - یه سوال: شما هدف تون از پیاده کردن این کلاس چی بوده؟ این نحوه برنامه نویسی از کجا به ذهنتون رخنه کرده؟ چون اگه بخوام نظر بدم باید بگم کارتون افتضاحه. اینو گفتم که جدی بفکر باشی نه خدای نکرده توهینی یا تحقیری کرده باشم و اگه ناراحتتون کردم معذرت می خوام
    امكانش هست شما يه نمونه از كلاس connection برا من بزاري تا ياد بگيرم. از لطف زياد شما ممنون.
    ببينيد اين چطوره؟
    لطفا به die هم توجه كنيد اگه مشكلي پيش بياد من error رو چاپ مي كنم در ضمن من از error_reporting(0); استفاده كردم تا كاربر هيچ error ي نبينه.
    کد:
    <?php
    error_reporting(0);
    class db
    {
         private $hostname;
         private $username;
         private $password;
         private $database;
         private $connect;
         private $select_db;

         function __construct($hostname, $username, $password, $database)
         {
              $this->hostname = $hostname;
              $this->username = $username;
              $this->password = $password;
              $this->database = $database;
         }
          
         public function open_connection()
         {
               $this->connect = mysql_connect($this->hostname,$this->username,$this->password) or die(error);
               $this->select_db = mysql_select_db($this->database) or die(error);
         }
          
         public function close_connection()
         {
               mysql_close($this->connect);
         }
        
         function __destruct()
         {
             $this->close_connection();
         }
    }
    ?>

    کد:
    <?php
    require_once('config.php');
    require_once('connectToDB.php');
        
    $db = new db(dbhost, dbuser, dbpass, dbname);
    $db->open_connection();

    $query = "SELECT * FROM users";
    $sql = mysql_query($query);
    if($sql)
    {
        while($r = mysql_fetch_array($sql))
        {
           echo $r['username'] . '<br />';
        }
    }
    mysql_free_result($result);
    $db->close_connection();
    ?>
    بحث اين كه تابعي بنويسم تا كوئري رو به كلاس بدم باشه برا بعد فعلا هدف چيز ديگه اي. ممنون از شما.
    (آخرین ویرایش در این ارسال: ۱۳۸۹ مرداد ۳۱ ۰۶:۲۸ عصر، توسط vahidfaraji.)
    ۱۳۸۹ مرداد ۳۱ ۰۵:۵۱ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط :
    oia آفلاین
    محمد ثانی
    *****

    ارسال‌ها: 2,012
    تاریخ عضویت: ۱۳۸۷ آذر ۲۶
    اعتبار: 66
    تشکرها : 2330
    ( 2091 تشکر در 1290 ارسال )
    ارسال: #10
    RE: كلاس connection براي وصل شدن به mysql
    نقل قول: چون نام متدی که پروپرتیهای رو می گیره با نام کلاس یکسانه در نتیجه وقتی یه شی ای ایجاد می شه همون متد هم اجرا می شه ( عمل construct )
    با این حال بهتر نیست متد open_connection() رو تو متد db() که اتوماتیک اجرا می شه صدا کرد؟ / که علاوه بر اینکه پروپرتی های رو می گیره همون موقع هم به دیتابیس وصل شه؟ ( من فکر می کردم اینطوری درسته!Huh )
    خب متد ها واسته این هستند که کارا تقسیم شن تا بروز رسانی تا خطا یابی راحت تر شه
    بهتره یک متد ( یا تابع ) پیچیده نوشته نشه. یه متد نباید چندکار رو انجام بده
    اما چیزی که تو گفتی به نظرم طوری درسته اونم تو این شرایط که تابع open وجود داشته باشه و فقط تابع construct اون رو صدا بزنه!

    ---
    نقل قول: امكانش هست شما يه نمونه از كلاس connection برا من بزاري تا ياد بگيرم. از لطف زياد شما ممنون.
    اولین چیزی که باید یاد بگیری اینه که کلاس connection اشتباه هست. چه دلیلی داری که یک کلاس فقط عمل اتصال و قطع رو انجام بده؟
    شما اصلا کپسوله سازی رو رعایت نکردین. بشدت کلاس تون نیازمنده اینه که از بیرون با کد های دیگه حمایت بشه و این یعنی شما یکی از رکن های اصلی oop نادیده گرفتین. پس نوشتن کلاس connection بدلیل اینکه کپسوله سازی رو نقض می کنه منتفی هست
    شما باید بجاش یک API برای اتصال به بانک اطلاعاتی ایجاد کنید. این API وضیفه داره تا شمارو به بانک اطلاعاتی وصل, اجازه بده که شما عملیات تون رو انجام بدین و بعد از پایان عملیات حتما اتصال رو قطع کنه. شما می تونید این کلاس رو طوری طراحی و پیاده سازی کنید که از سایر بانک های اطلاعتی هم پشتیبانی کنه این طوری برنامه ایی که با این کلاس نوشته بشه بسار قابلیت حمل بالاتری نسبت به قبل خواهد داشت.

    حالا کلاس Connectio که هیچی اما در مورد یک API برای بانک های اطلاعاتی اگه خواستی هستیم
    (آخرین ویرایش در این ارسال: ۱۳۸۹ مرداد ۳۱ ۰۶:۴۵ عصر، توسط oia.)
    ۱۳۸۹ مرداد ۳۱ ۰۶:۴۱ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط :
    « قدیمی تر | تازه‌ تر »

  • صفحه‌ها (2):
  • ارسال پاسخ
    پرش به انجمن:


    کاربرانِ درحال بازدید از این موضوع: 1 مهمان
    IranPHP.org | تماس با ما | بازگشت به بالا | بازگشت به محتوا | بایگانی | پیوند سایتی RSS