仅创建一次MYSQLI

时间:2013-12-23 12:14:41

标签: php mysqli database-connection prepared-statement

我正在尝试以这种方式创建我的数据库连接。在Functions_BD中,我想创建与BD的连接并定义我的所有功能(Login,Insert,Selects ...)。我的班级看起来像这样:

 class functions_BD {

 private $mysqli;

 function __construct() {
    require_once 'config.php';
    $mysqli = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DATABASE);   

}

在'config.php'中我有我的数据库配置。然后我在“Functions_BD”中有一些公共函数,就像这个

public function login($user,$passw){        

        $mysqli = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DATABASE);   

        if (mysqli_connect_errno()) {
            return 2;
        }
        $stmt=$mysqli->prepare("SELECT COUNT(*) FROM users WHERE user= ? AND passw= ? ");
        $stmt->bind_param('ss', $user,$passw);
        $stmt->execute();
        $result = $stmt->fetch();

        if($result>0){          
            return 1;
        }else{              
            return 0;
        }           
    }

如果我在每个函数中定义$ mysqli,代码工作正常,我的问题是:有没有任何方法只定义$ mysqli一次并在我的所有函数中使用它? (就像我在构造函数中尝试过的那样)或者每次进行查询时我都可以再次定义它?

2 个答案:

答案 0 :(得分:1)

只需在属性中设置它......稍后在方法中使用,如果你在其他类中使用相同的连接,请尝试学习并使用依赖注入,以及工厂模式。

在你的ctor中,只需添加$this->mysqli = new mysqli( ... ),然后在其他方法中使用它:$this->mysqli->prepare ...

你的代码看起来像这样:

<?php

class functions_BD 
{
  private $mysqli;

  function __construct() 
  {
    require_once 'config.php';
    $this->mysqli = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DATABASE);
  }

  function login($user, $psw)
  {
    $stmt = $this->mysqli->prepare("SELECT COUNT(*) FROM users WHERE user= ? AND passw= ? ");
    $stmt->bind_param('ss', $user,$passw);
    $stmt->execute();
    $result = $stmt->fetch();

    return $result > 0;
  }
}

答案 1 :(得分:0)

您可以使用以下单例模式:

class functions_BD {
  private $mysqli;
  private static $instance;

  public static function get_instance() {
    if (!isset(self::$instance)) {
      self::$instance = new self();
    }
    return self::$instance;
  }

  private function __construct() {
    $this->mysqli = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DATABASE);
  }
}

要使用数据库,您可以使用以下内容:

$db = functions_BD::get_instance();

将在您的所有代码中调用相同的实例。