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

时间:2017-01-07 10:15:46

标签: php mysql

我有一个用于管理所有数据库查询的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函数。

2 个答案:

答案 0 :(得分:-1)

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

此外,您可能会考虑将语言切换为类似Java的语言,这种技术称为“#34;连接池”。"比PHP的版本更好用。不,这与p_connect或PHP中的任何内容都不相同。

答案 1 :(得分:-1)

每次打电话给你的班级时,至少你不必启动连接。

要了解如何使用数据库类而不必每次都实例化它,我们需要查看更多代码。已经提到的singleton模式是可行的方法,但很难判断它是否会真正改善你的代码而不知道你是如何实际编程的。

这会将您的课程实施显示为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时,它会检查连接是否已经初始化,以便您可以重复使用它。

您将__construct()设置为protected,因此如果不使用getInstance()方法,则无法调用该类,__clone()也是如此。