2017-05-09 133 views
1

所以我對PHP相當陌生,幾乎沒有問題。所以我有一個主要的索引頁面,其中包含頁眉和功能頁面。在索引頁的主體中,我調用了幾個函數。多功能數據庫連接功能

在我的頭包括,我有我的數據庫連接與索引頁面加載。在我的每個函數中,我都沒有調用一個新的數據庫連接,因爲我認爲頭文件中的數據庫連接將在我的函數運行時保持打開狀態。那麼即使數據庫連接在頭文件中打開,當調用一個需要數據庫訪問的函數時,我會收到錯誤消息(數據庫連接失敗)。

因此,我添加了一個數據庫連接到我的每個函數,它工作正常。我的問題是,我打開一個數據庫連接時,通過頁眉加載頁面。然後即時通信打開另一個連接時,每個函數被調用可能是3-5個數據庫連接調用在此頁面上。

這對我來說似乎並不高效。這是正確的方法(在每個函數內部調用一個連接)還是有解決方案/最佳實踐,這樣我就只打開每頁一個數據庫連接,而不管調用的函數的數量是多少?再次,當我從功能本身刪除連接,我得到一個失敗。我的連接功能如下:

function wm_connectToDatabase() { 
    $dbhost = "xxx"; 
    $dbuser = "xxx"; 
    $dbpass = "xxx"; 
    $dbname = "xxx"; 
    $dbconnection = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); 
    if(mysqli_connect_errno()){ 
     die("Connection Failed: ". mysqli_connect_error() ."(". mysqli_connect_errno() .")"); 
    } else { 
     echo "</br>Connection Success</br>"; 
    } 
    return $dbconnection; 
} 

所以我的頭文件在索引加載時調用這個函數。然後,我的每一個功能的再次調用它像這樣:

function fctn1($table){ 
    $db = wm_connectToDatabase(); 
    ...function stuff here... 
} 
function fctn2($table){ 
    $db = wm_connectToDatabase(); 
    ...function stuff here... 
} 

最初,我假定管連接就能滿足所有的功能,只要函數被調用一個網頁,曾在頭的連接上,但我發現這並非如此。我的功能只在im打開每個函數內的另一個連接時才起作用。我不確定爲什麼標題中的初始連接不會保持對我的頁面正文中的函數開放?感謝您的任何幫助。

同樣,當我從函數中刪除數據庫連接時,函數「失敗」,就好像沒有數據庫連接,即使我調用頭中的連接。謝謝。

+0

http://php.net/manual/en/language.variables.scope。PHP – aynber

+0

謝謝!這個頁面幫助我瞭解了很多範圍。 – user982853

回答

0

你的連接不保留,因爲$ dbconnection變量沒有被傳遞給你的其他功能。

你需要做這樣的事情在你的頭:

$db = wm_connectToDatabase(); 
在其他功能

然後,修改他們,使他們把你已經做了數據庫連接:

fctn1($table, $db); 

你也可以使用像這樣的全局變量:

function fctn1($table){ 
    global $db; 
} 
+0

確定這似乎工作。有沒有任何服務可以告訴你網頁連接到互聯網的時間或者查詢的次數?類似於用於頁面加載時間的pingdom?只是想確保我的頁面和全局工作正常。謝謝。 – user982853

0

您正在處理Variable Scope

在PHP函數中,不存在對「外部世界」的引用。

$bar = 'foo'; 

function sayThis() { 

    echo $bar; // $bar is empty/uninitialized, prints nothing 
} 

function sayItReally() { 

    global $bar; // tell PHP you plan to reference the outside world 
    echo $bar; // this will work 
} 

然而,這是一個廣泛的主題,該簡化的例子只是爲了打破僵局,解決您的眼前問題。你真的應該閱讀有關範圍,因爲這可以咬你在除了你的數據庫連接更多的地方...