我是否需要为每个查询实例化Php数据库类?
我有一个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
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,我已经更新了我的帖子,以显示数据库连接的代码