2012-10-27 10 views
2

我試圖將連接到數據庫的過程卸載到DBConfig.php文件,正如任何地方建議的那樣,因爲我需要重用幾個文件中的代碼。PHP Require()在父代碼範圍內不執行所需的文件

的建議總是被誣陷爲(編輯以反映我實際的代碼):

-------DBConfig.php------- 
<?php 
$link = mysql_connect('localhost','user','pass'); 
if (!$link) { 
    die('Not connected : ' . mysql_error()); 
} 
$db_selected = mysql_select_db('db_name'); 
if (!$db_selected) { 
    die ('Can\'t use db_name : ' . mysql_error()); 
} 
?> 

-------Parent.php------- 
<!DOCTYPE html> 
<?php 
require_once 'DBConfig.php'; 
$something = mysql_query("SELECT * FROM `table` LIMIT 0, 30 "); 
// This query works fine if the mysql_connect() and 
// mysql_select_db() stuff is in this script in place 
// of the require_once. 
$listofthings = array(); 
while($temp = mysql_fetch_array($something)){ 
    $listofthings[] = $temp; 
} 
// Do other things too 
?> 

但是,當我嘗試做mysql_fetch_array($something),它失敗的警告:mysql_fetch_array() expects parameter 1 to be resource, boolean given


記住,一切精美的作品,如果我只是下降的DBConfig.php內容到父腳本,而不是require 'DBConfig.php'; ...

還注意到print(require 'DBConfig.php'); //- 1(PHP函數返回一個1,表明它正在成功定位幷包含該文件,請參閱example 5)...

發生了什麼,以及如何解決該問題?我使用在Windows 7 x64上運行的WAMPServer(Apache 2.4.2,PHP 5.4.3)的默認配置。

+4

幾件事情很快:您應該使用'<?php'標籤而不是短標籤。而且,避免使用'mysql_ *'函數,因爲它們已被棄用。 – Prasanth

+0

你嘗試在mysql_query()函數調用後包含文件嗎? – ioseb

+0

當沒有結果時,'mysql_fetch_array'返回'false'。這可能解釋'布爾給定'部分。你檢查行是否被返回? –

回答

3

如果

require 'DBConfig.php'; 

字面上你在做什麼,也絕對沒有辦法的腳本可以在其他一些範圍內執行。如果您使用的是網址爲http://的網址,那麼這將是原因,但如果您使用的是相對路徑,則不會如您所願。

在連接到數據庫之後或在調用mysql_query()之後,您沒有進行任何錯誤檢查,所以更有可能只是查詢中斷。添加適當的錯誤檢查到您的查詢,你會知道更多。

另一種可能性是如果您在函數內部調用DBConfig.php。函數會混淆你的包含範圍。但在你的例子中沒有,所以我認爲這不是問題。

+0

我會編輯這個問題,因爲我實際上在做錯誤檢查......我只是不想佔用更多的空間比我已經是(問題是令人厭惡的巨大的眼睛,因爲它是)。 – joequincy

+0

我還應該提到,我相信DBConfig代碼是在不同的範圍內執行的,因爲如果我將回車添加到它的末尾: 'return「嘿,我返回了一些東西。」;' 然後我嘗試使用該值: '$ retString = require'DBConfig.php'; echo $ retString; // - 1' $ retString _should_是返回值,不是1 ...所以我認爲PHP運行DBConfig.php,然後返回明文響應....也許我只是回答了我自己的問題。 – joequincy

+0

@jeiquincy如果上面的代碼是你的實際代碼,你沒有做適當的錯誤檢查。你的mysql_query調用似乎失敗了。使用mysql_error()來查看原因 - 這應該揭示一下情況 –

0

需要知道你在變量$ pretend_this_var_is_a_querystring中給出了什麼。 如果查詢失敗,通常會生成此錯誤。我們需要知道你在mysql_query()函數中傳遞了什麼字符串。 請檢查您的查詢字符串。

也在你的DBConfig.php。它應該是

$db_selected = mysql_select_db('db_name', $link); 
+0

我已經說過查詢工作正常,只要我輸入'mysql_connect()'和'mysql_select_db()'代替'require'。 – joequincy

+0

您是否嘗試在mysql中直接運行查詢作爲測試查詢? 因爲您顯示的錯誤通常在查詢返回false時生成。 – Bhavyanshu

+0

問題不在於查詢。問題是查詢之前的代碼沒有執行文檔應該的方式。如果我做'require_once'DBConfig。PHP的「; print($ link);'而不是獲取資源,我什麼也沒有得到。問題在查詢之前。 – joequincy

0

可能您的查詢有一些錯誤。嘗試 mysql_query($query) or die(mysql_error());

mysql_query()返回FALSE(boolean)出錯。

+0

「在牢記這一切精美的作品,如果我簡單地丟棄DBConfig.php的內容到父腳本,而不是'需要‘DBConfig.php’;'......」 – joequincy

0

如果這是確切的代碼,您正在使用,請改變:

require 'DBConfig.php'; 

到:

require('DBConfig.php'); 
+1

沒有嘗試這一點,但什麼都不做。無論如何,無論如何,因爲require是一個聲明,並且允許編碼人員將它作爲函數格式化的PHP只是相同​​功能的別名。 – joequincy

0

我認爲你有錯誤的文件。 (名稱相同,但位置不同)。

如果您希望DBConfig.php文件在同一目錄Parent.php嘗試做

require_once dirname(__FILE__).'/DBConfig.php'; 

當您包括您DBConfig.php文件,效果一定是相同的(你的情況),如果你複製並在您的parent.php文件中粘貼DBConfig的代碼。 如果不發生這種情況,那是因爲:

  • 您包含的文件不是您認爲的文件。 (其他文件夾中的一些set_include_path
  • 您包含的文件內容與您的想法不符。

沒有其他辦法。

+0

這兩個文件都在相同的位置。這就是爲什麼包含字符串中沒有斜線。 'require_once'DBConfig.php';'。此外,大寫是正確的。 – joequincy

+0

請...嘗試我的解決方案(添加'dirname(__ FILE __)。) –

+0

我以前試過這個。你還應該注意到,我在OP中提到'print(require'DBConfig.php');'是打印一個1,這意味着PHP已經找到幷包含一個文件(並且沒有其他文件的名稱甚至類似於'DBConfig.php'在我的系統上)。 – joequincy