2013-10-17 65 views
0

我有一個完美的作品一個PHP數據庫連接變量:不能訪問嵌套函數

$con = mysqli_connect("localhost","username","password","database"); 
$result = mysqli_query($con, $query); 

我還可以把它當作一個參數訪問它的功能:

function test($con, $args) { 
    $query10 = "select name from table where id = '$args[0]'"; 
    $result10 = mysqli_query($con, $query10); 
} 

test($con, array('value1','value2')); 

然而,當我嘗試訪問從由另一個函數調用的函數的連接:

mainFunction() { 
    test($con, array('value1','value2')); 
} 

我得到「faultCode0faultStringWarning:mysqli_query()期望參數1爲mysqli,null給出」。
將變量傳遞給mainFunction,然後傳遞給第二個函數,但它會創建非常不可讀的代碼,並且參數太多,因爲這同樣適用於其他所有變量。

所以我嘗試使用全局變量,但由於某些原因,他們不工作。運行

$a = 1; 
$b = 2; 

function Sum() 
{ 
global $a, $b; 

$b = $a + $b; 
} 

Sum(); 
echo $b; 

回報2,這使我懷疑的東西與PHP配置是錯誤的,因爲根據PHP文檔(http://php.net/manual/en/language.variables.scope.php)它應該返回3.

我怎樣才能得到全局變量工作還是有另一種方法來訪問嵌套函數的變量,而無需多次傳遞它們?

PHP版本是5.3.10-1ubuntu3.8,也安裝了Zend框架。如果您需要任何其他信息,請讓我知道。

+0

請參閱http://3v4l.org/dGpDl,代碼有效,所以您對該問題的前提是錯誤的。你既可以使用全局變量,也可以傳遞變量,沒有其他辦法。全球通常都會皺眉。你應該圍繞傳遞參數設計你的應用程序。 OOP可以在這裏幫助很多,而不是純粹的程序功能。 – deceze

+0

@deceze它永遠不會像OP在他的服務器上體驗到的那樣返回2 –

+0

@DanyP正確。 – deceze

回答

0

我的第一個建議是,你需要連接數組變量插入字符串

$query10 = "select name from table where id = '" . $args[0] . "'"; 

它更容易閱讀,你可以使用這個語法與字符串鍵以及像$args['myvar']

您的問題的最佳解決方案是將數據直接傳遞到您的功能,並具有您的功能return這些值。全球化你的變量可能有直接的作用,但你很容易失去你所做的事情的蹤跡,因爲你已經摧毀了變量的範圍。

function Sum($a, $b) { 
    return $a + $b; 
} 
$b = Sum($a, $b); 
1

我不知道爲什麼你的全局變量的測試沒有工作,也許有你不向我們展示了文件中的其它代碼,但全局變量通常被認爲是一個壞主意呢。

結構化程序設計的本質是,您可以在不依賴全局副作用的情況下分離出不同的任務和關注點。大量使用的全局變量對於調試非常棘手,並且很難用不同的實現來替換,因爲所有函數都希望能夠隨時抽出變量。

傳遞一個表示要使用的數據庫連接的對象是一種簡單的依賴注入形式,並且可以更輕鬆地執行單元測試等操作。

獲得數據庫連接還有其他方法,它們不如依賴注入那麼徹底,但比全局變量更容易更改。例如,您可以定義一個函數get_db_connection,它包含一個「有價值的靜態」,並在每次調用時返回相同的連接。或者對類中的靜態變量和方法進行相同的操作。