Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP类-如何只连接到数据库一次_Php_Class_Load - Fatal编程技术网

PHP类-如何只连接到数据库一次

PHP类-如何只连接到数据库一次,php,class,load,Php,Class,Load,我试着做一个简单的SQL类。 只有一个问题: function __classDBREAD($table, $where, $value, $back) { $link = mysql_connect('127.0.0.1','XXXX','XXXXXX'); mysql_select_db('XXXX', $link); mysql_set_charset('utf8'); $sql = "SELECT * FROM $table WHERE $wh

我试着做一个简单的SQL类。 只有一个问题:

function __classDBREAD($table, $where, $value, $back)
{
    $link = mysql_connect('127.0.0.1','XXXX','XXXXXX');
    mysql_select_db('XXXX', $link);
    mysql_set_charset('utf8');

    $sql = "SELECT * FROM $table WHERE $where = '$value' LIMIT 1";
    $result = mysql_query($sql, $link) or die(mysql_error());
    $row = mysql_fetch_assoc($result);
    return $row[$back];
    mysql_close($link);
}
现在,如何只连接到SQL一次,并添加诸如“dbUpdate”、“dbInsert”和“dbRead”之类的函数,而不必每次连接到数据库

teamspeak连接也是如此

这里有一个例子:

require_once                      ("lib/TeamSpeak3/TeamSpeak3.php");
    $ts3_VirtualServer              = TeamSpeak3::factory("serverquery://XXXXX:XXXX@127.0.0.1:10011/?server_port=XXXX");
    $__varTeamspeakClients          = $ts3_VirtualServer->clientList();
    $__intTeamspeakClientsOnline    = $ts3_VirtualServer["virtualserver_clientsonline"] - 1;
    $ts3_VirtualServer->request('clientupdate client_nickname='.$this->__classRndString(8));

同样的问题。当我将类包含到页面中时,如何只定义一次连接?

首先,您不应该使用mysql函数。它们已弃用,使用起来很危险。但是,夸张地说,你可以使用globals

在函数外部(在全局范围内)定义连接,然后使用
global
为函数提供访问权限。现在,您所要做的就是在所有需要它的函数中包含一个“全局”行

$link = mysql_connect('127.0.0.1','XXXX','XXXXXX');

function __classDBREAD($table, $where, $value, $back)
{
    global $link;
    mysql_select_db('XXXX', $link);
    mysql_set_charset('utf8');

    $sql = "SELECT * FROM $table WHERE $where = '$value' LIMIT 1";
    $result = mysql_query($sql, $link) or die(mysql_error());
    $row = mysql_fetch_assoc($result);
    return $row[$back];
    mysqli_close($link);
}
编辑…

我没有仔细阅读。我看到你在学习一门课,所以globals不是最好的选择。考虑这个…

class mydbclassthing {
    private $conn;
    public function __construct(){
        $this->conn = mysql_connect('127.0.0.1','XXXX','XXXXXX');
    }

    function __classDBREAD($table, $where, $value, $back)
    {
        $link = $this->con;
        mysql_select_db('XXXX', $link);
        mysql_set_charset('utf8');

        $sql = "SELECT * FROM $table WHERE $where = '$value' LIMIT 1";
        $result = mysql_query($sql, $link) or die(mysql_error());
        $row = mysql_fetch_assoc($result);
        return $row[$back];
        mysql_close($link);
    }
}

首先,您不应该使用mysql函数。它们已弃用,使用起来很危险。但是,夸张地说,你可以使用globals

在函数外部(在全局范围内)定义连接,然后使用
global
为函数提供访问权限。现在,您所要做的就是在所有需要它的函数中包含一个“全局”行

$link = mysql_connect('127.0.0.1','XXXX','XXXXXX');

function __classDBREAD($table, $where, $value, $back)
{
    global $link;
    mysql_select_db('XXXX', $link);
    mysql_set_charset('utf8');

    $sql = "SELECT * FROM $table WHERE $where = '$value' LIMIT 1";
    $result = mysql_query($sql, $link) or die(mysql_error());
    $row = mysql_fetch_assoc($result);
    return $row[$back];
    mysqli_close($link);
}
编辑…

我没有仔细阅读。我看到你在学习一门课,所以globals不是最好的选择。考虑这个…

class mydbclassthing {
    private $conn;
    public function __construct(){
        $this->conn = mysql_connect('127.0.0.1','XXXX','XXXXXX');
    }

    function __classDBREAD($table, $where, $value, $back)
    {
        $link = $this->con;
        mysql_select_db('XXXX', $link);
        mysql_set_charset('utf8');

        $sql = "SELECT * FROM $table WHERE $where = '$value' LIMIT 1";
        $result = mysql_query($sql, $link) or die(mysql_error());
        $row = mysql_fetch_assoc($result);
        return $row[$back];
        mysql_close($link);
    }
}

正如PHP文档所述,关于持久数据库连接():

每一个实例都会创建并销毁一个PHP解释器实例 对web服务器的页面请求(对于PHP页面)。因为它是 在每次请求后销毁它获取的任何资源(例如 SQL数据库服务器的链接)在销毁时关闭。在里面 在这种情况下,尝试使用persistent不会带来任何好处 连接——它们根本不存在

如果您希望更高效地重用代码,那么采用面向对象的方法是关键

稍后我可能会考虑一个更好的解决方案,但我要做的是使用类成员存储到SQL的链接,这样就不必每次都创建它们:

class MySQL {

    protected $mysql_link;
    protected $server = '127.0.0.1'; //and so on...

    public function __construct() {
       $this->link = mysql_connect($this->server,$this->user,$this->password);
       mysql_select_db($this->selected_db, $this->link);
       mysql_set_charset('utf8');
    }

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

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

}
现在,在应用程序的其余部分使用OOP(类似于依赖项注入)将非常棒,但如果不是这样,无论如何,您都可以实例化正在创建的类,甚至可以将该对象存储在$\u会话变量中


使用$object->link()将始终返回该实例的链接,而不是每次需要执行任何查询时都创建新的链接,

,正如PHP文档中关于持久数据库连接()所述:

每一个实例都会创建并销毁一个PHP解释器实例 对web服务器的页面请求(对于PHP页面)。因为它是 在每次请求后销毁它获取的任何资源(例如 SQL数据库服务器的链接)在销毁时关闭。在里面 在这种情况下,尝试使用persistent不会带来任何好处 连接——它们根本不存在

如果您希望更高效地重用代码,那么采用面向对象的方法是关键

稍后我可能会考虑一个更好的解决方案,但我要做的是使用类成员存储到SQL的链接,这样就不必每次都创建它们:

class MySQL {

    protected $mysql_link;
    protected $server = '127.0.0.1'; //and so on...

    public function __construct() {
       $this->link = mysql_connect($this->server,$this->user,$this->password);
       mysql_select_db($this->selected_db, $this->link);
       mysql_set_charset('utf8');
    }

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

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

}
现在,在应用程序的其余部分使用OOP(类似于依赖项注入)将非常棒,但如果不是这样,无论如何,您都可以实例化正在创建的类,甚至可以将该对象存储在$\u会话变量中


使用$object->link()将始终返回该实例的链接,而不是每次需要执行任何查询时都创建新的链接,

,因为每个人都在环中抛出OOP(注意:我将执行PDO,因为我更了解它,但原理是一样的,只需替换连接即可):

需要注意的是,
singleton
模式通常使用最少。通常,最好使用
新对象()
,而不为其指定
单例。不过,我个人喜欢使用
singleton



<强>简单演示-考虑此场景:>P/>

<?php
// Here is an example of the singlton with an echo
// which shows that the class is returning itself
// like a global
class DatabaseConnection
    {
        private static $singleton;
        public function __construct()
           {
                // If your singleton is not set
                if(!isset(self::$singleton)) {
                        echo 'NEW Object'.PHP_EOL;
                        // assign it this class
                        self::$singleton = $this;
                    }
                else
                    echo 'SAME Object'.PHP_EOL;
                // return this class
                return self::$singleton;
           }
    }

function ReturnConnection()
    {
        return new DatabaseConnection();
    }

class TestClass
    {
        public  function __construct()
            {
                new DatabaseConnection();
            }
    }

function query($sql=false)
    {
        return ReturnConnection();
    }

// The connection class wrapped in a function 
$a = ReturnConnection();
// The function nested inside a class
$b = new TestClass();
// The function nested inside another function
$c = query();

由于每个人都在将OOP抛入环中(注意:我将进行PDO,因为我更了解它,但原理相同,只需替换连接):

需要注意的是,
singleton
模式通常使用最少。通常,最好使用
新对象()
,而不为其指定
单例。不过,我个人喜欢使用
singleton



<强>简单演示-考虑此场景:>P/>

<?php
// Here is an example of the singlton with an echo
// which shows that the class is returning itself
// like a global
class DatabaseConnection
    {
        private static $singleton;
        public function __construct()
           {
                // If your singleton is not set
                if(!isset(self::$singleton)) {
                        echo 'NEW Object'.PHP_EOL;
                        // assign it this class
                        self::$singleton = $this;
                    }
                else
                    echo 'SAME Object'.PHP_EOL;
                // return this class
                return self::$singleton;
           }
    }

function ReturnConnection()
    {
        return new DatabaseConnection();
    }

class TestClass
    {
        public  function __construct()
            {
                new DatabaseConnection();
            }
    }

function query($sql=false)
    {
        return ReturnConnection();
    }

// The connection class wrapped in a function 
$a = ReturnConnection();
// The function nested inside a class
$b = new TestClass();
// The function nested inside another function
$c = query();

一方面,你不能把
mysqli\u混为一谈
mysqli\u关闭($link)
使用你的
mysql\u
函数。不要
mysqli\u关闭($link)这样您就不必打开它了again@Fred-我修正了它。如果你熟悉OOP,请查看一个
singleton
模式。看看你是否对此感兴趣(不过如果实现了,就不要使用太多…)。好吧,我想保留这个。那么,有没有办法连接到函数外部的DB并调用更新/选择/插入到函数中呢?首先,你不能将
mysqli\u
being
mysqli\u close($link)
使用你的
mysql\u
函数。不要
mysqli\u关闭($link)这样您就不必打开它了again@Fred-我修正了它。如果你熟悉OOP,请查看一个
singleton
模式。看看你是否对此感兴趣(不过如果实现了,就不要使用太多…)。好吧,我想保留这个。那么,有没有办法连接到函数外部的DB并调用它来更新/选择/插入到函数中?嗯,是的,如果你想重新编写库,我想会的。我对那个图书馆不熟悉,所以我不能告诉你最好的处理方法。你会吗