我是否需要为每个查询实例化Php数据库类?

我是否需要为每个查询实例化Php数据库类?,php,mysql,Php,Mysql,我有一个php数据库类,用于管理我的所有数据库查询: class DatabaseConnection() { private $link; public $filter; public function log_db_errors( $error, $query ) { if( MY_DEBUG ) { echo $message; } } public f

我有一个php数据库类,用于管理我的所有数据库查询:

    class DatabaseConnection() 
{
    private $link;
    public $filter;

    public function log_db_errors( $error, $query )
    {

        if( MY_DEBUG )
        {
            echo $message;
        }
    }


    public function __construct()
    {
        global $connection;
        mb_internal_encoding( 'UTF-8' );
        mb_regex_encoding( 'UTF-8' );
        $this->link = new mysqli( MY_HOST, MY_USER, MY_PASS, MY_DB );
        $this->link->set_charset( "utf8" );

        if( $this->link->connect_errno )
        {
            $this->log_db_errors( "Connect failed", $this->link->connect_error );
            echo 'Server error. Please try again sometime. DB';
            exit();
        }
    }

    public function __destruct()
    {
        $this->disconnect();
    }

    public function filter( $data )
    {
        if( !is_array( $data ) )
        {
            $data = trim( htmlentities( $data ) );
            $data = $this->link->real_escape_string( $data );
        }
        else
        {
            $data = array_map( array( 'DB', 'filter' ), $data );
        }
        return $data;
    }

    public function query( $query )
    {
        $full_query = $this->link->query( $query );
        if( $this->link->error )
        {
            $this->log_db_errors( $this->link->error, $query );
            $full_query->free();
            return false; 
        }
        else
        {
            $full_query->free();
            return true;
        }
    }

    public function my_table_exists_create( $table,  $variables = array() ) {
        $check = $this->link->query("SELECT * FROM '$table' LIMIT 1");        
        if( $check ) return true;           
        else {
            if( empty( $variables ) ) {
                return false;
                exit;
            }

            $sql = "CREATE TABLE IF NOT EXISTS ". $table;
            $fields = array();
            $values = array();
            foreach( $variables as $field ) {
                $fields[] = $field;     //$values[] = "'".$value."'";
            }
            $fields = ' (' . implode(', ', $fields) . ')';      
            $sql .= $fields;
            $query = $this->link->query( $sql );

            if( $this->link->error ) {
                $this->log_db_errors( $this->link->error, $sql );
                return false;
            }
            else return true;
        }
    }

    public function my_num_rows( $query )
    {
        $num_rows = $this->link->query( $query );
        if( $this->link->error )
        {
            $this->log_db_errors( $this->link->error, $query );
            return $this->link->error;
        }
        else
        {
            return $num_rows->num_rows;
        }
    }

    public function exists( $table = '', $check_val = '', $params = array() )
    {
        if( empty($table) || empty($check_val) || empty($params) )
        {
            return false;
            exit;
        }
        $check = array();
        foreach( $params as $field => $value )
        {

            if( !empty( $field ) && !empty( $value ) )
            {
                if( $this->db_common( $value ) )
                {
                    $check[] = "$field = $value";   
                }
                else
                {
                    $check[] = "$field = '$value'";   
                }
            }

        }
        $check = implode(' AND ', $check);

        $rs_check = "SELECT $check_val FROM ".$table." WHERE $check";
        $number = $this->my_num_rows( $rs_check );
        if( $number === 0 )
        {
            return false;
        }
        else
        {
            return true;
        }
        exit;
    }


    public function disconnect()
    {
        $this->link->close();
    }

}
我使用该类管理所有查询,如插入数据库:

    $database = new DatabaseConnection();   
    $Item_Details = array(
        'item_title' => trim($_POST['title']),
        'item_content' => trim($_POST['content']),
        'item_updated' => date('Y-m-d H:i:s'),
        'item_updatedby' => $my_loginid,
    );
    $where_clause = array('itemid' => $itemid);
    $updated = $database->as_update( 'my_item', $Item_Details , $where_clause, 1 );
现在我需要知道,我可以使用这个类,而不需要太多的连接,这会减慢到服务器的连接,从而导致超时和连接太多。我想我可以用一个全局变量

function my_constant_initialize()
{
   global $databasecon;
   $databasecon = new DatabaseConnection();
   return $databasecon;
}

因此,请建议如何避免太多的连接。另外还要告诉我是否有必要为每个查询实例化数据库类,或者我可以只调用一次,因为我在php代码中使用了很多Include和require函数。

在OOP php中,达到MySQL数据库连接限制很难,因为如果脚本完成,它会破坏连接对象。为了安全起见,在类中使用析构函数,并在脚本末尾取消设置对象。如果你真的担心达到连接上限,你可以进入MySQL,将最大连接限制从我认为的1000修改为更高,并增加缓冲池


此外,您可能会考虑将语言切换为类似Java的语言,Java有一种称为“连接池”的技术,比PHP的版本工作得更好。不,这与p_connect或PHP中的任何东西不同。

至少您不必每次调用类时都启动连接

要了解如何使用数据库类而不必每次都实例化它,我们需要了解更多的代码。前面已经提到的
单例模式是一条可行之路,但是如果不知道您实际上是如何编程的,就很难判断它是否真的会改进您的代码

这将类的实现显示为
singleton

class DatabaseConnection {

    protected static $instance = null;
    private $link;
    public $filter;

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    protected function __construct() {
        global $connection;
        mb_internal_encoding( 'UTF-8' );
        mb_regex_encoding( 'UTF-8' );
        $this->link = new mysqli( MY_HOST, MY_USER, MY_PASS, MY_DB );
        $this->link->set_charset( "utf8" );

        if( $this->link->connect_errno )
        {
            $this->log_db_errors( "Connect failed", $this->link->connect_error );
            echo 'Server error. Please try again sometime. DB';
            exit();
        }
    }

    protected function __clone() {

    }

    // add your other methods

}
您可以使用

$databasecon = DatabaseConnection::getInstance();
通过这种方式实现,当您调用
getInstance
时,它会检查连接是否已经初始化,以便您可以重用它


您将
\u construct()
设置为
protected
,以便在不使用
getInstance()
方法的情况下无法调用该类,这与
\u clone()
的方法相同

我不知道我是否理解,但是为了使用你的类的单个实例,你可以使用Singleton模式。Andreas你能告诉我Singleton模式是什么时候你的类第一次检查实例是否已经存在,如果已经存在,那么类将返回该实例而不是创建一个新实例。其实很简单,只要在网上搜索实现就可以了。看看这个问题的答案——修改连接限制永远都不是解决办法。不要提高这个限制,要有一定数量的进程连接到MySQL。拥有一个析构函数对你这个想象中的类没有任何作用。切换语言以进行连接池是您能给出的最糟糕的建议。另外,PHP有连接池,我相信其中一个是您的观点,但对我来说,我选择只使用PHP Hae Phillip,我已经更新了我的帖子,以显示数据库连接的代码