2012-12-24 64 views
6

我有一個從mysql_ *傳遞給mysqli面向對象的小問題。

的index.php文件的結構類似,包括兩個文件:

include('connect.php'); 
include('function.php'); 

的connect.php文件中包含:

<?php 
$mysqli = new mysqli("localhost", "root", "test", "test"); 

if (mysqli_connect_errno($mysqli)) { 
    printf("Connection failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 
?> 

function.php文件存在函數稱爲showPage不採用參數,但使用$ mysqli的連接,像線...

$result = $mysqli -> query("SELECT * FROM $table ORDER BY ID DESC"); // Seleziono tutto il contenuto della tabella 

我不能管理它的工作沒有傳遞給函數的$ mysqli的變量,但是這是沒有必要的,當我用mysql_ *棄用的功能!

我能理解爲什麼,以及解決此問題的最佳方法是什麼?

+0

@Wired一旦你刪除你的密碼,然後probablu你仍然使用它 – iamart

+1

至於說,這是一箇舊的數據庫之前(在本地太),我就可以了測試。但我仍然不希望我的數據全部寫在網頁上= P它無論如何困擾我 – wiredmark

回答

7

用戶定義的函數在PHP中有自己的變量作用域。您需要將$mysqli作爲參數傳遞給函數,或者使用global $mysqli啓動函數。

此確切的問題是給定爲Variable scope頁上的示例:

然而,本地函數範圍 引入用戶定義的函數內。在函數內部使用的任何變量默認爲 ,侷限於本地函數作用域。 例如,此腳本不會產生任何輸出 ,因爲echo語句引用$ a變量的本地 版本,並且在此範圍內尚未分配值 。您可能會注意到,這與C語言有點不同 ,因爲C中的全局變量自動爲 可用於函數,除非被本地 定義明確覆蓋。這可能會導致一些問題,人們可能會無意中更改全局變量 。在PHP中,全局變量必須 在函數內聲明爲全局函數,如果它們將在 函數中使用。

<?php 
$a = 1; /* global scope */ 

function test() 
{ 
    echo $a; /* reference to local scope variable */ 
} 

test(); 
?> 
+0

全局變量是邪惡的xD,但你是最好的答案。我習慣了C,這就是爲什麼我無法得到的。此時我更喜歡每次將變量作爲參數傳遞。謝謝。 – wiredmark

+1

在這種情況下,全局變量是國際海事組織一個完全有效的和可以理解的設計模式。畢竟,數據庫連接對象是應用程序中的全局對象。但是,我會將mysqli對象包裝在您自己創建的用戶對象中,並在全局範圍內使用此對象,因爲這樣可以根據需要靈活地進行改進/升級,而無需對應用程序進行大規模更改。 –

0

不能管理它的工作沒有傳遞給函數的$ mysqli的變量,但是這是沒有必要的,當我用mysql_ *棄用的功能!

這是不是真的正確。即使是在老mysql_*功能你實際上必須通過鏈路標識符,如果你需要指定你與數據庫連接,例如其中:

$result = mysql_query($sql, $link); 

而且這個例子說明,你必須傳遞下去也是$result。如果你沒有留出了$link參數:

$result = mysql_query($sql); 

MySQL擴展並在內部尋找上次使用的連接。如果本來沒有找到,它會創建一個新的使用在php.ini中設置的參數。這只是你的信息,以更好地理解爲什麼和如何這工作了過去。

0

你也可以使用連接池,這是值得檢查this出來。

$mysqli = new mysqli('p:localhost', 'username', 'password', 'db_name'); 
相關問題