2012-06-09 64 views
2

我讀過很多關於這個問題的東西,但是我仍然無法修復它。PHP未定義的變量在函數和包含的腳本

在我的函數文件我聲明一個變量,象這樣的值:

$px_host = "localhost"; 

而且我有像這樣一個數據庫查詢功能:

function dbQuery($database, $reqquery){ 
if(!$connect = mysql_connect($px_host, $px_dbuser, $px_dbpass)){ 
    exit("Error - cannot connect to MySQL server - " . mysql_error()); 
} 

if(!$database = mysql_select_db($database)){ 
    exit("Error - cannot select database - " . mysql_error()); 
} 

if(!$query = mysql_query($reqquery)){ 
    exit("Error - query error."); 
} 

return $query; 
} 

每當我嘗試運行函數,我收到一個'未定義的變量'錯誤。我已經嘗試將變量設置爲全局,但它仍然表示它是未定義的。它們在同一個文件中,變量在函數之前被定義和設置。

(我不好解釋,所以試試看吧) 包含dbQuery()的文件包含在另一個文件中。在另一個文件中,有一個使用dbQuery()來獲得某些信息的功能。是否有可能因爲它是從第一個文件開始運行的,該變量超出了範圍?

+2

每次您想要發送SQL查詢時重新連接是一個壞主意。代碼中的前兩個操作應該只在腳本開始時執行一次。除此之外,考慮使用'mysqli'或'PDO',它們比舊的'mysql'擴展更好 - 它們支持例如準備好的語句(比轉義更好,更安全)。 – ThiefMaster

+0

好的,我已經採納了所有的建議,並且正在研究OOP。感謝所有的幫助! – ToshNeox

回答

3

的神奇世界在您的特定情況下,你應該函數內聲明全局的功能之外的所有變量。所以

function dbQuery($database, $reqquery){ 
    global $px_host,$px_dbuser,$px_dbpass; 
    // rest of function 
} 

但你的代碼可以改進:你應該在你的腳本

define('DB_HOST','localhost'); 
define('DB_USER','user'); 
define('DB_PASS','pass'); 

的開頭定義常量和使用功能(所以沒有必要宣佈全球內部常量,它的更多的邏輯因爲主機,用戶和傳遞不是可變的,而是常量)。

您應該在流程開始時僅在數據庫連接一次,因此函數dbQuery僅執行查詢(根據函數名稱)。

編輯答案的完整性:

正如一些網友說你在其他的意見,我請你閱讀php doc for mysql_connect,看到了紅色的提醒:

這個擴展的使用氣餒。相反,應該使用MySQLi或PDO_MySQL擴展。另請參閱MySQL:選擇API指南和相關FAQ以獲取更多信息。替代該功能包括:

我不是在這裏說,你必須在你的項目做什麼,但閱讀文檔和遵循的竅門/建議是爲您的項目的成功至關重要。 :)

-3

如果設置變量global,則還需要在函數中將其設置爲全局變量。在這種情況下:

$px_host = "localhost"; 

function dbQuery($database, $reqquery){ 
    global $px_host; 
    if(!$connect = mysql_connect($px_host, $px_dbuser, $px_dbpass)){ 
     exit("Error - cannot connect to MySQL server - " . mysql_error()); 
    } 

    if(!$database = mysql_select_db($database)){ 
     exit("Error - cannot select database - " . mysql_error()); 
    } 

    if(!$query = mysql_query($reqquery)){ 
     exit("Error - query error."); 
    } 

    return $query; 
} 

這應該解決這個問題。

+2

函數外的'global'語句什麼也不做 - 你只需要在函數中導入一個全局變量。 – ThiefMaster

+0

實際上,這是正確的,但不應該在函數外的變量上使用「全局」。它不用於聲明全局變量;他們默認是全球性的。 – Atli

+0

感謝您的通關和修復。 :) –

1

這是遲到了,所以這只是一個部分的答案。

你可以採取的另一種方法是將數據庫實例傳遞給你的幫助函數,從而解決憑證問題。

function dbQuery($database, $reqquery) 
{ 
    if (false !== ($query = mysql_query($reqquery, $database))) { 
     exit("Error - query error."); 
    } 

    return $query; 
} 

現在,這個功能會通過接收參數的依賴,也短了很多,並沒有連接/查詢/斷開每次。

剩餘的代碼必須寫在其他地方;如果你在每一個頁面需要一個數據庫,你可以寫這個漂亮的高環比上漲:

if (false === ($connect = mysql_connect($px_host, $px_dbuser, $px_dbpass))) { 
    exit("Error - cannot connect to MySQL server - " . mysql_error()); 
} 

if (false === mysql_select_db($database)) { 
    exit("Error - cannot select database - " . mysql_error()); 
} 

然後,你將$connect無論周圍是必需的。

$res = dbQuery($connect, 'SELECT "hello world"'); 

當然,mysql_connect和朋友使用隱含的連接,所以你在技術上不需要反正通過它周圍;儘管如此,這是一個很好的模式。

最後但並非最不重要

瞭解如何使用PDO和陶醉在OOP ;-)