2017-02-20 139 views
-1

我有下面的代碼使用include /需要連接數據庫

//dsn.php 

//Object Oriented way 
$servername = "localhost"; 
$username = "root"; 
$password = "password"; 
$dbname = "database"; 

//check connection 
$conn = new mysqli($servername, $username, $password, $dbname); 

if($conn->connect_error) { 
    die("could not connect:".$conn->connect_error); 
} 

//index.php 

include 'dsn.php'; 

function a() { 
    $sql = "sql command"; 
    $result = $conn->query($sql); 
    //working 

    $conn->close(); 
} 

function b() { 
    $sql = "sql command"; 
    $result = $conn->query($sql); 
    //not working 

    $conn->close(); 
} 

這將顯示警告和通知,上面寫着:

警告:mysqli的查詢::( ):無法取得mysqli
注意:試圖取得非物件的財產
警告:mysqli的:: close()方法:無法獲取的mysqli

但是這一個工程:

include 'dsn.php'; 

function a() { 
    $sql = "sql command"; 
    $result = $conn->query($sql); 
    //working 

    $conn->close(); 
} 

function b() { 
    include $dsn.php 
    $sql = "sql command"; 
    $result = $conn->query($sql); 
    //working 

    $conn->close(); 
} 

如何只使用一個包含文件DSN和其它功能重複使用?

編輯 對不起,我忘了提

function a($conn) {} 
function b($conn) {} 

我傳遞的變量$康恩,但它仍然會顯示警告,注意我上面

+0

不太確定你的意思。但你可以做到這一點。在每個函數中,使$ conn成爲全局變量,如全局$ conn; – Akintunde007

+0

不確定,但我也認爲關閉連接必須在另一個操作之前重新連接,所以如果關閉$ conn();比在b()中的查詢之前必須重新連接。不是嗎? –

回答

0

提到當你有一個文件,你可以想象在後臺它只是將該代碼複製粘貼到當前文檔中。

有2個問題,你的代碼...

  1. $conn變量是不是在裏面scope功能ab
  2. 即使它在範圍內並且可以訪問,您將在每次查詢後關閉連接。更好的方法是打開連接,運行所有查詢並在不再需要時關閉連接。

你給的作品,因爲它是創建一個新的變量$connb()內,但這並不是理想的,因爲它會在您每次執行該函數時創建一個新的數據庫連接代碼的第二件。

像這樣的東西可能會滿足您的需求:

include 'dsn.php'; 

function a($conn) { 
    $sql = "sql command"; 
    $result = $conn->query($sql); 
    return $result; 
} 

function b($conn) { 
    $sql = "sql command"; 
    $result = $conn->query($sql); 
    return $result; 
} 

$aResult = a($conn); 
$bResult = b($conn); 

$conn->close(); 

請注意,我們只包括「dsn.php」一次,然後繞過現有的連接到需要它的功能。

+0

感謝您的信息虐待這個:) –

+0

沒問題。僅供參考我剛剛刪除了我偶然留下的一些線條。 –

+0

感謝這個方法:) :) –

-1

這很簡單。在頁面加載時,會包含連接文件,這使得連接對象可用於其餘代碼。 $connfunctiona()使用,然後在函數結束時關閉。 $conn->close();銷燬數據庫連接對象意味着,$conn不再是對象,因此它不應被視爲對象。但Function b()將它視爲數據庫連接對象並導致錯誤。

但是,如果您再次包含連接文件,在功能b()內部,則$conn將變爲可用於本地對象的功能。並且應該如此。

在您處理數據庫之前,請不要關閉任何函數上的$conn()

function a() { 
    incDbConnectionFile(); 
    $sql = "sql command"; 
    $result = $conn->query($sql); 
    //working 

    $conn->close(); 
} 

function b() { 
    incDbConnectionFile(); 
    $sql = "sql command"; 
    $result = $conn->query($sql); 
    //working 

    $conn->close(); 
} 


function incDbConnectionFile() { 
    include 'dsn.php'; 
} 
+0

感謝您的信息,所以你的意思是說我應該繼續打開數據庫?有沒有什麼辦法可以關閉每個函數的數據庫? –

+0

如果您探索任何方法,那麼每次都包含連接文件,無論它是通過連接類創建的。因此每次都必須包含文件。但是你可以使用上面的更正來解決這個問題。 – Shubhranshu

+0

@Shubhranshu你的例子每次都會包含這個文件......你只是通過函數調用而不是直接包含它。取決於如何使用它,它可能會創建和關閉數百個連接,而不是僅使用單個連接,並在完成應用程序時關閉它。 –

相關問題