2015-01-08 42 views
4

所以我有多種功能完成不同的查詢,例如PHP文件:PHP - 與SQL多種功能查詢

function getUserEmail($name) 
{ 
    $link=getLink(); 
    $name=mysqli_real_escape_string($link, $name); 
    $output=mysqli_fetch_array(mysqli_query($link, "SELECT email FROM users WHERE name='$name';")); 
    mysqli_close($link); 
    return $output[0]; 
} 

function getUserName($id) 
{ 
    $link=getLink(); 
    $id=mysqli_real_escape_string($link, $id); 
    $output=mysqli_fetch_array(mysqli_query($link, "SELECT name FROM users WHERE id='$id';")); 
    mysqli_close($link); 
    return $output[0]; 
} 

function getLink() 
{ 
    $link = mysqli_connect('localhost', 'myUser', 'myPass'); 
    mysqli_select_db($link, 'myDB'); 
    if (!$link) die(mysqli_error($link)); 
    return $link; 
} 

(此代碼可能無法正常工作,這只是一個例子)

我它的做法與上面的例子類似,但我認爲,因爲在頁面重新加載時調用了許多函數,所以多個DB鏈接創建和關閉並不是最有效的進行方式(並且由於多個功能而開始滯後添加到我的項目)。

Ny認爲是:在PHP的頭部創建$鏈接到數據庫並將其保存到$ _POST var(如$ _POST ['link']),然後通過代碼使用它,並關閉它在頁腳上。

這將阻止多個鏈接創建和關閉,我認爲會提高性能。

有什麼想法?

+0

請確保您在某些時候清理了傳遞的變量。 – Rimble

回答

1

如果這些功能是一類

的一部分,您可以包括您處理數據庫連接__construct()和「__destruct()'功能。例如:

<?php 
    class account { 
    protected $link; 

    function __construct() { 
     $link=getLink(); 
    } 

    function __destruct() { 
     mysqli_close($link); 
    } 

    function getUserEmail($name) 
    { 
     $name=mysqli_real_escape_string($link, $name); 
     $output=mysqli_fetch_array(mysqli_query($link, "SELECT email FROM users WHERE name='$name';")); 
     return $output[0]; 
    } 

    function getUserName($id) 
    { 
     $id=mysqli_real_escape_string($link, $id); 
     $output=mysqli_fetch_array(mysqli_query($link, "SELECT name FROM users WHERE id='$id';")); 
     return $output[0]; 
    } 

    function getLink() 
    { 
     $link = mysqli_connect('localhost', 'myUser', 'myPass'); 
     mysqli_select_db($link, 'myDB'); 
     if (!$link) die(mysqli_error($link)); 
     return $link; 
    } 
    } 

這樣您就不必擔心重新打開連接並關閉連接。連接會在創建帳戶對象時自動打開,並且在不再引用帳戶對象時它會自動關閉。

閱讀更多關於constructors and destructors here

此外,正如評論中所建議的那樣,您可以包含一個廣泛的getUser()方法,以便您不必在數據庫中查詢所有用戶的單獨條目。它會減少與數據庫交互的次數,並且是處理數據的更有效方式。像這樣:

function getUser($id) 
{ 
    $id=mysqli_real_escape_string($link, $id); 
    $output=mysqli_fetch_array(mysqli_query($link, "SELECT * FROM users WHERE id='$id';")); 
    return $output; 
} 
+0

這也是一個好方法,但我不使用OOP,而是使用程序代碼。 – DarkW

+0

我假定你仍然有一些初始功能,或者甚至是加載主頁內容的主要功能。在這個函數中,你可以調用'getLink()'並將其作爲全局變量賦值給'$ link',這將是一個類似的概念。 – Wold

+2

好吧,但我不會做你正在做的事......你應該只有一個名爲'getUser'的函數返回用戶數據數組,然後通過鍵訪問它。它很愚蠢地繼續擊中每個信息的DB。 – prodigitalson

1

使用全局

$link=false; 
function getLink() 
    { 
     global $link; 
     if (!$link) { 
     $link = mysqli_connect('localhost', 'myUser', 'myPass'); 
     mysqli_select_db($link, 'myDB'); 
     if (!$link) die(mysqli_error($link)); 
     } 
     return $link; 
    } 

這種方式,getLink()第一個呼叫建立連接,以及所有後續調用簡單地重新使用由第一個呼叫建立連接。進行此更改後,您可以保留其餘代碼相同。能夠使用OOP我認爲實際上是使用mysqli而不是mysql的一大好處,但如果您不想使用OOP,則應該爲您執行此操作。

+0

好主意,可能會使用它。 – DarkW