2015-10-05 87 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