2015-10-05 85 views
0

我试图做一个简单的SQL类。 只是有一个问题:PHP类 - 如何连接到数据库只有一次

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]; 
    mysqli_close($link); 
} 

现在,我怎样才能连接到SQL只有一次,并添加像“的dbupdate”功能,“dbInsert”和“dbRead”不用每次都连接到数据库?

对于团队协调连接也是一样。

这里的示例:

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

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

+2

一件事,你不能混用'mysqli_'是'mysqli_close($ link);'用你的'mysql_'函数蒸发散。 –

+2

,不要'mysqli_close($ link);'所以你不必再打开它 –

+0

@ Fred-ii-,我解决了它。 – TheCodingBook

回答

1

首先,你根本不应该使用mysql_ *函数。它们已被弃用且使用危险。 Buth有趣地说,你可以使用全局变量。

定义你的连接在函数之外(在全局范围内),然后用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); 
} 

编辑...

我没有太仔细阅读本。我看到你正在上课,所以全局变量不是最好的选择。考虑这个..

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); 
    } 
} 
+0

这是否也适用于团队联系? :) – TheCodingBook

+0

呃,是的,我想如果你想重新编写图书馆的话。我对那个图书馆不熟悉,所以我不能告诉你最好的办法来处理这个问题。 –

+0

我会使用这个作为文件顶部(功能外)并将其链接到它,它应该工作。 通过这种方式,我可以在文件的顶部使用require_once,对吗? – TheCodingBook

0

随着PHP文件说,有关数据库永久连接(http://php.net/manual/en/features.persistent-connections.php):

PHP解释器的实例被创建和销毁,每 页面请求(PHP页面)到您的Web服务器。因为在每次请求后销毁它 ,所以它获取的任何资源(如 指向SQL数据库服务器的链接)在销毁时都会关闭。在 这种情况下,你不会从试图使用持久连接 获得任何东西 - 它们根本不会持续。

如果你想要更有效地重用代码,那么做OOP的方式是关键。

我可能会想到一个更好的解决方案后,但我希望做的是使用类成员来存储指向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(类似于依赖注入)会很棒,但如果不是这样,无论如何,您可以始终实例化您创建的类,甚至将该对象存储在$ _SESSION变量中。

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

4

因为每个人都在折腾他们的OOP成环(注意:我要做的PDO,因为我更了解它,但原理是一样的,只是替代连接)

<?php 
class DatabaseConnection 
    { 
     # Create a singleton to store the connection for reuse 
     private static $singleton, 
         $con; 
     # save connection to singleton and return itself (the full object) 
     public function __construct() 
      { 
       # If your singleton is not set 
       if(!isset(self::$singleton)) 
        # assign it this class 
        self::$singleton = $this; 
       # return this class 
       return self::$singleton; 
      } 
     # This is a connection method because your __construct 
     # is not able to return the $pdo connection 
     public function connection($host='hostname',$username='username',$password='password',$database='database') 
      { 
       # In the connection, you can assign the PDO to a static 
       # variable to send it back if it's already set 
       if(self::$con instanceof \PDO) 
        return self::$con; 
       # If not already a PDO connection, try and make one 
       try { 
         # PDO settings you can apply at connection time 
         $opts = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::ATTR_EMULATE_PREPARES => false); 
         # Assign your PDO Conneciton here. 
         self::$con = new PDO("mysql:host={$host};dbname={$database}",$username,$password,$opts); 
         # Return the connection 
         return self::$con; 
        } 
       catch (PDOException $e){ 
         exit('Database error'); 
        } 
      } 
    } 

你可以在任何地方使用它,内外函数,类,你的名字它。它会每次都返回相同的连接。如果您使用带自动加载功能的spl_autoload_register(),则您将全部设置,甚至不必每次都明确使用require_once()

<?php 
require_once('class.DatabaseConnection.php'); 
// Instantiate connection class 
$pdo = new DatabaseConnection(); 
// Assign the connection to $con (or whatever variable you like) 
$con = $pdo->connection(); 

一个值得注意的问题,singleton模式一般很少使用。通常最好使用new Objects()而不分配singleton。但我个人喜欢singleton这个用途。



简单的演示 - 考虑这种情况:

<?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(); 

singleton的上述使用会产生:

NEW Object 
SAME Object 
SAME Object