【问题标题】:Bad practise to open and close mysql in every function在每个函数中打开和关闭 mysql 的坏习惯
【发布时间】:2013-12-15 22:01:32
【问题描述】:

例子:

class SimpleClass{
  public function foo() {
    mysql_open();
    //do mysql query here
    mysql_close();
  }

  public function boo() {
    mysql_open();
    //do mysql query here
    mysql_close();
  }
}

或者在课程的开头有一个mysql_open,最后有一个更好?

谢谢。

编辑: 我使用 mysqli,这只是一个示例。 我应该在每个页面文件中打开和关闭吗?和 index.php 一样,cateegory.php 应该有一个打开和关闭。

【问题讨论】:

标签: php mysql oop mysqli


【解决方案1】:

是的,这是不好的做法。原因如下:

  • 制作连接的成本很高
  • 在许多函数被调用期间不能使用事务
  • 每个实例都有自己的连接。太糟糕了
  • 等等

使用 PDO,或者自己创建单例 db 类。

【讨论】:

    【解决方案2】:

    我建议将连接包装在作为单例运行的 DAO 类中以管理您的连接。除了上面其他人所说的关于准备好的语句和不推荐使用的函数之外,我将使用这些相同的不推荐使用的函数来演示 DAO 概念

    <?php
    class MyGreatDAO{
        private static $con = null//late static feature in php 5.3 
        private __construct(){
        }
    
        public static getInstance(){
            if($con === null){
                $con = mysql_connect($server,$user,$pass);
    
             }
            return $con;
    }//untested
    

    基本上,这个想法是为了性能原因防止不必要的数据连接,并在整个执行过程中保持相同的连接。您也可以在 $con 上使用同一个类来执行其他数据库操作

    【讨论】:

    • 我在答案中提到了它已经过时的事实。另外,单例有什么问题?正是因为这个原因,它的做法一直被使用。
    • 这种代码的问题是你的服务状态是隐式的。也许考虑阅读misko.hevery.com/2008/08/17/singletons-are-pathological-liars?如果我可以建议只是传递对象,以便清楚谁在使用它而不是在您的代码中使用美化的全局(单例)?
    • @BenjaminGruenbaum,那篇文章中的 cmets 说了很多。他有很多优点,但其他人也没有。
    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2016-03-27
    • 2021-03-15
    • 2012-07-06
    相关资源
    最近更新 更多