2012-02-24 35 views
1

讓我們創建一個很簡單的例子文件:我是否需要在每個定義的函數中建立另一個數據庫連接?

index.php

<?php 

$connection = mysqli_connect('localhost', 'user', 'pass', 'db'); 
// connection established successfully 

echo 'doing something here for like 500 lines of code'; 

include('functions.php'); 
echo countCTR(12, 15); 

?> 

現在的問題是functions.php

<?php 

function countCTR($input1, $input2){ 
    /* in this function I need my database connection ($connection) 
     which was established already in index.php before this 
     file was included. however, the $connection isn't open 
     inside this function. Do I have to execute mysqli_connect 
     inside every function I define? 
    */ 
} 

?> 
+3

將該連接作爲函數的附加參數傳遞 – 2012-02-24 11:16:08

+0

@MarkBaker:我相信我已經嘗試過了,它不起作用。 – 2012-02-24 11:24:04

+0

您必須檢查$ connection是否爲NULL,如果是,則必須在每個方法內調用mysql_connect()。這就是爲什麼我建議使用mysql_pconnect()調用 - 所以你不必做檢查......正如我在下面寫的,如果存在,mysql_pconnect()將重新使用你先前建立的連接,如果不存在,它將使另一個。 – DejanLekic 2012-02-24 11:26:45

回答

-1

你不應該。
只需使用global關鍵字。

function countCTR($input1, $input2){ 
    global $connection; 
} 
+0

全局變量?! – 2012-02-24 12:27:15

+0

@Blowski:OP正在使用全局變量。 – MrWhite 2012-02-24 13:00:38

-1

使用mysql_pconnect()功能,你會沒事的。該函數重新使用已建立的數據庫連接。

編輯1:如Mark建議的,一個更好的選擇是將$connection作爲參數傳遞給您的函數。我當然反對使用全局變量,除非真的需要。這被認爲是一種糟糕的編程習慣,只會讓你頭疼。

編輯2:你有三個選擇:

  1. 檢查$連接是NULL,如果是,錯誤退出,由Mensur的建議。如果它不爲null,那麼通過將$ connection作爲參數傳遞給使用數據庫的函數,可以在整個腳本的其餘部分可靠地使用它。

  2. 再次檢查$ connect是否爲NULL,如果不是,則將其用作函數中的全局變量。我反對這種做法,請參閱編輯1爲什麼。

  3. 使用mysql_pconnect()函數,它將創建一個持久連接,並且如果已建立,則以後對mysql_pconnect()的調用將使用相同的連接。

+0

這是完全偏離的問題 – 2012-02-24 11:20:32

+0

謹慎闡述爲什麼,並證明你是對的? – DejanLekic 2012-02-24 11:23:56

+0

我應該嗎?它是*你*想出了答案*你無法證明*。 (並錯過了一英里)。仔細閱讀你提供的鏈接應該給你足夠的證據。 – 2012-02-24 11:33:12

-1

不,你沒有。僅夠創建一個連接就足夠了。 好主意是在另一個文件中創建數據庫連接,然後將其包含在index.php或任何其他文件中。

實施例: database.php中

<?php 
$con = mysql_connect("localhost","peter","abc123"); 
if (!$con) 
{ 
die('Could not connect: ' . mysql_error()); 
} 
?> 

實施例: 的index.php

<?php include("database.php");?> 

希望這有助於=)

+0

這並沒有幫助 - 即使我將每個功能的連接包含在內,我仍然一遍又一遍地建立連接。 – 2012-02-24 11:21:14

+0

您如何看待,是否有必要閱讀整個問題或只是標題就足夠了? – 2012-02-24 11:21:34

+0

我的不好,對不起...是快速回答:P – Mensur 2012-02-24 11:23:31

0

這說明here

有兩種選擇:使$ connection成爲全局變量,或者將它傳遞給方法。我更喜歡後者 - 全局變量讓我感到緊張。

要通過在連接,改變函數定義如下:

<?php 

function countCTR($input1, $input2, $connection){ 
    /* in this function I need my database connection ($connection) 
     which was established already in index.php before this 
     file was included. however, the $connection isn't open 
     inside this function. Do I have to execute mysqli_connect 
     inside every function I define? 
    */ 
} 

?> 

和index.php文件調用它,如下所示:

echo countCTR(12, 15, $connection); 

正如在評論中提到的,這是很好的練習思考失敗模式,並以結構化的方式處理異常。您發佈的示例代碼(以及我已經適應的代碼)在將其傳遞到函數之前不會檢查連接是否有效;它也不檢查連接在功能中是否仍然可用。

您需要確保您的錯誤處理策略處理此問題 - 但這與您的原始問題並不嚴格相關。

+0

他仍然必須檢查$ connection是否爲NULL,並且在它是...的情況下調用mysql_connect()...或者在第一次調用mysql_connect()連接無法建立之後退出並返回錯誤...也是一個很好的選擇。 – DejanLekic 2012-02-24 11:33:43

+0

@DejanLekic似乎你的意見(開發人員應該在每次mysql調用之前檢查連接)不會被其他人共享。 – 2012-02-24 11:42:41

+0

@ Col.Shrapnel:好的,他不檢查腳本是否已經建立(如Manus建議的那樣)。那麼他如何確定連接是否建立?他要麼做馬努斯寫的東西,要麼*有*要檢查!除了讓腳本失敗之外,還有其他的選擇嗎? – DejanLekic 2012-02-24 11:48:11

-1

爲此,您可以使用兩種方法 1.聲明你的$連接鏈路標識符作爲全球

<?php 
     global $connection = mysql_conect(....); 
     include_once 'yourfile.php'; 
     $functionReturnValue = CalledFunction($para1, $para2); 
    ?> 

現在你yourfile.php看起來就像

<?php 
    function CalledFunetion() 
    { 
     global $connection; 
     // Put rest of the code 
    } 
    ?> 
  1. 使用mysql_pconnect()功能

:)

相關問題